首页/ 第 6 章 · 游戏对象与组件交互/ 第 79 课
LESSON 79 · 游戏对象与组件交互

查找对象与组件 Find 系列

查找方法已掌握。下一课学组件访问 GetComponent。

⏱ 约 14 分钟📊 难度:入门🗂 第 6 章 · 游戏对象与组件交互📍 第 79 / 300 课
课程进度
79 / 300

🎯本节学习目标

  • 掌握常用查找方法
  • 理解查找的性能成本
  • 学会缓存查找结果

🚀课程导读

脚本怎么“找到”场景里的其他对象?本课讲透 Find 系列方法,并教你优雅地管理引用。

按名称与标签查找

最快的方式。

  1. 【按名称】GameObject.Find("Enemy"); 返回名为 Enemy 的对象(只能找激活的对象)。
  2. 【按标签】GameObject.FindWithTag("Enemy"); 返回第一个该标签的对象;FindGameObjectsWithTag 返回数组(全部)。
  3. 【推荐】FindWithTag 比 Find 快,且不受改名影响,优先用标签。
  4. 【限制】Find 系列性能较慢,且只能在激活对象里找。
  5. 【使用注意】不要在 Update 里每帧调用 Find,应在 Start/Awake 里查找并缓存。
  6. 【单例替代】项目中常用“单例/静态引用”来避免 Find(第 86 课)。
⚠️
每帧 Find 是性能杀手。一次查找、存进字段、反复使用,这是黄金法则。

按类型查找与组件查找

更通用。

  1. 【查找第一个组件类型】FindObjectOfType<Player>() 返回场景中第一个 Player 脚本(MonoBehaviour 已弃用单数版本,新版本用 FindFirstObjectByType)。
  2. 【查找全部】FindObjectsOfType<Enemy>() 返回数组(新版 FindObjectsByType)。
  3. 【获取自身组件】GetComponent<Rigidbody>()(第 80 课详讲)。
  4. 【子对象组件】GetComponentInChildren<T>() 在子对象中找;GetComponentInParent<T>() 在父对象中找。
  5. 【实战】在 GameManager 的 Start 里:Player player = FindObjectOfType<Player>(); 拿到玩家引用。
  6. 【注意】新版 Unity 推荐 FindFirstObjectByType / FindObjectsByType(加 FindObjectsSortMode 参数)。
  7. 这些查找按类型扫描,相对较慢,同样要缓存。
💡
能不 Find 就不 Find:优先用 public 字段在 Inspector 拖引用(第 84 课序列化)。

常见错误与排查

错误:Find 返回 null?
原因:对象未激活、名字不对或标签错误
解决:确认对象存在且激活;检查名字/标签拼写;用 Debug.Log 验证。

动手练习

课后小任务(做出来才算真的学会)

  • 用 FindWithTag 查找一个敌人对象
  • 用 FindObjectOfType 获取玩家脚本引用
  • 把查找结果缓存到字段并在 Update 中复用

本节小结

查找方法已掌握。下一课学组件访问 GetComponent。

完成打卡后,主站会实时更新你的学习进度 🎯

← 上一课标签 Tag 与层级 Layer