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