using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
public class DamageTextShowControler : MonoBehaviour
{
public Camera mainCamera;
public RectTransform damageHolderRect;//承载text的父物体
public int DamageTextPoolCount = 20;//对象池容量
void Start()//出自ZLY毕设
{
mainCamera = Camera.main;
for (int i = 0; i < DamageTextPoolCount; i++)//初始化对象池子
{
GameObject textGO = GameObject.Instantiate(Resources.Load("DamageText") as GameObject, damageHolderRect);
damgeTextPool.Add(textGO);
textGO.gameObject.SetActive(false);
}
}
private List<GameObject> damgeTextPool=new List<GameObject>();//对象池
/// <summary>
/// 承受伤害的方法 传递过来受伤的怪物的位置,伤害数字,是否暴击了
/// </summary>
/// <param name="damagePosition"></param>
/// <param name="damageCount"></param>
/// <param name="isCritical"></param>
public void ShowDamageText(Vector3 damagePosition, float damageCount, bool isCritical = false)
{
Vector3 screenPosition = mainCamera.WorldToScreenPoint(damagePosition);//先把怪物的位置转化为屏幕坐标
Vector2 position;//再把屏幕坐标转化为对象池父物体的局部坐标
RectTransformUtility.ScreenPointToLocalPointInRectangle(damageHolderRect, screenPosition, null, out position);
if (position == null) return;
string damageText = "-" + (int)damageCount;
if (isCritical)//如果暴击 变成红色字体
{
damageText = "<color=#FF5F5FFF>" + damageText + "</color>";
}
Text text = GetTheText().GetComponent<Text>();
text.transform.localPosition = position;//使用转化之后的位置
text.text = damageText;
text.transform.DOLocalMoveY(100, 3);//先网上飘去
text.DOFade(0, 3);//渐变透明
StartCoroutine(HideTextContinue(text));
}//隐藏text的携程
IEnumerator HideTextContinue(Text text)
{
yield return new WaitForSeconds(3);
text.color = new Color(255,217,118);//恢复正常颜色
text.gameObject.SetActive(false);
}
//从对象池中取得对象的方法
private GameObject GetTheText()
{
for (int i = 0; i < damgeTextPool.Count; i++)
{
if (damgeTextPool[i].activeInHierarchy == false)
{
damgeTextPool[i].SetActive(true);
return damgeTextPool[i];
}
}
//如果没找到 就直接生成一个 然后直接计时销毁
GameObject textGO = GameObject.Instantiate(Resources.Load("DamageText") as GameObject, damageHolderRect);
Destroy(textGO,3.5f);
return textGO;
}
//出自ZLY毕设
}
Text的prefabs的结构很简单 就是一个text ,没有别的 而他的父物体是在一个canvas上的
效果是这样的 出自ZLY毕设