Unity3D 使用 TextMesh 显示伤害效果
在大多数涉及战斗的游戏中,显示伤害效果是一项基本需求。本文不探讨伤害效果的华丽表现,而是聚焦于如何在游戏中实现最基础的伤害显示,即使用 TextMesh 来显示伤害。如同使用 TextMesh 显示角色名字(查看详情)一样,使用 TextMesh 显示伤害并不复杂。不过,与显示角色名称不同的是,伤害效果通常需要运行一段轨迹后消失。并且,为了减少创建与销毁对象带来的性能损耗,一般会将伤害效果的对象放入对象池。
最终效果
点击舞台时,伤害数字会随机出现在角色周围,几秒后自动销毁,效果如图所示(此处应插入对应图片)。
搭建测试场景
关于搭建测试场景的详细步骤,本文不再赘述,测试场景如图所示(此处应插入对应图片)。
创建并设置 HurtItem 对象
- 新建一个名为 HurtItem 的空对象。
- 为该空对象添加 TextMesh 组件,并设置好相关属性,设置界面如图所示(此处应插入对应图片)。
编写脚本
新建一个 C# 脚本,命名为 HurtItem.cs,代码如下:
using UnityEngine;
using System.Collections;
public class HurtItem : MonoBehaviour
{
// 定义颜色数组,用于随机选取伤害数字的颜色
private Color[] colors = new Color[] { Color.red, Color.yellow, Color.blue, Color.green, Color.white };
private TextMesh textMesh;
private Camera mainCamera;
private Vector3 targetPosition;
private float destoryTime;
void Awake()
{
// 获取父对象上的 TextMesh 组件
this.textMesh = this.GetComponentInParent<TextMesh>();
}
public void ChangeData(int hurt, Vector3 position, Camera mainCamera)
{
this.mainCamera = mainCamera;
// 设置 TextMesh 显示的伤害文本
this.textMesh.text = "- " + hurt.ToString();
// 随机选取颜色数组中的颜色
this.textMesh.color = this.colors[Random.Range(0, this.colors.Length)];
// 计算目标位置,在原位置基础上随机偏移
this.targetPosition = position + new Vector3(Random.Range(-0.1f, 0.1f), Random.Range(-0.1f, 0.1f), 0f) * 15f;
// 设置当前对象的位置
this.transform.position = position;
// 记录开始时间
this.destoryTime = Time.time;
}
void Update()
{
if (this.destoryTime == 0) return;
// 1 秒钟后消失
if (Time.time - this.destoryTime <= 1f)
{
// 计算方向向量
Vector3 direction = this.transform.position - this.mainCamera.transform.position;
direction.y = 0f;
// 设置对象的旋转方向
this.transform.rotation = Quaternion.LookRotation(direction);
// 使用线性插值让对象向目标位置移动
this.transform.position = Vector3.Lerp(this.transform.position, this.targetPosition, Time.deltaTime);
}
else
{
// 销毁对象
Destroy(this.gameObject);
}
}
}
挂载脚本
将编写好的 HurtItem.cs 脚本挂载到 HurtItem 对象上,挂载界面如图所示(此处应插入对应图片)。
运行测试
完成上述步骤后,运行游戏,即可查看伤害显示效果。