Files
EmeraidAI/Runtime/Scripts/Managers/CombatTextSystem.cs
2025-07-20 10:18:13 +08:00

481 lines
21 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace EmeraldAI
{
public class CombatTextSystem : MonoBehaviour
{
public static CombatTextSystem Instance;
[HideInInspector]
public GameObject CombatTextObject;
public enum AnimationTypeEnum { Bounce, Upwards, OutwardsV1, OutwardsV2, Stationary };
[HideInInspector]
public AnimationTypeEnum AnimationType = AnimationTypeEnum.Bounce;
[HideInInspector]
public GameObject CombatTextCanvas;
[HideInInspector]
public EmeraldCombatTextData m_EmeraldAICombatTextData;
Transform m_CombatTextParent;
private void Awake()
{
Instance = this;
}
public void Initialize()
{
CombatTextObject = (GameObject)Resources.Load("Combat Text") as GameObject;
m_CombatTextParent = CombatTextCanvas.transform.GetChild(0);
m_EmeraldAICombatTextData = (EmeraldCombatTextData)Resources.Load("Combat Text Data") as EmeraldCombatTextData;
if (!m_EmeraldAICombatTextData.VRSupport)
{
CombatTextCanvas.transform.localScale = Vector3.one;
CombatTextCanvas.GetComponent<Canvas>().renderMode = RenderMode.ScreenSpaceOverlay;
}
else
{
CombatTextCanvas.transform.localScale = Vector3.one * 0.01f;
CombatTextCanvas.GetComponent<Canvas>().renderMode = RenderMode.WorldSpace;
CombatTextCanvas.GetComponent<CanvasScaler>().dynamicPixelsPerUnit = 3;
CombatTextCanvas.GetComponent<Canvas>().worldCamera = Camera.main;
}
}
public void CreateCombatText(int amount, Vector3 TextPosition, bool CriticalHit, bool HealingText, bool PlayerTakingDamage)
{
if (m_EmeraldAICombatTextData.CombatTextState == EmeraldCombatTextData.CombatTextStateEnum.Enabled)
{
if (m_EmeraldAICombatTextData.CombatTextTargets == EmeraldCombatTextData.CombatTextTargetEnum.AIOnly && PlayerTakingDamage)
{
return;
}
AnimationType = (AnimationTypeEnum)m_EmeraldAICombatTextData.AnimationType;
var t = EmeraldAI.Utility.EmeraldObjectPool.Spawn(CombatTextObject, TextPosition + Vector3.up, Quaternion.identity);
t.transform.SetParent(m_CombatTextParent);
t.transform.position = Vector3.zero;
Text m_Text = t.GetComponent<Text>();
m_Text.text = amount.ToString();
m_Text.font = m_EmeraldAICombatTextData.TextFont;
m_Text.fontSize = m_EmeraldAICombatTextData.FontSize;
if (m_EmeraldAICombatTextData.VRSupport) m_Text.transform.localScale = Vector3.one * 0.6f;
Outline m_OutLine = t.GetComponent<Outline>();
if (m_EmeraldAICombatTextData.OutlineEffect == EmeraldCombatTextData.OutlineEffectEnum.Enabled)
{
m_OutLine.enabled = true;
}
else if (m_EmeraldAICombatTextData.OutlineEffect == EmeraldCombatTextData.OutlineEffectEnum.Disabled)
{
m_OutLine.enabled = false;
}
if (AnimationType == AnimationTypeEnum.Bounce)
{
StartCoroutine(AnimateBounceText(m_Text, m_EmeraldAICombatTextData.PlayerTextColor, m_EmeraldAICombatTextData.PlayerCritTextColor,TextPosition, CriticalHit, HealingText, PlayerTakingDamage));
}
else if (AnimationType == AnimationTypeEnum.Upwards)
{
StartCoroutine(AnimateUpwardsText(m_Text, m_EmeraldAICombatTextData.PlayerTextColor, m_EmeraldAICombatTextData.PlayerCritTextColor, TextPosition, CriticalHit, HealingText, PlayerTakingDamage));
}
else if (AnimationType == AnimationTypeEnum.OutwardsV1 || AnimationType == AnimationTypeEnum.OutwardsV2)
{
StartCoroutine(AnimateOutwardsText(m_Text, m_EmeraldAICombatTextData.PlayerTextColor, m_EmeraldAICombatTextData.PlayerCritTextColor, TextPosition, CriticalHit, HealingText, PlayerTakingDamage));
}
else if (AnimationType == AnimationTypeEnum.Stationary)
{
StartCoroutine(AnimateStationaryText(m_Text, m_EmeraldAICombatTextData.PlayerTextColor, m_EmeraldAICombatTextData.PlayerCritTextColor, TextPosition, CriticalHit, HealingText, PlayerTakingDamage));
}
}
}
public void CreateCombatTextAI(int Amount, Vector3 TextPosition, bool CriticalHit, bool HealingText)
{
if (m_EmeraldAICombatTextData.CombatTextState == EmeraldCombatTextData.CombatTextStateEnum.Enabled)
{
AnimationType = (AnimationTypeEnum)m_EmeraldAICombatTextData.AnimationType;
var t = EmeraldAI.Utility.EmeraldObjectPool.Spawn(CombatTextObject, TextPosition + Vector3.up, Quaternion.identity);
t.transform.SetParent(m_CombatTextParent);
t.transform.position = Vector3.zero;
Text m_Text = t.GetComponent<Text>();
m_Text.text = Amount.ToString();
m_Text.font = m_EmeraldAICombatTextData.TextFont;
m_Text.fontSize = m_EmeraldAICombatTextData.FontSize;
if (m_EmeraldAICombatTextData.VRSupport) m_Text.transform.localScale = Vector3.one * 0.6f;
Outline m_OutLine = t.GetComponent<Outline>();
if (m_EmeraldAICombatTextData.OutlineEffect == EmeraldCombatTextData.OutlineEffectEnum.Enabled)
{
m_OutLine.enabled = true;
}
else if (m_EmeraldAICombatTextData.OutlineEffect == EmeraldCombatTextData.OutlineEffectEnum.Disabled)
{
m_OutLine.enabled = false;
}
if (AnimationType == AnimationTypeEnum.Bounce)
{
StartCoroutine(AnimateBounceText(m_Text, m_EmeraldAICombatTextData.AITextColor, m_EmeraldAICombatTextData.AICritTextColor, TextPosition, CriticalHit, HealingText, false));
}
else if (AnimationType == AnimationTypeEnum.Upwards)
{
StartCoroutine(AnimateUpwardsText(m_Text, m_EmeraldAICombatTextData.AITextColor, m_EmeraldAICombatTextData.AICritTextColor, TextPosition, CriticalHit, HealingText, false));
}
else if (AnimationType == AnimationTypeEnum.OutwardsV1 || AnimationType == AnimationTypeEnum.OutwardsV2)
{
StartCoroutine(AnimateOutwardsText(m_Text, m_EmeraldAICombatTextData.AITextColor, m_EmeraldAICombatTextData.AICritTextColor, TextPosition, CriticalHit, HealingText, false));
}
else if (AnimationType == AnimationTypeEnum.Stationary)
{
StartCoroutine(AnimateStationaryText(m_Text, m_EmeraldAICombatTextData.AITextColor, m_EmeraldAICombatTextData.AICritTextColor, TextPosition, CriticalHit, HealingText, false));
}
}
}
IEnumerator AnimateBounceText(Text m_Text, Color RegularTextColor, Color CritTextColor, Vector3 TargetPosition, bool CriticalHit, bool HealingText, bool PlayerTakingDamage)
{
if (CriticalHit)
{
m_Text.color = CritTextColor;
}
else if (!CriticalHit)
{
m_Text.color = RegularTextColor;
}
if (HealingText)
{
m_Text.color = m_EmeraldAICombatTextData.HealingTextColor;
m_Text.text = "+" + m_Text.text;
}
if (PlayerTakingDamage)
{
m_Text.color = m_EmeraldAICombatTextData.PlayerTakeDamageTextColor;
m_Text.text = "-" + m_Text.text;
if (CriticalHit)
{
m_Text.color = CritTextColor;
}
}
float t = 0;
float m_TextFade = 0;
float RandomXPosition = Random.Range(-0.8f, 0.6f);
RandomXPosition = Mathf.Round(RandomXPosition * 10f) / 10;
float AnimateSmaller = 0;
float AnimateLarger = 0;
while ((t / 1.5f) < 1)
{
t += Time.deltaTime;
float r = 1.0f - (t / 1);
Vector3 m_TextPos = TargetPosition + new Vector3(r - RandomXPosition, Mathf.Sin(r * Mathf.PI), 0);
if (!m_EmeraldAICombatTextData.VRSupport)
{
m_TextPos = Camera.main.WorldToScreenPoint(m_TextPos - Vector3.right + Vector3.up * m_EmeraldAICombatTextData.DefaultHeight / 2);
m_TextPos.z = 0.0f;
}
else
{
m_TextPos = (m_TextPos - Vector3.right + Vector3.up * m_EmeraldAICombatTextData.DefaultHeight / 2);
}
if (m_EmeraldAICombatTextData.UseAnimateFontSize == EmeraldCombatTextData.UseAnimateFontSizeEnum.Enabled)
{
if (t <= 0.15f)
{
AnimateLarger += Time.deltaTime * 8;
m_Text.fontSize = (int)Mathf.Lerp((float)m_EmeraldAICombatTextData.FontSize, (float)m_EmeraldAICombatTextData.FontSize + m_EmeraldAICombatTextData.MaxFontSize, AnimateLarger);
}
else if (t > 0.15f && t <= 0.3f)
{
AnimateSmaller += Time.deltaTime * 6;
m_Text.fontSize = (int)Mathf.Lerp((float)m_EmeraldAICombatTextData.FontSize + m_EmeraldAICombatTextData.MaxFontSize, (float)m_EmeraldAICombatTextData.FontSize, AnimateSmaller);
}
}
if (t > 0.5f)
{
m_TextFade += Time.deltaTime;
m_Text.color = new Color(m_Text.color.r, m_Text.color.g, m_Text.color.b, 1 - (m_TextFade * 2));
}
m_Text.transform.position = m_TextPos;
if (m_EmeraldAICombatTextData.VRSupport) RotateTowardsCamera(m_Text.transform);
yield return null;
}
EmeraldAI.Utility.EmeraldObjectPool.Despawn(m_Text.gameObject);
}
IEnumerator AnimateUpwardsText(Text m_Text, Color RegularTextColor, Color CritTextColor, Vector3 TargetPosition, bool CriticalHit, bool HealingText, bool PlayerTakingDamage)
{
if (CriticalHit)
{
m_Text.color = CritTextColor;
}
else if (!CriticalHit)
{
m_Text.color = RegularTextColor;
}
if (HealingText)
{
m_Text.color = m_EmeraldAICombatTextData.HealingTextColor;
m_Text.text = "+" + m_Text.text;
}
if (PlayerTakingDamage)
{
m_Text.color = m_EmeraldAICombatTextData.PlayerTakeDamageTextColor;
m_Text.text = "-" + m_Text.text;
if (CriticalHit)
{
m_Text.color = CritTextColor;
}
}
float t = 0;
float m_TextFade = 0;
float RandomXPosition = Random.Range(-0.8f, 0.9f);
RandomXPosition = Mathf.Round(RandomXPosition * 10f) / 10;
float AnimateSmaller = 0;
float AnimateLarger = 0;
while ((t / 1.5f) < 1)
{
t += Time.deltaTime*0.75f;
float r = 1.0f - (t / 1);
Vector3 m_TextPos = TargetPosition + new Vector3(RandomXPosition, -r * m_EmeraldAICombatTextData.DefaultHeight, 0);
if (!m_EmeraldAICombatTextData.VRSupport)
{
m_TextPos = Camera.main.WorldToScreenPoint(m_TextPos + Vector3.up * m_EmeraldAICombatTextData.DefaultHeight);
m_TextPos.z = 0.0f;
}
else
{
m_TextPos = (m_TextPos + Vector3.up * m_EmeraldAICombatTextData.DefaultHeight);
}
if (m_EmeraldAICombatTextData.UseAnimateFontSize == EmeraldCombatTextData.UseAnimateFontSizeEnum.Enabled)
{
if (t <= 0.15f)
{
AnimateLarger += Time.deltaTime * 8;
m_Text.fontSize = (int)Mathf.Lerp((float)m_EmeraldAICombatTextData.FontSize, (float)m_EmeraldAICombatTextData.FontSize + m_EmeraldAICombatTextData.MaxFontSize, AnimateLarger);
}
else if (t > 0.15f && t <= 0.3f)
{
AnimateSmaller += Time.deltaTime * 6;
m_Text.fontSize = (int)Mathf.Lerp((float)m_EmeraldAICombatTextData.FontSize + m_EmeraldAICombatTextData.MaxFontSize, (float)m_EmeraldAICombatTextData.FontSize, AnimateSmaller);
}
}
if (t > 0.5f)
{
m_TextFade += Time.deltaTime;
m_Text.color = new Color(m_Text.color.r, m_Text.color.g, m_Text.color.b, 1 - (m_TextFade * 1.5f));
}
m_Text.transform.position = m_TextPos;
if (m_EmeraldAICombatTextData.VRSupport) RotateTowardsCamera(m_Text.transform);
yield return null;
}
EmeraldAI.Utility.EmeraldObjectPool.Despawn(m_Text.gameObject);
}
IEnumerator AnimateOutwardsText(Text m_Text, Color RegularTextColor, Color CritTextColor, Vector3 TargetPosition, bool CriticalHit, bool HealingText, bool PlayerTakingDamage)
{
if (CriticalHit)
{
m_Text.color = CritTextColor;
}
else if (!CriticalHit)
{
m_Text.color = RegularTextColor;
}
if (HealingText)
{
m_Text.color = m_EmeraldAICombatTextData.HealingTextColor;
m_Text.text = "+" + m_Text.text;
}
if (PlayerTakingDamage)
{
m_Text.color = m_EmeraldAICombatTextData.PlayerTakeDamageTextColor;
m_Text.text = "-" + m_Text.text;
if (CriticalHit)
{
m_Text.color = CritTextColor;
}
}
float t = 0;
float m_TextFade = 0;
float RandomXPosition = Random.Range(-2f, 2.1f);
RandomXPosition = Mathf.Round(RandomXPosition * 10f) / 10;
float RandomYPosition = m_EmeraldAICombatTextData.DefaultHeight;
RandomYPosition = Mathf.Round(RandomYPosition * 10f) / 10;
Vector3 m_TextPos = Vector3.zero;
float r = 1.0f;
float AnimateSmaller = 0;
float AnimateLarger = 0;
while ((t / 1) < 1)
{
t += Time.deltaTime/2;
if (r > 0.5f)
{
r = 1.0f - (t*4 / 1);
}
if (AnimationType == AnimationTypeEnum.OutwardsV1)
{
m_TextPos = TargetPosition + new Vector3(Mathf.Lerp(0, RandomXPosition, t), -r * m_EmeraldAICombatTextData.DefaultHeight + Mathf.Sin(t * Mathf.PI), 0);
}
else if (AnimationType == AnimationTypeEnum.OutwardsV2)
{
m_TextPos = TargetPosition + new Vector3(Mathf.Lerp(0, RandomXPosition, 1 - r), -r * m_EmeraldAICombatTextData.DefaultHeight + Mathf.Sin(r + RandomYPosition * Mathf.PI), 0);
}
if (!m_EmeraldAICombatTextData.VRSupport)
{
m_TextPos = Camera.main.WorldToScreenPoint(m_TextPos + Vector3.up * RandomYPosition);
m_TextPos.z = 0.0f;
}
else
{
m_TextPos = (m_TextPos + Vector3.up * RandomYPosition);
}
m_Text.transform.position = m_TextPos;
if (m_EmeraldAICombatTextData.VRSupport) RotateTowardsCamera(m_Text.transform);
if (m_EmeraldAICombatTextData.UseAnimateFontSize == EmeraldCombatTextData.UseAnimateFontSizeEnum.Enabled)
{
if (t <= 0.15f)
{
AnimateLarger += Time.deltaTime * 8;
m_Text.fontSize = (int)Mathf.Lerp((float)m_EmeraldAICombatTextData.FontSize, (float)m_EmeraldAICombatTextData.FontSize + m_EmeraldAICombatTextData.MaxFontSize, AnimateLarger);
}
else if (t > 0.15f && t <= 0.3f)
{
AnimateSmaller += Time.deltaTime * 6;
m_Text.fontSize = (int)Mathf.Lerp((float)m_EmeraldAICombatTextData.FontSize + m_EmeraldAICombatTextData.MaxFontSize, (float)m_EmeraldAICombatTextData.FontSize, AnimateSmaller);
}
}
if (t > 0.5f)
{
m_TextFade += Time.deltaTime;
m_Text.color = new Color(m_Text.color.r, m_Text.color.g, m_Text.color.b, 1 - (m_TextFade * 2));
}
yield return null;
}
EmeraldAI.Utility.EmeraldObjectPool.Despawn(m_Text.gameObject);
}
IEnumerator AnimateStationaryText(Text m_Text, Color RegularTextColor, Color CritTextColor, Vector3 TargetPosition, bool CriticalHit, bool HealingText, bool PlayerTakingDamage)
{
if (CriticalHit)
{
m_Text.color = CritTextColor;
}
else if (!CriticalHit)
{
m_Text.color = RegularTextColor;
}
if (HealingText)
{
m_Text.color = m_EmeraldAICombatTextData.HealingTextColor;
m_Text.text = "+" + m_Text.text;
}
if (PlayerTakingDamage)
{
m_Text.color = m_EmeraldAICombatTextData.PlayerTakeDamageTextColor;
m_Text.text = "-" + m_Text.text;
if (CriticalHit)
{
m_Text.color = CritTextColor;
}
}
float t = 0;
float m_TextFade = 0;
float RandomXPosition = Random.Range(-1f, 1.1f);
RandomXPosition = Mathf.Round(RandomXPosition * 10f) / 10;
float RandomYPosition = m_EmeraldAICombatTextData.DefaultHeight;
RandomYPosition = Mathf.Round(RandomYPosition * 10f) / 10;
float AnimateSmaller = 0;
float AnimateLarger = 0;
while ((t / 1.5f) < 1)
{
t += Time.deltaTime;
Vector3 m_TextPos = TargetPosition + new Vector3(RandomXPosition, RandomYPosition, 0);
if (!m_EmeraldAICombatTextData.VRSupport)
{
m_TextPos = Camera.main.WorldToScreenPoint(m_TextPos - Vector3.up * 0.5f);
m_TextPos.z = 0.0f;
}
else
{
m_TextPos = (m_TextPos - Vector3.up * 0.5f);
}
if (m_EmeraldAICombatTextData.UseAnimateFontSize == EmeraldCombatTextData.UseAnimateFontSizeEnum.Enabled)
{
if (t <= 0.15f)
{
AnimateLarger += Time.deltaTime * 8;
m_Text.fontSize = (int)Mathf.Lerp((float)m_EmeraldAICombatTextData.FontSize, (float)m_EmeraldAICombatTextData.FontSize + m_EmeraldAICombatTextData.MaxFontSize, AnimateLarger);
}
else if (t > 0.15f && t <= 0.3f)
{
AnimateSmaller += Time.deltaTime * 6;
m_Text.fontSize = (int)Mathf.Lerp((float)m_EmeraldAICombatTextData.FontSize + m_EmeraldAICombatTextData.MaxFontSize, (float)m_EmeraldAICombatTextData.FontSize, AnimateSmaller);
}
}
if (t > 0.5f)
{
m_TextFade += Time.deltaTime;
m_Text.color = new Color(m_Text.color.r, m_Text.color.g, m_Text.color.b, 1 - (m_TextFade * 2));
}
m_Text.transform.position = m_TextPos;
if (m_EmeraldAICombatTextData.VRSupport) RotateTowardsCamera(m_Text.transform);
yield return null;
}
EmeraldAI.Utility.EmeraldObjectPool.Despawn(m_Text.gameObject);
}
void RotateTowardsCamera (Transform Source)
{
Vector3 directionAwayFromCamera = Source.position - Camera.main.transform.position;
Source.rotation = Quaternion.LookRotation(directionAwayFromCamera);
}
}
}