Menu
CoddyTech

检视面板中的列表

本课属于 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 列表。

challenge icon

挑战

简单

逐行显示 Mira 和 Tom 的对话。

  1. 声明一个 [System.Serializable] 类 Line,其中包含公共字符串 speaker 和 text,并添加 public List<Line> lines;。
  2. 开始时显示 lines[0]:将说话者显示在 speakerText 中,将文本显示在 lineText 中。
  3. 按空格键显示下一行,直到 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 在线编辑器