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.
CrowdControl/Assets/3rd/StompyRobot/SRF/Scripts/Service/SRDependencyServiceBase.cs

92 lines
2.4 KiB
C#

1 month ago
//#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();
}
}
}