异步实例化预制体Object.InstantiateAsync配合Async/Await使用

Unity2022.3.20之后,可以使用异步克隆,正如前面一篇文章《Unity 2022.3.20f1新功能,异步实例化预制体Object.InstantiateAsync》说明的那样,常规的使用携程方式异步克隆,但如今await / async写法如此简单方便,肯定就不想放IEnumerator里头去实现了,怎么办呢?实现一个,代码如下:

public GameObject prefab;

async void StartAsync()
{
    GameObject instance = await InstantiateAsyncWithTask(prefab);
    Debug.Log("Prefab instantiated!");
}

/// <summary>
/// 异步实例化
/// </summary>
/// <param name="prefab"></param>
/// <returns></returns>
public async Task<GameObject> InstantiateAsyncWithTask(GameObject prefab)
{
    var request = Object.InstantiateAsync(prefab);

    // 等待实例化过程完成
    while (!request.isDone)
    {
        await Task.Yield(); // 异步地等待下一帧
    }

    // 返回实例化的游戏对象
    return request.Result[0];
}

/// <summary>
/// 批量异步实例化
/// </summary>
/// <param name="prefab"></param>
/// <param name="count"></param>
/// <returns></returns>
public async Task<GameObject[]> InstantiateAsyncWithTaskMultiple(GameObject prefab, int count)
{
    var request = Object.InstantiateAsync(prefab, count);

    // 等待实例化过程完成
    while (!request.isDone)
    {
        await Task.Yield(); // 异步地等待下一帧
    }

    // 返回实例化的游戏对象
    return request.Result;
}

如果用的是ET框架,把Task对应改写成ETTask方式即可。

异步克隆方法支持一次性克隆n个物体。

posted @ 2024-09-12 20:28  Flamesky  阅读(108)  评论(0编辑  收藏  举报