| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 | using System;using System.Collections;using System.Collections.Generic;namespace VEngine{    public enum OperationStatus    {        Idle,        Processing,        Success,        Failed    }    public class Operation : IEnumerator    {        internal static readonly List<Operation> Processing = new List<Operation>();        public Action<Operation> completed;        public OperationStatus status { get; protected set; } = OperationStatus.Idle;        public float progress { get; protected set; }        public bool isDone => status == OperationStatus.Failed || status == OperationStatus.Success;        public string error { get; protected set; }        public bool MoveNext()        {            return !isDone;        }        public void Reset()        {        }        public object Current => null;        internal static void Process(Operation operation)        {            operation.status = OperationStatus.Processing;            Processing.Add(operation);        }        protected virtual void Update()        {        }        public virtual void Start()        {            status = OperationStatus.Processing;            Process(this);        }        public void Cancel()        {            Finish("User Cancel.");        }        protected void Finish(string errorCode = null)        {            error = errorCode;            status = string.IsNullOrEmpty(error) ? OperationStatus.Success : OperationStatus.Failed;            progress = 1;        }        protected void Complete()        {            if (completed == null) return;            var saved = completed;            completed.Invoke(this);            completed -= saved;        }        public static void UpdateAll()        {            for (var index = 0; index < Processing.Count; index++)            {                var item = Processing[index];                if (Updater.Instance.busy) return;                item.Update();                if (!item.isDone) continue;                Processing.RemoveAt(index);                index--;                if (item.status == OperationStatus.Failed)                    Logger.W("Unable to complete {0} with error: {1}", item.GetType().Name, item.error);                item.Complete();            }            InstantiateObject.UpdateObjects();        }    }}
 |