虽然用的是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后其实字体就看不见了,这个时候直接销毁组件就行了,没必要设置消失时间,当然如果要实现其它的效果或者着不想要逐渐消失就可以保留。

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

从0开始做RPG 文字游戏 unity unity能做文字游戏_从0开始做RPG 文字游戏 unity

从0开始做RPG 文字游戏 unity unity能做文字游戏_游戏程序_02