unity editor 显示场景box轮廓

参考:

https://answers.unity.com/questions/8705/how-to-determine-bounding-box-of-scene.html

 

使用bonding显示场景内场景的Box

 

        #region Test
        private List<Bounds> _testWorldBoundsList = new List<Bounds>();
        private Vector3[,] _testGridPosArr = new Vector3[ScenePosManager.gridCount, ScenePosManager.gridCount];
        [Button("TestSceneBounds")]
        public void TestSceneBounds()
        {
            _testWorldBoundsList.Clear();
            for (int i = 0; i < SceneManager.sceneCount; i++)
            {
                var scene = SceneManager.GetSceneAt(i);
                GameObject[] gameObjects = scene.GetRootGameObjects();
                List<Renderer> renderers = new List<Renderer>();
                foreach (var o in gameObjects)
                {
                    renderers.AddRange(o.GetComponentsInChildren<Renderer>());
                }

                var worldBounds = renderers[0].bounds;
                for (int j = 1; j < renderers.Count; ++j)
                {
                    worldBounds.Encapsulate(renderers[j].bounds);
                }

                _testWorldBoundsList.Add(worldBounds);
            }

            for (int i = 0; i < ScenePosManager.gridCount; i++)
            {
                for (int j = 0; j < ScenePosManager.gridCount; j++)
                {
                    _testGridPosArr[i, j] = new Vector3(i * ScenePosManager.itemSize + ScenePosManager.halfGridSize, 0, j * ScenePosManager.itemSize + ScenePosManager.halfGridSize);
                }
            }
        }
        private void OnDrawGizmos()
        {
            foreach (var bounds in _testWorldBoundsList)
            {
                Gizmos.color = new Color(0f, 1f, 0f, 0.1f);
                Gizmos.DrawCube(bounds.center, bounds.size);

                Gizmos.color = new Color(0f, 1f, 0f, 1f);
                Gizmos.DrawWireCube(bounds.center, bounds.size);
            }

            if (_testWorldBoundsList.Count > 0)
            {
                for (int i = 0; i < ScenePosManager.gridCount - 1; i++)
                {
                    for (int j = 0; j < ScenePosManager.gridCount - 1; j++)
                    {
                        Gizmos.color = new Color(1.0f, 1f, 1f, 1f);
                        Gizmos.DrawLine(_testGridPosArr[i, j], _testGridPosArr[i + 1, j]);
                        Gizmos.DrawLine(_testGridPosArr[i, j], _testGridPosArr[i, j + 1]);
                        if (LevelController.ScenePosMgr.flags[i, j])
                        {
                            Gizmos.color = new Color(0.0f, 1f, 1f, 0.5f);
                            Gizmos.DrawCube(_testGridPosArr[i, j], new Vector3(50, 50, 50));
                        }
                    }
                }

                foreach (var instanceTestCenterPos in LevelController.ScenePosMgr.testCenterPos)
                {
                    Gizmos.color = new Color(1.0f, 0f, 0f, 0.5f);
                    Gizmos.DrawSphere(instanceTestCenterPos, 60);
                }
            }
        }

        #endregion

 

posted @ 2023-05-31 16:54  sun_dust_shadow  阅读(29)  评论(0编辑  收藏  举报