129 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
| //#define ENABLE_LOGGING
 | |
| 
 | |
| namespace SRF.Service
 | |
| {
 | |
|     using System.Collections;
 | |
|     using System.Diagnostics;
 | |
|     using UnityEngine;
 | |
|     using Debug = UnityEngine.Debug;
 | |
| 
 | |
|     public abstract class SRSceneServiceBase<T, TImpl> : SRServiceBase<T>, IAsyncService
 | |
|         where T : class
 | |
|         where TImpl : Component
 | |
|     {
 | |
|         private TImpl _rootObject;
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Name of the scene this service's contents are within
 | |
|         /// </summary>
 | |
|         protected abstract string SceneName { get; }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Scene contents root object
 | |
|         /// </summary>
 | |
|         protected TImpl RootObject
 | |
|         {
 | |
|             get { return _rootObject; }
 | |
|         }
 | |
| 
 | |
|         public bool IsLoaded
 | |
|         {
 | |
|             get { return _rootObject != null; }
 | |
|         }
 | |
| 
 | |
|         [Conditional("ENABLE_LOGGING")]
 | |
|         private void Log(string msg, Object target)
 | |
|         {
 | |
|             //#if ENABLE_LOGGING
 | |
|             Debug.Log(msg, target);
 | |
|             //#endif
 | |
|         }
 | |
| 
 | |
|         protected override void Start()
 | |
|         {
 | |
|             base.Start();
 | |
| 
 | |
|             StartCoroutine(LoadCoroutine());
 | |
|         }
 | |
| 
 | |
|         protected override void OnDestroy()
 | |
|         {
 | |
|             if (IsLoaded)
 | |
|             {
 | |
|                 Destroy(_rootObject.gameObject);
 | |
|             }
 | |
| 
 | |
|             base.OnDestroy();
 | |
|         }
 | |
| 
 | |
|         protected virtual void OnLoaded() {}
 | |
| 
 | |
|         private IEnumerator LoadCoroutine()
 | |
|         {
 | |
|             if (_rootObject != null)
 | |
|             {
 | |
|                 yield break;
 | |
|             }
 | |
| 
 | |
|             SRServiceManager.LoadingCount++;
 | |
| #if UNITY_4_6 || UNITY_4_7 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2
 | |
|             if (Application.loadedLevelName == SceneName)
 | |
| #else
 | |
|             if (UnityEngine.SceneManagement.SceneManager.GetSceneByName(SceneName).isLoaded)
 | |
| #endif
 | |
|             {
 | |
|                 Log("[Service] Already in service scene {0}. Searching for root object...".Fmt(SceneName), this);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 Log("[Service] Loading scene ({0})".Fmt(SceneName), this);
 | |
| 
 | |
| #if UNITY_PRO_LICENSE || UNITY_5 || UNITY_5_3_OR_NEWER
 | |
| #if UNITY_4_6 || UNITY_4_7  || UNITY_5_0 || UNITY_5_1 || UNITY_5_2
 | |
|                 yield return Application.LoadLevelAdditiveAsync(SceneName);
 | |
| #else
 | |
|                 yield return UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(SceneName, UnityEngine.SceneManagement.LoadSceneMode.Additive);
 | |
| #endif
 | |
| #else
 | |
|                 Application.LoadLevelAdditive(SceneName);
 | |
| 				yield return new WaitForEndOfFrame();
 | |
| #endif
 | |
| 
 | |
|                 Log("[Service] Scene loaded. Searching for root object...", this);
 | |
|             }
 | |
| 
 | |
|             var go = GameObject.Find(SceneName);
 | |
| 
 | |
|             if (go == null)
 | |
|             {
 | |
|                 goto Error;
 | |
|             }
 | |
| 
 | |
|             var timpl = go.GetComponent<TImpl>();
 | |
| 
 | |
|             if (timpl == null)
 | |
|             {
 | |
|                 goto Error;
 | |
|             }
 | |
| 
 | |
|             _rootObject = timpl;
 | |
|             _rootObject.transform.parent = CachedTransform;
 | |
| 
 | |
|             DontDestroyOnLoad(go);
 | |
| 
 | |
|             Debug.Log("[Service] Loading {0} complete. (Scene: {1})".Fmt(GetType().Name, SceneName), this);
 | |
|             SRServiceManager.LoadingCount--;
 | |
| 
 | |
|             OnLoaded();
 | |
| 
 | |
|             yield break;
 | |
| 
 | |
|             Error:
 | |
| 
 | |
|             SRServiceManager.LoadingCount--;
 | |
|             Debug.LogError("[Service] Root object ({0}) not found".Fmt(SceneName), this);
 | |
|             enabled = false;
 | |
|         }
 | |
|     }
 | |
| }
 |