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