103 lines
2.5 KiB
C#
103 lines
2.5 KiB
C#
using System;
|
|
using Eflatun.SceneReference;
|
|
using UnityEditor;
|
|
|
|
#if UNITY_EDITOR
|
|
using UnityEditor.SceneManagement;
|
|
#endif
|
|
using UnityEngine;
|
|
using UnityEngine.SceneManagement;
|
|
|
|
namespace KitsuneCafe.Scene
|
|
{
|
|
[ExecuteInEditMode]
|
|
public class Subscene : MonoBehaviour
|
|
{
|
|
[SerializeField]
|
|
private SceneReference scene;
|
|
|
|
[SerializeField]
|
|
private bool loadOnStart;
|
|
|
|
private AsyncOperation sceneLoadOperation;
|
|
|
|
public event Action SceneLoaded = delegate { };
|
|
private bool isLoading = false;
|
|
private bool isLoaded = false;
|
|
|
|
private void Start()
|
|
{
|
|
#if UNITY_EDITOR
|
|
EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
|
|
if (!EditorApplication.isPlayingOrWillChangePlaymode)
|
|
{
|
|
LoadPreviewScene();
|
|
}
|
|
#else
|
|
|
|
if (loadOnStart && !isLoading)
|
|
{
|
|
Load();
|
|
isLoading = true;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
private void OnPlayModeStateChanged(PlayModeStateChange change)
|
|
{
|
|
switch (change)
|
|
{
|
|
case PlayModeStateChange.EnteredEditMode:
|
|
LoadPreviewScene();
|
|
break;
|
|
case PlayModeStateChange.ExitingEditMode:
|
|
UnloadPreviewScene();
|
|
break;
|
|
}
|
|
}
|
|
|
|
#if UNITY_EDITOR
|
|
private void LoadPreviewScene()
|
|
{
|
|
if (scene.Path == null || SceneManager.GetSceneByPath(scene.Path).isLoaded)
|
|
{
|
|
return;
|
|
}
|
|
|
|
EditorSceneManager.OpenScene(scene.Path, OpenSceneMode.Additive);
|
|
}
|
|
|
|
private void UnloadPreviewScene()
|
|
{
|
|
if (scene.LoadedScene != null)
|
|
{
|
|
// EditorSceneManager.CloseScene(scene.LoadedScene, false);
|
|
if (loadOnStart)
|
|
{
|
|
Load();
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
private void Load()
|
|
{
|
|
if (sceneLoadOperation == null)
|
|
{
|
|
sceneLoadOperation = SceneManager.LoadSceneAsync(
|
|
scene.BuildIndex,
|
|
LoadSceneMode.Additive
|
|
);
|
|
|
|
sceneLoadOperation.completed += OnCompleted;
|
|
}
|
|
}
|
|
|
|
private void OnCompleted(AsyncOperation _operation)
|
|
{
|
|
isLoaded = true;
|
|
SceneLoaded.Invoke();
|
|
}
|
|
}
|
|
}
|