欢迎来到第五部分——文字系统。在这个部分,我们将会实现一个悬浮文字。大概说一下这个部分的学习内容:

  • 对象池:这是一种设计模式,因为我们有多个文字需要显示,所以在每次显示一个文字都创建一个 Game Object 再销毁,对系统性能消耗挺高。所以我们将创建几个 Game Object,当需要显示文字的时候,就激活这个 Game Object 让它显示在屏幕上,否则就让它休眠。

文字系统需要比较多的逻辑:

  • 需要显示的文字
  • 被激活了没
  • 显示在界面上的时长
  • 显示在界面上的位置
  • 有没有动画效果
  • 字体颜色和字形

所以我们需要创建一个新的脚本,用于编写文字的逻辑代码。脚本名称为 FloatingText。这个脚本是专注于文字的逻辑类代码。

编辑代码,这次我们不需要继承 MonoBehavior 类。首先我们引用 UnityEngine.UI 命名空间(using 语句)。然后里边定义六个成员变量(变量用途我都写在代码注释了)。

然后我们定义两个函数,Show 和 Hide,Show 显示函数将 isActive 设置为 true,然后更新 lastShown 时间,最后再把该 gameObj 的激活状态设置为 isActive 的值。Hide 隐藏函数将 isActive 设置为 false,然后一样把 gameObj 的激活状态设置为 isActive 的值。

UpdateFloatingText 函数首先判断当前文字是否被激活(显示)没有的话直接跳过。否则就检测 当前时间 - 最后一次显示时间 是否大于 显示时长,是的话则隐藏该文字。最后再给文字加上动态效果。

using UnityEngine;
using UnityEngine.UI;

public class FloatingText
{
public bool isActive;
public GameObject gameObj;
public Text text;
public Vector3 motion;
public float duration;
public float lastShown;

public void Show()
{
isActive = true;
lastShown = Time.time;
gameObj.SetActive(isActive);
}

public void Hide()
{
isActive = false;
gameObj.SetActive(isActive);
}

public void UpdateFloatingText()
{
if(!isActive)
{
return;
}

if (Time.time - lastShown > duration)
{
Hide();
}

gameObj.transform.position += motion * Time.deltaTime;
}
}