Unity实现伤害飘字

虽然用的是2D模板,但是重要的实现部分基本2D和3D是一样的。

想要实现实现伤害飘字,首先就需要创建一个文本组件,这里我使用的是TextMeshPro_Text(UI)组件类型,建议在一个空对象底下直接创建一个Text类型的UI文本。

将Text组件内的字符格式根据你的需求设置好后,(颜色大小等要根据个人的使用习惯和不同场景下都有差异,但是基本都需要将字节居中)将其设置为预制体就行了。

然后如何生成字体在敌人头上呢?只需要让敌人在受到攻击的位置创建这个文本对象就可以了,然后将控制文本对象各种显示效果的脚本放置在文本对象中即可。

这是控制生成文本对象的代码

//该脚本要挂载都敌人组件上,在敌人的血条改变或者受到伤害时调用该方法
    float rand = Random.Range(-2, 2);//随机-2~2的值

    Vector3 new_position = transform.position;//将受到攻击的敌人的位置转换为Vector3

    //在位置上生成文本对象
    new_position.x += rand;
    GameObject gameObject = Instantiate(Text, new_position, Quaternion.identity);

    //给文本对象中的文本赋值,显示数值
    gameObject.GetComponentInChildren<Hurt_Text>().Init(-change);

随机值的作用就是为了使得生成数值不会集中在一个地方,因为有时候你的攻击频率太快可能导致几个字节重叠在一起,观感很不好。

这是控制文本对象运行的代码

public class Hurt_Text : MonoBehaviour
{
    private TMP_Text text;//字符文本组件

    float alpha;//阿尔法值,控制字体逐渐消失的效果

    [Range(0, 10)]
    public float speed;//飘动速度

    [Range(0, 1)]
    public float speed_weak;//速度衰弱

    [Range(0, 50)]
    public float dis_time;//消失时间

    [Range(0, 10)]
    public float weak_time;//开始衰弱时间

    public Color color;//文本颜色

    //这个必须提醒一下,必须使用Awake而Start不行,因为在上一段文本赋值时
    //到文本对象脚本的Start还没有执行到,会造成text为null异常
    void Awake()
    {
        alpha = 1;
        text = GetComponentInChildren<TMP_Text>();
        Destroy(gameObject, dis_time);
        text.color = color;
    }

    void Update()
    {
        transform.Translate(0, speed * Time.deltaTime, 0);//使字体向上移动
        if (speed > 0)
        {
            speed -= speed_weak;//使得向上移动的速度逐渐减少
        }
        else if (speed <= 0 && weak_time >0)
        {
            weak_time -= Time.deltaTime;//当速度为0后,字体颜色开始透明的时间
        }
        else if (alpha > 0 && weak_time <=0) 
        {
            alpha -= 0.01f;//控制字体逐渐透明
        }
        text.color = new Color(text.color.r, text.color.g, text.color.b, alpha);//修改字体颜色,透明度等
    }

    public void Init(int hurt)
    {
        text.text = hurt.ToString();//设置文本
    }
}

当然我要实现的效果是向上飘一定距离后停下,然后再在一定时间后开始缓慢消失,实现其它的效果时,你可以通过自己的理解改写,当然这里其实有点多余的部分,因为在alpha(控制字体颜色透明度,1的时候完全不透明,0就是完全透明)在到了0后其实字体就看不见了,这个时候直接销毁组件就行了,没必要设置消失时间,当然如果要实现其它的效果或者着不想要逐渐消失就可以保留。

不得不吐槽一下我在CSDN上看到的做unity伤害飘字有一部的解释对萌新太不友好了(对,萌新说的就是我自己),缺少详细的说明和代码过程解释,甚至有些在代码上不加注释......

来看看配合上期的追踪子弹最终的实现效果

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用DOTween实现伤害飘字可以通过以下步骤完成: 1. 创建一个伤害飘字的预制体,可以包含一个Text组件来显示伤害数字。 2. 在代码中使用DOTween创建一个Tween对象,将伤害飘字的位置从伤害来源点移动到目标位置,并在移动过程中改变伤害飘字的透明度和缩放大小等属性。 3. 在Tween对象完成后,销毁伤害飘字的预制体。 下面是一个示例代码: ```csharp public class DamageNumber : MonoBehaviour { public Text damageText; public float moveDuration = 1f; public float fadeDuration = 0.5f; public float scaleDuration = 0.5f; public float moveDistance = 50f; public Vector3 targetPosition; private void Start() { // 设置伤害飘字的初始位置 transform.position = targetPosition + new Vector3(0f, moveDistance, 0f); // 创建Tween对象来移动伤害飘字的位置 var moveTween = transform.DOMove(targetPosition, moveDuration); // 创建Tween对象来改变伤害飘字的透明度 var fadeTween = damageText.DOFade(0f, fadeDuration); // 创建Tween对象来改变伤害飘字的缩放大小 var scaleTween = transform.DOScale(2f, scaleDuration).SetEase(Ease.OutQuad); // 当Tween对象完成时,销毁伤害飘字的预制体 moveTween.OnComplete(() => Destroy(gameObject)); // 启动Tween对象 moveTween.Play(); fadeTween.Play(); scaleTween.Play(); } public void SetDamageNumber(int damage) { // 设置伤害数字的文本 damageText.text = damage.ToString(); } } ``` 在游戏中,可以通过以下代码来创建并显示伤害飘字: ```csharp public class Player : MonoBehaviour { public GameObject damageNumberPrefab; public void TakeDamage(int damage) { // 创建伤害飘字的预制体 var damageNumber = Instantiate(damageNumberPrefab, transform.position, Quaternion.identity); // 设置伤害数字的值 var damageNumberComponent = damageNumber.GetComponent<DamageNumber>(); damageNumberComponent.SetDamageNumber(damage); // 设置伤害飘字的目标位置 var targetPosition = transform.position + new Vector3(0f, 2f, 0f); damageNumberComponent.targetPosition = targetPosition; // 启动伤害飘字的Tween动画 damageNumberComponent.Start(); } } ``` 当玩家受到伤害时,通过调用TakeDamage方法来显示伤害飘字
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值