我们回到 GameManager 类,才参考对象那里加上一个新的 FloatingTextManager。因为显示文字的函数会被游戏中的各种元素调用(箱子、NPC、怪物……),我们不想在每个地方都有一个 reference 所以统一在 GameManager 设置它。

// 参考对象
public Player player;
public FloatingTextManager floatingTextManager;

然后我们在 GameManager 类里新建一个函数 ShowText(创建函数的位置和 SaveState 函数同级),参数列表和 FloatingTextManager 的 Show 函数一致。然后调用 floatingTextManager 的 Show 函数,将所有参数值传递进去。

/*
* 显示浮动文字
*/
public void ShowText(string message, int fontSize, Color color, Vector3 position, Vector3 motion, float duration)
{
floatingTextManager.Show(message, fontSize, color, position, motion, duration);
}

当我们在别的类需要显示浮动文字,只需要使用如下代码:

GameManager.instance.ShowText("要显示的信息", 14, Color.yellow, 坐标, 位移量, 3000f);

回到 Unity 引擎,在 Hierarchy 面板中选中 GameManager。首先我们把 Hierarchy 面板中的 Player 拖到 GameManager 的 Player 属性中。

在 Hierarchy 面板中右键,创建 UI / Panel 将其重命名为 FloatingTextManager。这时候就会看见 Hierarchy 中出现三个游戏物件:Canvas、FloatingText 和 EventSystem。

然后把 Inspector 中的 Image 组件删掉,添加 FloatingTextManager 组件。这个组件我们在代码中定义了两个属性。首先我们把 FloatingTextManager(也就是自己)元素拖到 Text Container 属性里。另一个是 Text Prefab,我们需要创建一个文字预制件。

在 Hierarchy 面板中,右键 FloatingText 元素,创建 UI / Text 重命名为 FloatingText,这时候发现新建的 FloatingText 元素在 FloatingTextManager 元素之下。我们修改其中的属性值:

  • Width = 300; Height = 80
  • Font Size = 24
  • Aligment 居中,上下居中
  • Color = 白色

然后我们将 FloatingText 拖曳到 Prefab 文件夹里。

再回到 FloatingTextManager,将 Prefab 文件夹里的 FloatingText 拖曳到 TextPrefab 属性里。最后再删除 Hierarchy 面板中的 FloatingText 元素。

最后回到 GameManager,将 Hierarchy 面板中的 FloatingTextManager 拖曳到 Floating Text Manager 属性中。

在游戏中显示

打开 Chest 代码,原先我们获得金币的提示在 Debug.Log,那么现在我们将其用 ShowText 函数取代。参数如下:

  • 显示字符串:获得 XXX 金币
  • 字体大小: 24
  • 颜色:黄色
  • 位置:在箱子的上方显示
  • 动效:向上飘
  • 显示时长:1 秒
using UnityEngine;

public class Chest : Collectable
{
public Sprite emptyChest; // 空箱子的图片
public int goldAmount = 10; // 箱子里拥有的金币

protected override void OnCollect()
{
if (!collected) // 当还未被拾取
{
collected = true;
GetComponent<SpriteRenderer>().sprite = emptyChest;
Debug.Log("获得了" + goldAmount + "金币!");
GameManager.instance.ShowText(
$"获得{goldAmount}金币!",
24,
Color.yellow, // 可以使用 new Color(r, g, b) 来自定义颜色。里面的值是 0 - 1 而非 0 - 255
transform.position, // 在箱子的上方
Vector3.up * 25, // 向上飘
1.0f); // 显示 1 秒
}
}
}

测试游戏,我们得到如下结果:

如果同时触发多个箱子,会发现 Hierarchy 面板中会出现多个 FloatingText(Clone)。当他们显示完毕之后,会呈现灰色。