AssetOperationHandle.cs 4.0 KB

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