You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
3.4 KiB
C#
129 lines
3.4 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;
|
|
}
|
|
}
|
|
}
|