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