| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 | 
							- using System;
 
- using System.Collections;
 
- using System.Collections.Generic;
 
- using System.IO;
 
- using UnityEngine;
 
- using UnityEngine.SceneManagement;
 
- namespace VEngine
 
- {
 
-     public class Scene : Loadable, IEnumerator
 
-     {
 
-         internal static readonly List<Scene> Unused = new List<Scene>();
 
-         public static Action<Scene> onSceneUnloaded;
 
-         public static Action<Scene> onSceneLoaded;
 
-         internal readonly List<Scene> additives = new List<Scene>();
 
-         public Action<Scene> completed;
 
-         protected string sceneName;
 
-         public Action<Scene> updated;
 
-         public AsyncOperation operation { get; protected set; }
 
-         public static Scene main { get; private set; }
 
-         public static Scene current { get; private set; }
 
-         protected Scene parent { get; set; }
 
-         protected internal LoadSceneMode loadSceneMode { get; set; }
 
-         public bool MoveNext()
 
-         {
 
-             return !isDone;
 
-         }
 
-         public void Reset()
 
-         {
 
-         }
 
-         public object Current => null;
 
-         public static Scene LoadAsync(string assetPath, Action<Scene> completed = null, bool additive = false)
 
-         {
 
-             if (string.IsNullOrEmpty(assetPath)) throw new ArgumentNullException(nameof(assetPath));
 
-             var scene = Versions.CreateScene(assetPath, additive);
 
-             if (completed != null) scene.completed += completed;
 
-             current = scene;
 
-             scene.Load();
 
-             return scene;
 
-         }
 
-         public static Scene LoadAdditiveAsync(string assetPath, Action<Scene> completed = null)
 
-         {
 
-             return LoadAsync(assetPath, completed, true);
 
-         }
 
-         protected override void OnUpdate()
 
-         {
 
-             if (status == LoadableStatus.Loading)
 
-             {
 
-                 UpdateLoading();
 
-                 if (updated != null) updated(this);
 
-             }
 
-         }
 
-         protected void UpdateLoading()
 
-         {
 
-             if (operation == null)
 
-             {
 
-                 Finish("operation == null");
 
-                 return;
 
-             }
 
-             progress = 0.5f + operation.progress * 0.5f;
 
-             if (operation.allowSceneActivation)
 
-             {
 
-                 if (!operation.isDone) return;
 
-             }
 
-             else
 
-             {
 
-                 // https://docs.unity3d.com/ScriptReference/AsyncOperation-allowSceneActivation.html
 
-                 if (operation.progress < 0.9f) return;
 
-             }
 
-             Finish();
 
-         }
 
-         protected override void OnLoad()
 
-         {
 
-             PrepareToLoad();
 
-             operation = SceneManager.LoadSceneAsync(sceneName, loadSceneMode);
 
-         }
 
-         protected void PrepareToLoad()
 
-         {
 
-             sceneName = Path.GetFileNameWithoutExtension(pathOrURL);
 
-             if (loadSceneMode == LoadSceneMode.Single)
 
-             {
 
-                 if (main != null)
 
-                 {
 
-                     main.Release();
 
-                     main = null;
 
-                 }
 
-                 main = this;
 
-             }
 
-             else
 
-             {
 
-                 if (main != null)
 
-                 {
 
-                     main.additives.Add(this);
 
-                     parent = main;
 
-                 }
 
-             }
 
-         }
 
-         protected override void OnUnused()
 
-         {
 
-             completed = null;
 
-             Unused.Add(this);
 
-         }
 
-         protected override void OnUnload()
 
-         {
 
-             if (loadSceneMode == LoadSceneMode.Additive)
 
-             {
 
-                 if (main != null) main.additives.Remove(this);
 
-                 if (parent != null && string.IsNullOrEmpty(error))
 
-                     SceneManager.UnloadSceneAsync(sceneName);
 
-                 parent = null;
 
-             }
 
-             else
 
-             {
 
-                 foreach (var item in additives)
 
-                 {
 
-                     item.Release();
 
-                     item.parent = null;
 
-                 }
 
-                 additives.Clear();
 
-             }
 
-             if (onSceneUnloaded != null) onSceneUnloaded.Invoke(this);
 
-         }
 
-         protected override void OnComplete()
 
-         {
 
-             if (onSceneLoaded != null) onSceneLoaded.Invoke(this);
 
-             if (completed == null) return;
 
-             var saved = completed;
 
-             if (completed != null) completed(this);
 
-             completed -= saved;
 
-         }
 
-         public static void UpdateScenes()
 
-         {
 
-             if (current == null || !current.isDone) return;
 
-             for (var index = 0; index < Unused.Count; index++)
 
-             {
 
-                 var item = Unused[index];
 
-                 if (Updater.Instance.busy) break;
 
-                 if (!item.isDone) continue;
 
-                 Unused.RemoveAt(index);
 
-                 index--;
 
-                 item.Unload();
 
-             }
 
-         }
 
-     }
 
- }
 
 
  |