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