需求
当玩家攻击角色时,将伤害的数值随机生成于小怪的画布上
数值由小变大,由透明变不透明
显示一段时间之后,数值逐渐褪色
实现方法
将显示伤害数值的文本作为预制体,并在上面挂载脚本
攻击判断成功时,克隆该预制体到小怪的画布上
思路
使用 DOLocalMove 对文本进行一段平移插值
使用 DoScale 对文本大小进行缩放插值
使用 DOFade 对文本透明度进行插值
使用 协程 暂停一段时间,再对文本透明度进行插值
代码
using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
public class HurtValueAnim : MonoBehaviour
{
RectTransform rectTransform;
public Vector2 delta;
public float timeToShow;
public float waitTime;
public float timeToFade;
public float scale;
void Start()
{
rectTransform = GetComponent<RectTransform>();
rectTransform.DOLocalMove(new Vector3(rectTransform.anchoredPosition.x + delta.x, rectTransform.anchoredPosition.y + delta.y, 0), timeToShow);
rectTransform.DOScale(new Vector3(scale, scale, scale), timeToShow);
GetComponent<Text>().DOFade(1, timeToShow);
StartCoroutine("WaitForASecond", waitTime);
}
IEnumerator WaitForASecond(float waitTime)
{
Timer timer = new Timer("Fade");
timer.StartRecording();
while (true)
{
//当前帧执行到此处挂起,下一帧从此处恢复
yield return null;
if (timer.GetCurrentRecord() >= waitTime)
{
GetComponent<Text>().DOFade(0, timeToFade);
}
//终止
if (timer.GetCurrentRecord() >= waitTime + timeToFade)
{
timer.Reset();
StopCoroutine("WaitForASecond");
}
}
}
}
当玩家被攻击时,调用小怪身上的如下函数
void PopUpHurtValue(int value)
{
GameObject hurtValue = Instantiate(Resources.Load<GameObject>("Prefabs/UI/Attack/HurtValue_Hide"), canvas);
hurtValue.GetComponent<Text>().text = value.ToString();
hurtValue.transform.localPosition = new Vector3(Random.Range(-800,800), Random.Range(-500, 500),0);
Destroy(hurtValue,5f);
}
效果