/// <summary>
        /// Must be called from an 'Update' method to perform any necessary tree
        /// updates.
        /// </summary>
        public void Update()
        {
            _nullCleanupTime += Time.deltaTime;
            if (_nullCleanupTime >= 1.0f)
            {
                RemoveNullObjectNodes();
                _nullCleanupTime = 0.0f;
            }

            if (_container == null)
            {
                if (LevelEditor.Instance != null && LevelEditor.Instance.curLevelChunk != null)
                {
                    _container = LevelEditor.Instance.curLevelChunk.trfmProps.gameObject;
                }
                else
                {
                    _container = GameObject.Find("[Container]");
                }
            }
            if (_container == null)
            {
                return;
            }

            GameObject[] sceneObjects = _container.GetAllChildren().ToArray();            // MonoBehaviour.FindObjectsOfType<GameObject>();
            foreach (GameObject gameObject in sceneObjects)
            {
                if (!IsGameObjectRegistered(gameObject))
                {
                    if (!RegisterGameObject(gameObject))
                    {
                        continue;
                    }
                }

                #if !USE_TRANSFORM_HAS_CHANGED
                Transform objectTransform = gameObject.transform;
                GameObjectTransformData objectTransformData = _gameObjectToTransformData[gameObject];
                if (objectTransformData.Position != objectTransform.position ||
                    objectTransformData.Rotation != objectTransform.rotation ||
                    objectTransformData.Scale != objectTransform.lossyScale)
                {
                    HandleObjectTransformChange(objectTransform);
                    _gameObjectToTransformData[gameObject] = GetGameObjectTransformData(gameObject);
                }
                #else
                Transform objectTransform = gameObject.transform;
                if (objectTransform.hasChanged)
                {
                    HandleObjectTransformChange(objectTransform);
                    objectTransform.hasChanged = false;
                }
                #endif
            }

            _sphereTree.PerformPendingUpdates();
        }
        private GameObjectTransformData GetGameObjectTransformData(GameObject gameObject)
        {
            Transform gameObjectTransform = gameObject.transform;

            var gameObjectTransformData = new GameObjectTransformData();

            gameObjectTransformData.Position = gameObjectTransform.position;
            gameObjectTransformData.Rotation = gameObjectTransform.rotation;
            gameObjectTransformData.Scale    = gameObjectTransform.lossyScale;

            return(gameObjectTransformData);
        }
        /// <summary>
        /// Must be called from an 'Update' method to perform any necessary tree
        /// updates.
        /// </summary>
        public void Update()
        {
            _nullCleanupTime += Time.deltaTime;
            if (_nullCleanupTime >= 1.0f)
            {
                RemoveNullObjectNodes();
                _nullCleanupTime = 0.0f;
            }

            GameObject[] sceneObjects = MonoBehaviour.FindObjectsOfType <GameObject>();
            foreach (GameObject gameObject in sceneObjects)
            {
                if (!IsGameObjectRegistered(gameObject))
                {
                    if (!RegisterGameObject(gameObject))
                    {
                        continue;
                    }
                }

                #if !USE_TRANSFORM_HAS_CHANGED
                Transform objectTransform = gameObject.transform;
                GameObjectTransformData objectTransformData = _gameObjectToTransformData[gameObject];
                if (objectTransformData.Position != objectTransform.position ||
                    objectTransformData.Rotation != objectTransform.rotation ||
                    objectTransformData.Scale != objectTransform.lossyScale)
                {
                    HandleObjectTransformChange(objectTransform);
                    _gameObjectToTransformData[gameObject] = GetGameObjectTransformData(gameObject);
                }
                #else
                Transform objectTransform = gameObject.transform;
                if (objectTransform.hasChanged)
                {
                    HandleObjectTransformChange(objectTransform);
                    objectTransform.hasChanged = false;
                }
                #endif
            }

            _sphereTree.PerformPendingUpdates();
        }