| API | 默认返回对象 | 包含未激活对象 | 返回数量 | 内存分配 (GC) | 性能 | 使用建议 |
|---|---|---|---|---|---|---|
FindObjectsOfType<T>() |
只包含激活对象(默认) | Unity 2020+ 可通过参数 true 包含未激活对象 |
全部匹配 | 会分配数组 | 较慢,频繁调用影响性能 | 初始化阶段可用,频繁调用不推荐 |
FindFirstObjectByType<T>() |
只包含激活对象(默认) | 通过 FindObjectsInactive.Include 可以包含未激活对象 |
一个 | 无 | 快 | 查找单一对象,初始化阶段或工具类适用 |
FindAnyObjectsByType<T>() |
只包含激活对象(默认) | 通过 FindObjectsInactive.Include 可以包含未激活对象 |
全部匹配 | 会分配数组 | 较快,比 FindObjectsOfType 优化过 |
初始化阶段收集全部对象,频繁调用仍不推荐 |
🔹 激活 vs 未激活对象
-
激活对象:GameObject 的
activeInHierarchy == true- 默认大多数查找方法只返回激活对象
- 通常用于运行时逻辑,保证对象可用
-
未激活对象:GameObject 的
activeInHierarchy == false- 仅在特定参数下才会被查找方法返回
- 用于初始化阶段、场景统计或调试
🔹 默认行为总结
| API | 默认只查激活对象 | 如何包含未激活对象 |
|---|---|---|
FindObjectsOfType<T>() |
是 | Unity 2020+ 通过 FindObjectsOfType<T>(true) |
FindFirstObjectByType<T>() |
是 | 通过 FindObjectsInactive.Include 参数 |
FindAnyObjectsByType<T>() |
是 | 通过 FindObjectsInactive.Include 参数 |
提示
- 频繁调用任何查找 API 都可能产生性能问题或 GC Alloc
- 运行时动态管理推荐使用注册表/缓存数组或事件驱动方式