Unity获取场景中所有根物体

        每个物体都属于一个Scene,而通过Scene.GetRootGameObjects()接口就可以获得该Scene的所有根物体,我们只需要遍历所有Scene即可

List<GameObject> roots = new List<GameObject>();
for (int i = 0; i < SceneManager.sceneCount; i++)
{
    var scene = SceneManager.GetSceneAt(i);
    if (!scene.isLoaded) continue;
    
    roots.AddRange(scene.GetRootGameObjects());
}

        而被DontDestroyOnLoad处理过的物体就不再属于原来的场景了,它们被分配到一个隐藏的叫做DontDestroyOnLoad的新场景里。这个场景无法通过SceneMananger找到,但是我们可以曲线救国,准备一个已经被DontDestroyOnLoad的物体,然后通过接口GameObject.scene即可获取该场景了

foreach (var go in dontDestoryGo.scene.GetRootGameObjects())
{
    // 注意该场景里经常会有各种隐藏物体,把它们屏蔽掉
    if ((go.hideFlags & HideFlags.HideInHierarchy) == 0)
    {
        roots.Add(go);
    }
}

上面两部分结合起来,就能拿到与Hierarchy一致的所有根物体了

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity是一个流行的游戏引擎,它通常用于创建大型游戏。在Unity获取场景物体是一个重要任务,因为它涉及到游戏许多对象的处理和控制。通过优化这个过程,您可以获得更流畅的游戏性能。 下面我将讲解一些商业实践使用的一些方法: 第一,使用对象池:在游戏经常会创建和销毁大量的物体,在每次创建新的物体时,Unity都会申请内存和销毁旧的物体,这样会导致游戏的性能下降。通过使用对象池,我们可以重复使用旧的物体,而不是每次都创建新的物体。这样可以减少内存的分配和销毁,提高性能和稳定性。 第二,使用缓存:在Unity,每次使用Find获取GameObject引用都会访问场景树结构,这会导致性能下降。通过使用缓存,我们可以通过在场景加载时获取物体的引用,并将它们存储在全局或静态变量,以便在游戏运行时直接使用,这可以显著提高游戏性能。 第三,使用八叉树:如果您的场景有很多物体,那么查找和获取这些物体的引用会变得很麻烦。一种解决方案是使用八叉树。八叉树是一种用于快速定位物体的数据结构,可以将场景划分为多个较小的区域。这个技术使得查找特定的物体更加高效,并且可以减少游戏的卡顿现象。 第四,使用裁剪技术:在游戏,有些物体可能不需要显示出来。通过使用裁剪技术,我们可以检查每个物体是否在摄像机的视野内。这可以减少需要处理的物体数量,并提高性能。 总之,从各种角度来看,Unity优化场景物体获取是一个非常重要的任务。通过使用适当的技术,我们可以减少CPU时间,提高游戏性能并创造更好的游戏体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值