引用比 Find 更好
本课属于 Coddy Unity 学习旅程的“Unity 脚本基础”单元。第 59 课,共 85 课。
脚本可以通过四种方式访问另一个对象:在 Inspector 中设置字段、按名称使用 GameObject.Find 查找、按标签搜索,或按类型使用 FindAnyObjectByType 查找。对于从一开始就在场景中的对象,Unity 代码会使用 Inspector 字段,原因有三个:
- 速度。游戏开始前就会填好引用。每次搜索都会遍历场景中的对象,而在
Update()中搜索则会在每一帧都进行。 - 安全性。字符串中的名称会在有人重命名对象后失效:Find 会返回
null,错误会在之后使用它的那一行出现。Inspector 字段留空时会触发 UnassignedReferenceException,其中会指出字段和脚本的名称。 - 清晰性。Inspector 会显示脚本依赖的内容。Find 调用则会把这些依赖藏在代码中。
// 在 Inspector 中设置一次:不用查找,重命名也不影响它
[SerializeField] private Transform door;
// 每帧都会查找,门重命名后结果为 null
void Update()
{
Transform d = GameObject.Find("Door").transform;
}搜索也有适用场景:只在游戏运行后才存在的对象,例如游戏过程中生成的对象,以及必须在任何场景中都能运行的脚本。即便如此,也应在 Start() 中搜索一次,并将结果保存在字段中。
亲手试试
这节课没有代码挑战。
Unity 脚本基础中的所有课
自己练习: Unity 在线编辑器