Unity 伤害值的显示

需求

当玩家攻击角色时,将伤害的数值随机生成于小怪的画布上

数值由小变大,由透明变不透明

显示一段时间之后,数值逐渐褪色

实现方法

将显示伤害数值的文本作为预制体,并在上面挂载脚本

攻击判断成功时,克隆该预制体到小怪的画布上

思路

使用 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);
}

效果

猜你喜欢

转载自blog.csdn.net/weixin_43673589/article/details/124438464