Example #1
0
        internal static GameObjectSceneRefCount *CreateOrRetainScene(Scene unityScene)
        {
            if (JobsUtility.IsExecutingJob)
            {
                throw new InvalidOperationException("You cannot CreateOrRetain a GameObjectSceneHandle from a Job");
            }

            if (!unityScene.IsValid())
            {
                throw new InvalidOperationException("Unity Scene is invalid.");
            }

            SceneEquatable unitySceneEquatable = unityScene;

            // Lazy create the LoadedScenes container
            GameObjectSceneManager.Initialize();

            // First Check if we have it loaded
            var loadedScenes = GameObjectSceneManager.LoadedScenes;

            loadedScenes.TryGetValue(unityScene, out var unitySceneHandleIntPtr);
            GameObjectSceneRefCount *unitySceneHandle = (GameObjectSceneRefCount *)unitySceneHandleIntPtr;

            if (unitySceneHandle == null)
            {
                // Create a new handle
                unitySceneHandle = (GameObjectSceneRefCount *)UnsafeUtility.Malloc(sizeof(GameObjectSceneRefCount), 16, Allocator.Persistent);
                *unitySceneHandle = new GameObjectSceneRefCount(unityScene);

                loadedScenes[unitySceneEquatable] = (IntPtr)unitySceneHandle;
            }

            return(unitySceneHandle);
        }
Example #2
0
        internal static void FinalizeGameObjectSceneEntity(EntityManager entityManager, Entity sceneEntity, Scene gameObjectScene, SceneSystem sceneSystem)
        {
            // Create handle for ref counting
            unsafe
            {
                var gameObjectSceneReference = new GameObjectSceneData
                {
                    Scene = gameObjectScene,
                    gameObjectSceneHandle = GameObjectSceneRefCount.CreateOrRetainScene(gameObjectScene),
                };

                entityManager.AddSharedComponentData(sceneEntity, gameObjectSceneReference);
            }

            #if UNITY_EDITOR
            entityManager.SetName(sceneEntity, $"GameObject Scene: {gameObjectScene.name}");
            #endif

            var subSceneDataEnum = GetSubScenes(gameObjectScene);
            entityManager.AddBuffer <GameObjectSceneSubScene>(sceneEntity);

            while (subSceneDataEnum.MoveNext())
            {
                var subSceneData           = subSceneDataEnum.Current;
                var subSceneLoadParameters = new SceneSystem.LoadParameters {
                    AutoLoad = subSceneData.AutoLoad
                };
                var subSceneEntity = sceneSystem.GetSceneEntity(subSceneData.SceneGUID);
                if (subSceneEntity == Entity.Null)
                {
                    subSceneEntity = sceneSystem.LoadSceneAsync(subSceneData.SceneGUID, subSceneLoadParameters);
                }

                var subSceneBuffer = entityManager.GetBuffer <GameObjectSceneSubScene>(sceneEntity);
                subSceneBuffer.Add(new GameObjectSceneSubScene
                {
                    SceneEntity = subSceneEntity,
                });
            }
        }