AssetOperationHandle.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace YooAsset
  5. {
  6. public sealed class AssetOperationHandle : OperationHandleBase, IDisposable
  7. {
  8. private System.Action<AssetOperationHandle> _callback;
  9. internal AssetOperationHandle(ProviderBase provider) : base(provider)
  10. {
  11. }
  12. internal override void InvokeCallback()
  13. {
  14. _callback?.Invoke(this);
  15. }
  16. /// <summary>
  17. /// 完成委托
  18. /// </summary>
  19. public event System.Action<AssetOperationHandle> Completed
  20. {
  21. add
  22. {
  23. if (IsValidWithWarning == false)
  24. throw new System.Exception($"{nameof(AssetOperationHandle)} is invalid");
  25. if (Provider.IsDone)
  26. value.Invoke(this);
  27. else
  28. _callback += value;
  29. }
  30. remove
  31. {
  32. if (IsValidWithWarning == false)
  33. throw new System.Exception($"{nameof(AssetOperationHandle)} is invalid");
  34. _callback -= value;
  35. }
  36. }
  37. /// <summary>
  38. /// 等待异步执行完毕
  39. /// </summary>
  40. public void WaitForAsyncComplete()
  41. {
  42. if (IsValidWithWarning == false)
  43. return;
  44. Provider.WaitForAsyncComplete();
  45. }
  46. /// <summary>
  47. /// 释放资源句柄
  48. /// </summary>
  49. public void Release()
  50. {
  51. this.ReleaseInternal();
  52. }
  53. /// <summary>
  54. /// 释放资源句柄
  55. /// </summary>
  56. public void Dispose()
  57. {
  58. this.ReleaseInternal();
  59. }
  60. /// <summary>
  61. /// 资源对象
  62. /// </summary>
  63. public UnityEngine.Object AssetObject
  64. {
  65. get
  66. {
  67. if (IsValidWithWarning == false)
  68. return null;
  69. return Provider.AssetObject;
  70. }
  71. }
  72. /// <summary>
  73. /// 获取资源对象
  74. /// </summary>
  75. /// <typeparam name="TAsset">资源类型</typeparam>
  76. public TAsset GetAssetObject<TAsset>() where TAsset : UnityEngine.Object
  77. {
  78. if (IsValidWithWarning == false)
  79. return null;
  80. return Provider.AssetObject as TAsset;
  81. }
  82. /// <summary>
  83. /// 同步初始化游戏对象
  84. /// </summary>
  85. public GameObject InstantiateSync()
  86. {
  87. return InstantiateSyncInternal(false, Vector3.zero, Quaternion.identity, null, false);
  88. }
  89. public GameObject InstantiateSync(Transform parent)
  90. {
  91. return InstantiateSyncInternal(false, Vector3.zero, Quaternion.identity, parent, false);
  92. }
  93. public GameObject InstantiateSync(Transform parent, bool worldPositionStays)
  94. {
  95. return InstantiateSyncInternal(false, Vector3.zero, Quaternion.identity, parent, worldPositionStays);
  96. }
  97. public GameObject InstantiateSync(Vector3 position, Quaternion rotation)
  98. {
  99. return InstantiateSyncInternal(true, position, rotation, null, false);
  100. }
  101. public GameObject InstantiateSync(Vector3 position, Quaternion rotation, Transform parent)
  102. {
  103. return InstantiateSyncInternal(true, position, rotation, parent, false);
  104. }
  105. /// <summary>
  106. /// 异步初始化游戏对象
  107. /// </summary>
  108. public InstantiateOperation InstantiateAsync()
  109. {
  110. return InstantiateAsyncInternal(false, Vector3.zero, Quaternion.identity, null, false);
  111. }
  112. public InstantiateOperation InstantiateAsync(Transform parent)
  113. {
  114. return InstantiateAsyncInternal(false, Vector3.zero, Quaternion.identity, parent, false);
  115. }
  116. public InstantiateOperation InstantiateAsync(Transform parent, bool worldPositionStays)
  117. {
  118. return InstantiateAsyncInternal(false, Vector3.zero, Quaternion.identity, parent, worldPositionStays);
  119. }
  120. public InstantiateOperation InstantiateAsync(Vector3 position, Quaternion rotation)
  121. {
  122. return InstantiateAsyncInternal(true, position, rotation, null, false);
  123. }
  124. public InstantiateOperation InstantiateAsync(Vector3 position, Quaternion rotation, Transform parent)
  125. {
  126. return InstantiateAsyncInternal(true, position, rotation, parent, false);
  127. }
  128. private GameObject InstantiateSyncInternal(bool setPositionAndRotation, Vector3 position, Quaternion rotation, Transform parent, bool worldPositionStays)
  129. {
  130. if (IsValidWithWarning == false)
  131. return null;
  132. if (Provider.AssetObject == null)
  133. return null;
  134. return InstantiateOperation.InstantiateInternal(Provider.AssetObject, setPositionAndRotation, position, rotation, parent, worldPositionStays);
  135. }
  136. private InstantiateOperation InstantiateAsyncInternal(bool setPositionAndRotation, Vector3 position, Quaternion rotation, Transform parent, bool worldPositionStays)
  137. {
  138. InstantiateOperation operation = new InstantiateOperation(this, setPositionAndRotation, position, rotation, parent, worldPositionStays);
  139. OperationSystem.StartOperation(operation);
  140. return operation;
  141. }
  142. }
  143. }