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