InstantiateObject.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. namespace VEngine
  4. {
  5. public sealed class InstantiateObject : Operation
  6. {
  7. internal static readonly List<InstantiateObject> AllObjects = new List<InstantiateObject>();
  8. private Asset asset;
  9. public string path { get; internal set; }
  10. public GameObject result { get; private set; }
  11. public override void Start()
  12. {
  13. base.Start();
  14. asset = Asset.LoadAsync(path, typeof(GameObject));
  15. AllObjects.Add(this);
  16. }
  17. public static InstantiateObject InstantiateAsync(string assetPath)
  18. {
  19. var operation = new InstantiateObject
  20. {
  21. path = assetPath
  22. };
  23. operation.Start();
  24. return operation;
  25. }
  26. protected override void Update()
  27. {
  28. if (status == OperationStatus.Processing)
  29. {
  30. if (asset == null)
  31. {
  32. Finish("asset == null");
  33. return;
  34. }
  35. progress = asset.progress;
  36. if (!asset.isDone) return;
  37. if (asset.status == LoadableStatus.FailedToLoad)
  38. {
  39. Finish(asset.error);
  40. return;
  41. }
  42. if (asset.asset == null)
  43. {
  44. Finish("asset == null");
  45. return;
  46. }
  47. result = Object.Instantiate(asset.asset as GameObject);
  48. Finish();
  49. }
  50. }
  51. public void Destroy()
  52. {
  53. if (!isDone)
  54. {
  55. Finish("User Cancelled");
  56. return;
  57. }
  58. if (status == OperationStatus.Success)
  59. if (result != null)
  60. {
  61. Object.DestroyImmediate(result);
  62. result = null;
  63. }
  64. if (asset != null)
  65. {
  66. if (string.IsNullOrEmpty(asset.error)) asset.Release();
  67. asset = null;
  68. }
  69. }
  70. public static void UpdateObjects()
  71. {
  72. for (var index = 0; index < AllObjects.Count; index++)
  73. {
  74. var item = AllObjects[index];
  75. if (Updater.Instance.busy) return;
  76. if (!item.isDone || item.result != null) continue;
  77. AllObjects.RemoveAt(index);
  78. index--;
  79. item.Destroy();
  80. }
  81. }
  82. }
  83. }