mirror of
https://github.com/GTA-ASM/SanAndreasUnity
synced 2024-11-25 21:40:19 +00:00
converting on-screen messages to uGUI
This commit is contained in:
parent
78319b501b
commit
394348745e
7 changed files with 189 additions and 51 deletions
|
@ -295,4 +295,7 @@ MonoBehaviour:
|
|||
m_Script: {fileID: 11500000, guid: 1c72eda03771ae74aa128f3c7218283a, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_drawMessages: 1
|
||||
messagePrefab: {fileID: 2694704631655002565, guid: 6d322e231f3455d48956d7437520a7c9,
|
||||
type: 3}
|
||||
messagesContainer: {fileID: 0}
|
||||
messagePoolSize: 10
|
||||
|
|
81
Assets/Prefabs/OnScreenMessage.prefab
Normal file
81
Assets/Prefabs/OnScreenMessage.prefab
Normal file
|
@ -0,0 +1,81 @@
|
|||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &2694704631655002565
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 8122135491475348229}
|
||||
- component: {fileID: 6596440728574097929}
|
||||
- component: {fileID: 7210735960633946770}
|
||||
m_Layer: 0
|
||||
m_Name: OnScreenMessage
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &8122135491475348229
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2694704631655002565}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0.5, y: 0.5}
|
||||
m_AnchorMax: {x: 0.5, y: 0.5}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 160, y: 30}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!222 &6596440728574097929
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2694704631655002565}
|
||||
m_CullTransparentMesh: 0
|
||||
--- !u!114 &7210735960633946770
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2694704631655002565}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
|
||||
m_RaycastTarget: 0
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
|
||||
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
m_FontData:
|
||||
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_FontSize: 17
|
||||
m_FontStyle: 0
|
||||
m_BestFit: 0
|
||||
m_MinSize: 1
|
||||
m_MaxSize: 40
|
||||
m_Alignment: 4
|
||||
m_AlignByGeometry: 0
|
||||
m_RichText: 1
|
||||
m_HorizontalOverflow: 0
|
||||
m_VerticalOverflow: 0
|
||||
m_LineSpacing: 1
|
||||
m_Text: New Text
|
7
Assets/Prefabs/OnScreenMessage.prefab.meta
Normal file
7
Assets/Prefabs/OnScreenMessage.prefab.meta
Normal file
|
@ -0,0 +1,7 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 6d322e231f3455d48956d7437520a7c9
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -7055,6 +7055,41 @@ MonoBehaviour:
|
|||
m_VerticalOverflow: 0
|
||||
m_LineSpacing: 1
|
||||
m_Text:
|
||||
--- !u!1 &6707687495432811311
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 8743615454504171472}
|
||||
m_Layer: 0
|
||||
m_Name: OnScreenMessagesContainer
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &8743615454504171472
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 6707687495432811311}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 7060217674643716524}
|
||||
m_RootOrder: 9
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!1 &6708427117946774985
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
|
@ -7630,6 +7665,7 @@ RectTransform:
|
|||
- {fileID: 7544529063945659150}
|
||||
- {fileID: 2222193836290576247}
|
||||
- {fileID: 122172316996072528}
|
||||
- {fileID: 8743615454504171472}
|
||||
m_Father: {fileID: 5719983600610341389}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
|
|
|
@ -126,14 +126,12 @@ namespace SanAndreasUnity.Behaviours
|
|||
|
||||
public void DisplayInflictedDamageMessage(float damageAmount)
|
||||
{
|
||||
OnScreenMessageManager.Instance.AddMessage(
|
||||
new OnScreenMessage
|
||||
{
|
||||
velocity = Random.insideUnitCircle.normalized * PedManager.Instance.inflictedDamageMessageVelocityInScreenPerc,
|
||||
color = PedManager.Instance.inflictedDamageMessageColor,
|
||||
timeLeft = PedManager.Instance.inflictedDamageMessageLifetime,
|
||||
text = damageAmount.ToString(),
|
||||
});
|
||||
var msg = OnScreenMessageManager.Instance.CreateMessage();
|
||||
|
||||
msg.velocity = Random.insideUnitCircle.normalized * PedManager.Instance.inflictedDamageMessageVelocityInScreenPerc;
|
||||
msg.TextColor = PedManager.Instance.inflictedDamageMessageColor;
|
||||
msg.timeLeft = PedManager.Instance.inflictedDamageMessageLifetime;
|
||||
msg.Text = damageAmount.ToString();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,21 +1,51 @@
|
|||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace SanAndreasUnity.Utilities
|
||||
{
|
||||
|
||||
public class OnScreenMessage
|
||||
public class OnScreenMessage : MonoBehaviour
|
||||
{
|
||||
public string text = "";
|
||||
public Color color = Color.black;
|
||||
public Color backgroundColor = new Color(0, 0, 0, 1); // transparent
|
||||
public Text TextComponent { get; private set; }
|
||||
|
||||
public string Text { get => this.TextComponent.text; set => this.TextComponent.text = value; }
|
||||
|
||||
public Color TextColor { get => this.TextComponent.color; set => this.TextComponent.color = value; }
|
||||
|
||||
//public Color backgroundColor = new Color(0, 0, 0, 1); // transparent
|
||||
|
||||
/// in percentage of screen dimensions
|
||||
public Vector2 screenPos = Vector2.one / 2f;
|
||||
public Vector2 ScreenPos
|
||||
{
|
||||
get => Vector2.Scale(new Vector2(this.transform.localPosition.x, this.transform.localPosition.y), new Vector2(1.0f / Screen.width, 1.0f / Screen.height));
|
||||
set
|
||||
{
|
||||
(this.transform as RectTransform).localPosition = new Vector3(value.x * Screen.width, value.y * Screen.height, 0f);
|
||||
}
|
||||
}
|
||||
|
||||
/// in percentage of screen dimensions
|
||||
public Vector2 sizeOnScreen = new Vector2(80 / 1280f, 30 / 720f);
|
||||
public Vector2 SizeOnScreen
|
||||
{
|
||||
get => Vector2.Scale((this.transform as RectTransform).sizeDelta, new Vector2(1.0f / Screen.width, 1.0f / Screen.height));
|
||||
set
|
||||
{
|
||||
(this.transform as RectTransform).sizeDelta = new Vector2(value.x * Screen.width, value.y * Screen.height);
|
||||
}
|
||||
}
|
||||
|
||||
/// in percentage of screen dimensions
|
||||
public Vector2 velocity = Vector2.zero;
|
||||
|
||||
/// how much time it is displayed
|
||||
public float timeLeft = 2;
|
||||
|
||||
|
||||
|
||||
void Awake()
|
||||
{
|
||||
this.TextComponent = this.GetComponentInChildren<Text>();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -7,11 +7,14 @@ namespace SanAndreasUnity.Utilities
|
|||
public class OnScreenMessageManager : MonoBehaviour
|
||||
{
|
||||
|
||||
public GameObject messagePrefab;
|
||||
|
||||
public RectTransform messagesContainer;
|
||||
|
||||
private List<OnScreenMessage> m_onScreenMessages = new List<OnScreenMessage>();
|
||||
public IReadOnlyList<OnScreenMessage> Messages => m_onScreenMessages;
|
||||
|
||||
[SerializeField] private bool m_drawMessages = true;
|
||||
public static bool DrawMessages { get { return Instance.m_drawMessages; } set { Instance.m_drawMessages = value; } }
|
||||
public int messagePoolSize = 10;
|
||||
|
||||
public static OnScreenMessageManager Instance { get; private set; }
|
||||
|
||||
|
@ -25,52 +28,32 @@ namespace SanAndreasUnity.Utilities
|
|||
void Update()
|
||||
{
|
||||
|
||||
m_onScreenMessages.RemoveDeadObjects();
|
||||
|
||||
foreach (var msg in m_onScreenMessages)
|
||||
{
|
||||
msg.timeLeft -= Time.deltaTime;
|
||||
msg.screenPos += msg.velocity * Time.deltaTime;
|
||||
}
|
||||
|
||||
m_onScreenMessages.RemoveAll(msg => msg.timeLeft <= 0);
|
||||
|
||||
}
|
||||
|
||||
void OnGUI()
|
||||
msg.ScreenPos += msg.velocity * Time.deltaTime;
|
||||
if (msg.timeLeft <= 0)
|
||||
{
|
||||
// draw messages
|
||||
|
||||
if (!m_drawMessages)
|
||||
return;
|
||||
|
||||
var originalColor = GUI.color;
|
||||
var originalBackgroundColor = GUI.backgroundColor;
|
||||
|
||||
Vector2 screenSize = new Vector2(Screen.width, Screen.height);
|
||||
|
||||
foreach (var msg in m_onScreenMessages)
|
||||
{
|
||||
GUI.color = msg.color;
|
||||
GUI.backgroundColor = msg.backgroundColor;
|
||||
|
||||
Vector2 size = Utilities.GUIUtils.CalcScreenSizeForContent(new GUIContent(msg.text), GUI.skin.label);
|
||||
|
||||
GUI.Label(new Rect(Vector2.Scale(msg.screenPos, screenSize), size), msg.text);
|
||||
Object.Destroy(msg);
|
||||
}
|
||||
}
|
||||
|
||||
GUI.color = originalColor;
|
||||
GUI.backgroundColor = originalBackgroundColor;
|
||||
|
||||
}
|
||||
|
||||
|
||||
public void AddMessage(OnScreenMessage msg)
|
||||
public OnScreenMessage CreateMessage()
|
||||
{
|
||||
m_onScreenMessages.Add(msg);
|
||||
}
|
||||
messagePrefab.GetComponentOrThrow<OnScreenMessage>();
|
||||
|
||||
public void RemoveMessage(OnScreenMessage msg)
|
||||
{
|
||||
m_onScreenMessages.Remove(msg);
|
||||
GameObject messageGo = Object.Instantiate(messagePrefab);
|
||||
messageGo.transform.SetParent(messagesContainer, false);
|
||||
|
||||
OnScreenMessage message = messageGo.GetComponent<OnScreenMessage>();
|
||||
|
||||
m_onScreenMessages.Add(message);
|
||||
|
||||
return message;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue