AssetHandle.cs 5.1 KB

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