Update InstantiateOperation.cs

use Object.InstantiateAsync
pull/392/head
何冠峰 2024-10-17 10:52:25 +08:00
parent d980b55997
commit 55f958266c
1 changed files with 96 additions and 19 deletions
Assets/YooAsset/Runtime/ResourceManager/Operation

View File

@ -7,7 +7,9 @@ namespace YooAsset
private enum ESteps private enum ESteps
{ {
None, None,
Clone, LoadObject,
CloneSync,
CloneAsync,
Done, Done,
} }
@ -20,6 +22,10 @@ namespace YooAsset
private readonly bool _actived; private readonly bool _actived;
private ESteps _steps = ESteps.None; private ESteps _steps = ESteps.None;
#if UNITY_2022_3_OR_NEWER
private AsyncInstantiateOperation _instantiateAsync;
#endif
/// <summary> /// <summary>
/// 实例化的游戏对象 /// 实例化的游戏对象
/// </summary> /// </summary>
@ -39,14 +45,14 @@ namespace YooAsset
} }
internal override void InternalOnStart() internal override void InternalOnStart()
{ {
_steps = ESteps.Clone; _steps = ESteps.LoadObject;
} }
internal override void InternalOnUpdate() internal override void InternalOnUpdate()
{ {
if (_steps == ESteps.None || _steps == ESteps.Done) if (_steps == ESteps.None || _steps == ESteps.Done)
return; return;
if (_steps == ESteps.Clone) if (_steps == ESteps.LoadObject)
{ {
if (_handle.IsValidWithWarning == false) if (_handle.IsValidWithWarning == false)
{ {
@ -67,6 +73,15 @@ namespace YooAsset
return; return;
} }
#if UNITY_2022_3_OR_NEWER
_steps = ESteps.CloneAsync;
#else
_steps = ESteps.CloneSync;
#endif
}
if (_steps == ESteps.CloneSync)
{
// 实例化游戏对象 // 实例化游戏对象
Result = InstantiateInternal(_handle.AssetObject, _setPositionAndRotation, _position, _rotation, _parent, _worldPositionStays); Result = InstantiateInternal(_handle.AssetObject, _setPositionAndRotation, _position, _rotation, _parent, _worldPositionStays);
if (_actived == false) if (_actived == false)
@ -75,6 +90,47 @@ namespace YooAsset
_steps = ESteps.Done; _steps = ESteps.Done;
Status = EOperationStatus.Succeed; Status = EOperationStatus.Succeed;
} }
#if UNITY_2022_3_OR_NEWER
if (_steps == ESteps.CloneAsync)
{
if (_instantiateAsync == null)
{
_instantiateAsync = InstantiateAsyncInternal(_handle.AssetObject, _setPositionAndRotation, _position, _rotation, _parent, _worldPositionStays);
}
if (IsWaitForAsyncComplete)
_instantiateAsync.WaitForCompletion();
if (_instantiateAsync.isDone == false)
return;
if (_instantiateAsync.Result != null && _instantiateAsync.Result.Length > 0)
{
Result = _instantiateAsync.Result[0] as GameObject;
if (Result != null)
{
if (_actived == false)
Result.SetActive(false);
_steps = ESteps.Done;
Status = EOperationStatus.Succeed;
}
else
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
Error = $"Instantiate game object is null !";
}
}
else
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
Error = $"Instantiate async results is null !";
}
}
#endif
} }
internal override void InternalWaitForAsyncComplete() internal override void InternalWaitForAsyncComplete()
{ {
@ -97,9 +153,17 @@ namespace YooAsset
/// </summary> /// </summary>
public void Cancel() public void Cancel()
{ {
#if UNITY_2022_3_OR_NEWER
if (_instantiateAsync != null && _instantiateAsync.isDone == false)
_instantiateAsync.Cancel();
#endif
SetAbort(); SetAbort();
} }
/// <summary>
/// 同步实例化
/// </summary>
internal static GameObject InstantiateInternal(UnityEngine.Object assetObject, bool setPositionAndRotation, Vector3 position, Quaternion rotation, Transform parent, bool worldPositionStays) internal static GameObject InstantiateInternal(UnityEngine.Object assetObject, bool setPositionAndRotation, Vector3 position, Quaternion rotation, Transform parent, bool worldPositionStays)
{ {
if (assetObject == null) if (assetObject == null)
@ -108,29 +172,42 @@ namespace YooAsset
if (setPositionAndRotation) if (setPositionAndRotation)
{ {
if (parent != null) if (parent != null)
{ return UnityEngine.Object.Instantiate(assetObject as GameObject, position, rotation, parent);
GameObject clone = UnityEngine.Object.Instantiate(assetObject as GameObject, position, rotation, parent);
return clone;
}
else else
{ return UnityEngine.Object.Instantiate(assetObject as GameObject, position, rotation);
GameObject clone = UnityEngine.Object.Instantiate(assetObject as GameObject, position, rotation);
return clone;
}
} }
else else
{ {
if (parent != null) if (parent != null)
return UnityEngine.Object.Instantiate(assetObject as GameObject, parent, worldPositionStays);
else
return UnityEngine.Object.Instantiate(assetObject as GameObject);
}
}
#if UNITY_2022_3_OR_NEWER
/// <summary>
/// 异步实例化
/// 注意Unity2022.3及以上版本生效
/// https://docs.unity3d.com/2022.3/Documentation/ScriptReference/Object.InstantiateAsync.html
/// </summary>
internal static AsyncInstantiateOperation InstantiateAsyncInternal(UnityEngine.Object assetObject, bool setPositionAndRotation, Vector3 position, Quaternion rotation, Transform parent, bool worldPositionStays)
{ {
GameObject clone = UnityEngine.Object.Instantiate(assetObject as GameObject, parent, worldPositionStays); if (setPositionAndRotation)
return clone; {
if (parent != null)
return UnityEngine.Object.InstantiateAsync(assetObject as GameObject, parent, position, rotation);
else
return UnityEngine.Object.InstantiateAsync(assetObject as GameObject, position, rotation);
} }
else else
{ {
GameObject clone = UnityEngine.Object.Instantiate(assetObject as GameObject); if (parent != null)
return clone; return UnityEngine.Object.InstantiateAsync(assetObject as GameObject, parent);
} else
return UnityEngine.Object.InstantiateAsync(assetObject as GameObject);
} }
} }
#endif
} }
} }