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.
92 lines
2.4 KiB
C#
92 lines
2.4 KiB
C#
//#define ENABLE_LOGGING
|
|
|
|
namespace SRF.Service
|
|
{
|
|
using System;
|
|
using System.Collections;
|
|
using System.Diagnostics;
|
|
using UnityEngine;
|
|
using Debug = UnityEngine.Debug;
|
|
using Object = UnityEngine.Object;
|
|
|
|
/// <summary>
|
|
/// A service which has async-loading dependencies
|
|
/// </summary>
|
|
/// <typeparam name="T"></typeparam>
|
|
public abstract class SRDependencyServiceBase<T> : SRServiceBase<T>, IAsyncService where T : class
|
|
{
|
|
private bool _isLoaded;
|
|
protected abstract Type[] Dependencies { get; }
|
|
|
|
public bool IsLoaded
|
|
{
|
|
get { return _isLoaded; }
|
|
}
|
|
|
|
[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(LoadDependencies());
|
|
}
|
|
|
|
/// <summary>
|
|
/// Invoked once all dependencies are loaded
|
|
/// </summary>
|
|
protected virtual void OnLoaded() {}
|
|
|
|
private IEnumerator LoadDependencies()
|
|
{
|
|
SRServiceManager.LoadingCount++;
|
|
|
|
Log("[Service] Loading service ({0})".Fmt(GetType().Name), this);
|
|
|
|
foreach (var d in Dependencies)
|
|
{
|
|
var hasService = SRServiceManager.HasService(d);
|
|
|
|
Log("[Service] Resolving Service ({0}) HasService: {1}".Fmt(d.Name, hasService), this);
|
|
|
|
if (hasService)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
var service = SRServiceManager.GetService(d);
|
|
|
|
if (service == null)
|
|
{
|
|
Debug.LogError("[Service] Could not resolve dependency ({0})".Fmt(d.Name));
|
|
enabled = false;
|
|
yield break;
|
|
}
|
|
|
|
var a = service as IAsyncService;
|
|
|
|
if (a != null)
|
|
{
|
|
while (!a.IsLoaded)
|
|
{
|
|
yield return new WaitForEndOfFrame();
|
|
}
|
|
}
|
|
}
|
|
|
|
Log("[Service] Loading service ({0}) complete.".Fmt(GetType().Name), this);
|
|
|
|
_isLoaded = true;
|
|
SRServiceManager.LoadingCount--;
|
|
|
|
OnLoaded();
|
|
}
|
|
}
|
|
}
|