using UnityEngine; using UnityEngine.Events; namespace AssetManagement { public abstract class AsyncLoadUnit { protected AssetPathHub pathHub; public string name { get; private set; } public int priority { get; set; } public string error { get; private set; } public AsyncLoadUnitState state { get; private set; } public event UnityAction onComplete; public void Init(AssetPathHub pathHub, string assetName, int priority) { name = assetName; this.priority = priority; this.pathHub = pathHub; } public void Load() { if (state != AsyncLoadUnitState.Loading) { string startError; var operation = StartOperation(out startError); error = startError; if (string.IsNullOrEmpty(error)) operation.completed += OnOperationComplete; state = string.IsNullOrEmpty(error) ? AsyncLoadUnitState.Loading : AsyncLoadUnitState.Done; } } public abstract float GetProgress(); /// /// 开始当前配置的任务 /// protected abstract AsyncOperation StartOperation(out string startError); /// /// 处理完成的任务,并返回错误 /// protected abstract string HandleOperation(AsyncOperation operation); private void OnOperationComplete(AsyncOperation operation) { error = HandleOperation(operation); state = AsyncLoadUnitState.Done; if (onComplete != null) onComplete(this); } } public enum AsyncLoadUnitState { Idle, Loading, Done, } }