You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中FindObjectsOfType方法的对象查找顺序疑问

Unity中FindObjectsOfType的返回顺序规则

FindObjectsOfType的返回顺序既不是随机的,也不遵循层级面板显示顺序或对象名称排序,它的核心依据是对象的内部实例ID(InstanceID):

  • 实例ID是Unity在对象创建时自动分配的唯一标识,分配顺序完全取决于对象的创建时机——包括编辑器中创建对象的先后顺序,或者运行时实例化的先后顺序。
  • 调整层级面板的对象排列、修改对象名称,都不会改变已创建对象的实例ID,因此返回列表的顺序不会发生变化。
  • 运行时动态实例化的对象,其实例ID会比之前创建的对象更大,通常会排在返回列表的末尾(按ID递增顺序排列)。

如何获得可控的排序结果

由于Unity官方未将此顺序列为公开稳定的行为,绝对不要依赖默认返回顺序实现核心逻辑。如果需要固定顺序,推荐以下方案:

  1. 手动赋值:直接在Inspector面板中拖拽AreaMeshHandler对象到areaMeshHandlers列表中,完全控制顺序。
  2. 获取后自定义排序:调用FindObjectsOfType后,根据业务需求对列表进行排序,示例代码如下:
    [SerializeField] List<AreaMeshHandler> areaMeshHandlers;
    
    void Awake()
    {
        areaMeshHandlers = FindObjectsOfType<AreaMeshHandler>(true).ToList();
        
        // 方案1:按对象名称排序
        areaMeshHandlers.Sort((a, b) => a.gameObject.name.CompareTo(b.gameObject.name));
        
        // 方案2:按自定义排序字段排序(需在AreaMeshHandler中添加public int sortOrder字段)
        // areaMeshHandlers.Sort((a, b) => a.sortOrder.CompareTo(b.sortOrder));
        
        // 方案3:按层级面板路径排序(仅编辑器环境可用)
        // areaMeshHandlers.Sort((a, b) => string.Compare(UnityEditor.EditorUtility.GetObjectPath(a.gameObject), UnityEditor.EditorUtility.GetObjectPath(b.gameObject)));
    }
    
    注:如果需要在运行时按层级路径排序,需自行实现递归获取父对象拼接路径的方法。

内容的提问来源于stack exchange,提问作者Noam Riahi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:05:38