using UnityEngine; namespace YooAsset { public sealed class AssetOperationHandle : OperationHandleBase { private System.Action _callback; internal AssetOperationHandle(ProviderBase provider) : base(provider) { } internal override void InvokeCallback() { _callback?.Invoke(this); } /// /// 完成委托 /// public event System.Action Completed { add { if (IsValid == false) throw new System.Exception($"{nameof(AssetOperationHandle)} is invalid"); if (Provider.IsDone) value.Invoke(this); else _callback += value; } remove { if (IsValid == false) throw new System.Exception($"{nameof(AssetOperationHandle)} is invalid"); _callback -= value; } } /// /// 资源对象 /// public UnityEngine.Object AssetObject { get { if (IsValid == false) return null; return Provider.AssetObject; } } /// /// 等待异步执行完毕 /// public void WaitForAsyncComplete() { if (IsValid == false) return; Provider.WaitForAsyncComplete(); } /// /// 释放资源句柄 /// public void Release() { this.ReleaseInternal(); } /// /// 同步初始化游戏对象 /// /// 父类对象 /// public GameObject InstantiateSync(Transform parent = null) { return InstantiateSyncInternal(Vector3.zero, Quaternion.identity, parent, false); } /// /// 同步初始化游戏对象 /// /// 坐标 /// 角度 /// 父类对象 public GameObject InstantiateSync(Vector3 position, Quaternion rotation, Transform parent = null) { return InstantiateSyncInternal(position, rotation, parent, true); } /// /// 异步初始化游戏对象 /// /// 父类对象 public InstantiateOperation InstantiateAsync(Transform parent = null) { return InstantiateAsyncInternal(Vector3.zero, Quaternion.identity, parent, false); } /// /// 异步初始化游戏对象 /// /// 坐标 /// 角度 /// 父类对象 public InstantiateOperation InstantiateAsync(Vector3 position, Quaternion rotation, Transform parent = null) { return InstantiateAsyncInternal(position, rotation, parent, true); } private GameObject InstantiateSyncInternal(Vector3 position, Quaternion rotation, Transform parent, bool setPositionRotation) { if (IsValid == false) return null; if (Provider.AssetObject == null) return null; if (setPositionRotation) { if (parent == null) return UnityEngine.Object.Instantiate(Provider.AssetObject as GameObject, position, rotation); else return UnityEngine.Object.Instantiate(Provider.AssetObject as GameObject, position, rotation, parent); } else { if (parent == null) return UnityEngine.Object.Instantiate(Provider.AssetObject as GameObject); else return UnityEngine.Object.Instantiate(Provider.AssetObject as GameObject, parent); } } private InstantiateOperation InstantiateAsyncInternal(Vector3 position, Quaternion rotation, Transform parent, bool setPositionRotation) { InstantiateOperation operation = new InstantiateOperation(this, position, rotation, parent, setPositionRotation); OperationSystem.ProcessOperaiton(operation); return operation; } } }