| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 | using System.Collections.Generic;using UnityEngine;namespace VEngine{    public sealed class InstantiateObject : Operation    {        internal static readonly List<InstantiateObject> AllObjects = new List<InstantiateObject>();        private Asset asset;        public string path { get; internal set; }        public GameObject result { get; private set; }        public override void Start()        {            base.Start();            asset = Asset.LoadAsync(path, typeof(GameObject));            AllObjects.Add(this);        }        public static InstantiateObject InstantiateAsync(string assetPath)        {            var operation = new InstantiateObject            {                path = assetPath            };            operation.Start();            return operation;        }        protected override void Update()        {            if (status == OperationStatus.Processing)            {                if (asset == null)                {                    Finish("asset == null");                    return;                }                progress = asset.progress;                if (!asset.isDone) return;                if (asset.status == LoadableStatus.FailedToLoad)                {                    Finish(asset.error);                    return;                }                if (asset.asset == null)                {                    Finish("asset == null");                    return;                }                result = Object.Instantiate(asset.asset as GameObject);                Finish();            }        }        public void Destroy()        {            if (!isDone)            {                Finish("User Cancelled");                return;            }            if (status == OperationStatus.Success)                if (result != null)                {                    Object.DestroyImmediate(result);                    result = null;                }            if (asset != null)            {                if (string.IsNullOrEmpty(asset.error)) asset.Release();                asset = null;            }        }        public static void UpdateObjects()        {            for (var index = 0; index < AllObjects.Count; index++)            {                var item = AllObjects[index];                if (Updater.Instance.busy) return;                if (!item.isDone || item.result != null) continue;                AllObjects.RemoveAt(index);                index--;                item.Destroy();            }        }    }}
 |