void IRegionEventHandler.CreateSubScene(eSubSceneMode subSceneMode, eSubSceneType subSceneType) { string subScenePath = WorldUtility.GetSubScenePath(gameObject.scene.path, Id, subSceneMode, subSceneType); string subScenePathFull = WorldUtility.GetFullPath(subScenePath); if (GetSubSceneRoot(subSceneType) != null) { return; } else if (System.IO.File.Exists(subScenePathFull)) { Debug.LogFormat("SubScene \"{0}\" already exists but is not loaded!", subScenePath); return; } else { var rootGO = new GameObject(WorldUtility.GetSubSceneRootName(subSceneMode, subSceneType), typeof(SubScene)); rootGO.GetComponent<SubScene>().Initialize(subSceneMode, subSceneType); var root = rootGO.transform; root.SetParent(transform, false); } }
void IWorldEventHandler.ImportSubScenes() { if (editorSubScenesLoaded) { return; } var regions = new List<RegionBase>(); for (int i = 0; i < transform.childCount; i++) { var region = transform.GetChild(i).GetComponent<RegionBase>(); if (region) { regions.Add(region); } } foreach (var region in regions) { foreach (var subSceneType in Enum.GetValues(typeof(eSubSceneType)).Cast<eSubSceneType>()) { foreach (var subSceneMode in region.AvailableSubSceneModes) { if (region.GetSubSceneRoot(subSceneType, subSceneMode) != null) { Debug.LogErrorFormat("The \"{0}\" of Region \"{1}\" is already loaded!", WorldUtility.GetSubSceneRootName(subSceneMode, subSceneType), region.name); continue; } //paths string subScenePath = WorldUtility.GetSubScenePath(gameObject.scene.path, region.Id, subSceneMode, subSceneType); string subScenePathFull = WorldUtility.GetFullPath(subScenePath); Scene subScene = new Scene(); if (System.IO.File.Exists(subScenePathFull)) { subScene = UnityEditor.SceneManagement.EditorSceneManager.OpenScene(subScenePath, UnityEditor.SceneManagement.OpenSceneMode.Additive); } //move subScene content to open world scene if (subScene.IsValid()) { var rootGO = subScene.GetRootGameObjects()[0]; UnityEditor.SceneManagement.EditorSceneManager.MoveGameObjectToScene(rootGO, this.gameObject.scene); var root = rootGO.transform; root.SetParent(region.transform, false); if (!root.gameObject.activeSelf) { root.gameObject.SetActive(true); } } //end: close subScene UnityEditor.SceneManagement.EditorSceneManager.CloseScene(subScene, true); } } } UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(gameObject.scene); editorSubScenesLoaded = true; }