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); }
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, }); } }