Files
Cielonos/Assets/DamageNumbersPro/Scripts/DamageNumberGUI.cs
SoulliesOfficial ef7b479712 initial
2025-11-25 08:19:33 -05:00

278 lines
8.8 KiB
C#

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:// discordcom/invite/nWbRkN8Zxr
*
* Check the manual for more information.
* Manual: https:// ekincantascom/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 InternalOnPreSpawn()
{
// Fixes an issue where the previous mesh was visible for 1 frame
if (textMeshProA != null)
{
textMeshProA.enabled = textMeshProB.enabled = false;
}
}
protected override void InternalOnSpawn()
{
// 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 InternalUpdate(float deltaTime)
{
// GUI Alpha Fix
skippedFrames++;
}
/*
* 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<TMP_SubMeshUI> 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<RectTransform>();
transformA = transform.Find("TMPA");
transformB = transform.Find("TMPB");
textMeshProA = transformA.GetComponent<TextMeshProUGUI>();
textMeshProB = transformB.GetComponent<TextMeshProUGUI>();
textRectA = transformA.GetComponent<RectTransform>();
textRectB = transformB.GetComponent<RectTransform>();
}
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<Mesh>();
meshs.Add(textMeshProA.mesh);
meshs.Add(textMeshProB.mesh);
// Sub Meshs
subMeshs = new List<TMP_SubMeshUI>();
foreach(TMP_SubMeshUI subMesh in textMeshProA.GetComponentsInChildren<TMP_SubMeshUI>())
{
subMeshs.Add(subMesh);
meshs.Add(subMesh.mesh);
}
foreach (TMP_SubMeshUI subMesh in textMeshProB.GetComponentsInChildren<TMP_SubMeshUI>())
{
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;
}
protected override void SetFinalPosition(Vector3 newPosition)
{
GetReferencesIfNecessary();
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.anchoredPosition3D = 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 Vector3 GetOtherPosition(Transform target)
{
RectTransform targetRectTransform = followedTarget.GetComponent<RectTransform>();
return targetRectTransform != null ? targetRectTransform.anchoredPosition3D : target.position;
}
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 InternalUpdateFade(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;
}
}
}