using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Serialization; using DamageNumbersPro.Internal; using TMPro; namespace DamageNumbersPro { [DisallowMultipleComponent] public class DamageNumberGUI : DamageNumber { /* * Contact me if you need any support. * Email: ekincantascontact@gmail.com * Discord: https://discord.com/invite/nWbRkN8Zxr * * Check the manual for more information. * Manual: https://ekincantas.com/damage-numbers-pro/ * * Thank you for using my asset. * If you want to add your own code please use the functions below. * I recommend creating a duplicate of this script first or creating your own script which derives from DamageNumber. * Otherwise you may loose your custom code when you update damage numbers pro. * * Good Luck */ //Custom Events: protected override void OnPreSpawn() { //Fixes an issue where the previous mesh was visible for 1 frame. if (textMeshProA != null) { textMeshProA.enabled = textMeshProB.enabled = false; } } protected override void OnStart() { //Only damage numbers of the same parent can interact with each other. if(spamGroup != "" && transform.parent != null) { spamGroup += transform.parent.GetInstanceID(); } //GUI Alpha Fix: skippedFrames = 0; skipFrames = true; realStartTime = Time.unscaledTime; } protected override void OnLateUpdate() { //GUI Alpha Fix: if (skipFrames) { transform.localScale = Vector3.one * 0.0001f; currentFade = 0; if (skippedFrames > 2 && Time.unscaledTime > realStartTime + 0.03f) { skipFrames = false; transform.localScale = originalScale; currentFade = 0; } } } protected override void OnStop() { } protected override void OnUpdate(float deltaTime) { //GUI Alpha Fix: skippedFrames++; } protected override void OnAbsorb(float number, float newSum) { } protected override void OnTextUpdate() { } /* * The code below is required for the GUI version of damage numbers pro. * So you should not change it too much. * But you can use the events above to add your custom behavior. */ //References: RectTransform myRect; TextMeshProUGUI textMeshProA; TextMeshProUGUI textMeshProB; RectTransform textRectA; RectTransform textRectB; List subMeshs; //Internal: float realStartTime; bool skipFrames; int skippedFrames; //Components: public override void GetReferencesIfNecessary() { if(textMeshProA == null) { GetReferences(); } } public override void GetReferences() { baseAlpha = 0.9f; myRect = GetComponent(); transformA = transform.Find("TMPA"); transformB = transform.Find("TMPB"); textMeshProA = transformA.GetComponent(); textMeshProB = transformB.GetComponent(); textRectA = transformA.GetComponent(); textRectB = transformB.GetComponent(); } public override TMP_Text[] GetTextMeshs() { return new TMP_Text[] { textMeshProA, textMeshProB }; } public override TMP_Text GetTextMesh() { return textMeshProA; } //Materials: public override Material[] GetSharedMaterials() { return textMeshProA.fontSharedMaterials; } public override Material[] GetMaterials() { return textMeshProA.fontMaterials; } public override Material GetSharedMaterial() { return textMeshProA.fontSharedMaterial; } public override Material GetMaterial() { return textMeshProA.fontMaterial; } //Text: protected override void SetTextString(string fullString) { textMeshProA.text = textMeshProB.text = fullString; if(!textMeshProA.enabled) { textMeshProA.enabled = textMeshProB.enabled = true; } textMeshProA.ForceMeshUpdate(); textMeshProB.ForceMeshUpdate(); textMeshProA.canvasRenderer.SetMesh(textMeshProA.mesh); textMeshProB.canvasRenderer.SetMesh(textMeshProB.mesh); meshs = new List(); meshs.Add(textMeshProA.mesh); meshs.Add(textMeshProB.mesh); //Sub Meshs: subMeshs = new List(); foreach(TMP_SubMeshUI subMesh in textMeshProA.GetComponentsInChildren()) { subMeshs.Add(subMesh); meshs.Add(subMesh.mesh); } foreach (TMP_SubMeshUI subMesh in textMeshProB.GetComponentsInChildren()) { subMeshs.Add(subMesh); meshs.Add(subMesh.mesh); } } //Position: public override Vector3 GetPosition() { return myRect.anchoredPosition3D; } public override void SetPosition(Vector3 newPosition) { GetReferencesIfNecessary(); position = myRect.anchoredPosition3D = newPosition; } public override void SetAnchoredPosition(Transform rectParent, Vector2 anchoredPosition) { //Old Transform: Vector3 oldScale = transform.localScale; //Set Parent and Position: GetReferencesIfNecessary(); myRect.SetParent(rectParent, false); myRect.anchoredPosition = anchoredPosition; //New Transform: transform.localScale = oldScale; transform.eulerAngles = textMeshProA.canvas.transform.eulerAngles; } public override void SetAnchoredPosition(Transform rectParent, Transform rectPosition, Vector2 relativeAnchoredPosition) { //Old Transform: Vector3 oldScale = transform.localScale; //Set Parent and Position: GetReferencesIfNecessary(); myRect.SetParent(rectParent, false); myRect.position = rectPosition.position; myRect.anchoredPosition += relativeAnchoredPosition; //New Transform: transform.localScale = oldScale; transform.eulerAngles = textMeshProA.canvas.transform.eulerAngles; } protected override void SetLocalPositionA(Vector3 localPosition) { textRectA.anchoredPosition = localPosition * 50; } protected override void SetLocalPositionB(Vector3 localPosition) { textRectB.anchoredPosition = localPosition * 50; } protected override float GetPositionFactor() { return 100f; } //Other: protected override void OnFade(float currentFade) { textMeshProA.canvasRenderer.SetMesh(textMeshProA.mesh); textMeshProB.canvasRenderer.SetMesh(textMeshProB.mesh); foreach (TMP_SubMeshUI subMesh in subMeshs) { subMesh.canvasRenderer.SetMesh(subMesh.mesh); } } protected override void UpdateRotationZ() { SetRotationZ(textMeshProA.transform); SetRotationZ(textMeshProB.transform); } public override void CheckAndEnable3D() { enable3DGame = false; } public override bool IsMesh() { return false; } public override Vector3 GetUpVector() { return Vector3.up; } public override Vector3 GetRightVector() { return Vector3.right; } public override Vector3 GetFreshUpVector() { return Vector3.up; } public override Vector3 GetFreshRightVector() { return Vector3.right; } } }