| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 | using System;using System.Collections.Generic;using UnityEngine;namespace YooAsset{	public sealed class AssetOperationHandle : OperationHandleBase, IDisposable	{		private System.Action<AssetOperationHandle> _callback;		internal AssetOperationHandle(ProviderBase provider) : base(provider)		{		}		internal override void InvokeCallback()		{			_callback?.Invoke(this);		}		/// <summary>		/// 完成委托		/// </summary>		public event System.Action<AssetOperationHandle> Completed		{			add			{				if (IsValidWithWarning == false)					throw new System.Exception($"{nameof(AssetOperationHandle)} is invalid");				if (Provider.IsDone)					value.Invoke(this);				else					_callback += value;			}			remove			{				if (IsValidWithWarning == false)					throw new System.Exception($"{nameof(AssetOperationHandle)} is invalid");				_callback -= value;			}		}		/// <summary>		/// 等待异步执行完毕		/// </summary>		public void WaitForAsyncComplete()		{			if (IsValidWithWarning == false)				return;			Provider.WaitForAsyncComplete();		}		/// <summary>		/// 释放资源句柄		/// </summary>		public void Release()		{			this.ReleaseInternal();		}		/// <summary>		/// 释放资源句柄		/// </summary>		public void Dispose()		{			this.ReleaseInternal();		}		/// <summary>		/// 资源对象		/// </summary>		public UnityEngine.Object AssetObject		{			get			{				if (IsValidWithWarning == false)					return null;				return Provider.AssetObject;			}		}		/// <summary>		/// 获取资源对象		/// </summary>		/// <typeparam name="TAsset">资源类型</typeparam>		public TAsset GetAssetObject<TAsset>() where TAsset : UnityEngine.Object		{			if (IsValidWithWarning == false)				return null;			return Provider.AssetObject as TAsset;		}		/// <summary>		/// 同步初始化游戏对象		/// </summary>		public GameObject InstantiateSync()		{			return InstantiateSyncInternal(false, Vector3.zero, Quaternion.identity, null, false);		}		public GameObject InstantiateSync(Transform parent)		{			return InstantiateSyncInternal(false, Vector3.zero, Quaternion.identity, parent, false);		}		public GameObject InstantiateSync(Transform parent, bool worldPositionStays)		{			return InstantiateSyncInternal(false, Vector3.zero, Quaternion.identity, parent, worldPositionStays);		}		public GameObject InstantiateSync(Vector3 position, Quaternion rotation)		{			return InstantiateSyncInternal(true, position, rotation, null, false);		}		public GameObject InstantiateSync(Vector3 position, Quaternion rotation, Transform parent)		{			return InstantiateSyncInternal(true, position, rotation, parent, false);		}		/// <summary>		/// 异步初始化游戏对象		/// </summary>		public InstantiateOperation InstantiateAsync()		{			return InstantiateAsyncInternal(false, Vector3.zero, Quaternion.identity, null, false);		}		public InstantiateOperation InstantiateAsync(Transform parent)		{			return InstantiateAsyncInternal(false, Vector3.zero, Quaternion.identity, parent, false);		}		public InstantiateOperation InstantiateAsync(Transform parent, bool worldPositionStays)		{			return InstantiateAsyncInternal(false, Vector3.zero, Quaternion.identity, parent, worldPositionStays);		}		public InstantiateOperation InstantiateAsync(Vector3 position, Quaternion rotation)		{			return InstantiateAsyncInternal(true, position, rotation, null, false);		}		public InstantiateOperation InstantiateAsync(Vector3 position, Quaternion rotation, Transform parent)		{			return InstantiateAsyncInternal(true, position, rotation, parent, false);		}		private GameObject InstantiateSyncInternal(bool setPositionAndRotation, Vector3 position, Quaternion rotation, Transform parent, bool worldPositionStays)		{			if (IsValidWithWarning == false)				return null;			if (Provider.AssetObject == null)				return null;			return InstantiateOperation.InstantiateInternal(Provider.AssetObject, setPositionAndRotation, position, rotation, parent, worldPositionStays);		}		private InstantiateOperation InstantiateAsyncInternal(bool setPositionAndRotation, Vector3 position, Quaternion rotation, Transform parent, bool worldPositionStays)		{			InstantiateOperation operation = new InstantiateOperation(this, setPositionAndRotation, position, rotation, parent, worldPositionStays);			OperationSystem.StartOperation(operation);			return operation;		}	}}
 |