检视面板中的列表
本课属于 Coddy Unity 学习旅程的“Unity 游戏架构”单元。第 19 课,共 64 课。
[System.Serializable] 条目的列表是一张可以在 Inspector 中填写的表。这个守卫会沿着一条停靠点路线移动,并在每个停靠点等待,等待时长由对应条目中的值决定:
[System.Serializable]
public class Stop
{
public Transform point;
public float wait = 1f;
}
public class Patrol : MonoBehaviour
{
public float speed = 3f;
public List<Stop> stops;
private int current;
private float waited;
void Update()
{
Stop stop = stops[current];
transform.position = Vector3.MoveTowards(transform.position, stop.point.position, speed * Time.deltaTime);
if (transform.position != stop.point.position) return;
waited += Time.deltaTime;
if (waited >= stop.wait)
{
waited = 0f;
current = (current + 1) % stops.Count;
}
}
}Inspector 会显示 Stops、条目数量,以及每个条目对应的一个折叠面板:Element 0、Element 1,以此类推。每个面板都有 Point 和 Wait。+ 按钮会添加条目,减号按钮会移除选中的条目,行左侧的拖动手柄可以将条目移动到路线中的新位置。代码照常读取列表:其中有 stops.Count 个条目,使用 stops[current].point 访问当前停靠点,而 (current + 1) % stops.Count 会在最后一个停靠点之后回到第一个停靠点。关卡设计师可以给一个守卫设置 3 个停靠点,给另一个守卫设置 10 个,而无需修改脚本。
数组 public Stop[] stops; 的显示方式相同。Unity 的 + 按钮会复制最后一个条目,因此新停靠点的 point 和 wait 会与上方的停靠点相同。Unity 不会显示或保存列表的列表,例如 List<List<Stop>>,也不会显示或保存 Dictionary。你可以改用一个 [Serializable] 类封装内层列表,例如创建一个包含自己的 List<Stop> 的 Route,然后保存 Route 列表。
挑战
简单逐行显示 Mira 和 Tom 的对话。
- 声明一个
[System.Serializable]类Line,其中包含公共字符串speaker和text,并添加public List<Line> lines;。 - 开始时显示
lines[0]:将说话者显示在speakerText中,将文本显示在lineText中。 - 按空格键显示下一行,直到
lines.Count。显示最后一行后,隐藏box并记录Dialogue over;之后按空格键不会有任何效果。
按“开始”,然后按空格键阅读。接着按“检查”。
亲手试试
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using TMPro;
public class Dialogue : MonoBehaviour
{
public GameObject box;
public TMP_Text speakerText;
public TMP_Text lineText;
void Start()
{
// 显示第一句对话
}
void Update()
{
// 按空格键:显示下一句对话,或结束对话
}
}
Unity 游戏架构中的所有课
自己练习: Unity 在线编辑器