首页 > 其他分享 >异步实例化预制体Object.InstantiateAsync配合Async/Await使用

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

时间:2024-09-12 20:26:00浏览次数:10  
标签:prefab 异步 Await request Object InstantiateAsync 实例

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个物体。

标签:prefab,异步,Await,request,Object,InstantiateAsync,实例
From: https://www.cnblogs.com/flamesky/p/18411007

相关文章

  • 【代码分析1-视频目标分割AOT-数据处理部分】Associating Objects with Transformers
    AOT代码分析前置阅读代码模块代码分析1静态数据处理1.1引入包1.2继承Dataset类1.3数据初始化1.4获取数据长度1.5获取数据2视频数据处理2.1数据初始化-父类VOSTrain2.2数据初始化-子类DAVIS2017_Train2.3获得数据长度2.4获得数据前置阅读papergithub文献......
  • 泛型中的 K、T、V、E、?、Object 等分别代表什么含义
    泛型中的K、T、V、E、?、Object等分别代表什么含义作为一名编程博客专家,我将带领大家深入探讨泛型中的各种类型参数,如K、T、V、E、?、Object等,这些参数在Java和其他编程语言中扮演着重要的角色。本文将详细解释这些参数的含义、用途以及如何在实际编程中应用它们。......
  • 『功能项目』GameObject对象池 - 第三职业【39】
    本章项目成果展示我们打开上一篇38管理器基类的项目,本章要做的事情是利用对象池制作第三个职业——魔法师在GameRoot对象下创建空物体重命名为PoolRoot将GameRoot拖拽至预制体创建脚本:编写脚本:PoolManager.csusingUnityEngine;publicclassPoolManager:M......
  • RapidJSON 的坑--允许Object对象存在相同的key,且key为数字时序列化报异常
    RapidJSON的坑--允许Object对象存在相同的key,且key为数字时序列化报异常测试代码如下:1voidshow(rapidjson::Document&doc)2{3printf("-----------------foriterator\nMemberCount:%d\n",doc.MemberCount());4for(autoit=doc.MemberBegin();it!=doc......
  • VBA高级应用30例应用3在Excel中的ListObject对象:循环列出当前工作表中的表
    《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以便大家能很好的应用。教程的目的是要求大家在实际工作中分发VBA程序,写好的程序可以升级。本套教程共三册三......
  • flutter开发Invalid argument(s): Illegal argument in isolate message: object is u
    Invalidargument(s):Illegalargumentinisolatemessage:objectisunsendable-Library:'dart:async'Class1.问题原因:使用flutterisolate的时候新开的isolate访问了其他isolate的变量导致的比如下面例子是错误的写法:finalzhangsan="张三";//这里变量是主隔......
  • Objective-C 动态调用秘籍:NSInvocation 的魔法
    标题:Objective-C动态调用秘籍:NSInvocation的魔法在Objective-C编程中,NSInvocation是一个强大的工具,它允许你在运行时动态地调用方法。这种能力对于实现诸如方法拦截、依赖注入、或者在不知道方法签名的情况下调用方法等高级功能至关重要。本文将深入探索NSInvocation的使用方法,并......
  • JavaScript中的Object.freeze()和Object.seal()
    一、Object.freeze()1.简介:Object.freeze()是一个可以将对象冻结的方法。一旦对象被冻结,就不能添加、删除或修改其属性。这在需要确保对象完整性、防止任何意外或故意更改的场景中非常有用constperson={name:'Alice',age:30};Object.freeze(person);p......
  • 芯片闪存(FLASH)空间不够报错——.\Objects\SL_DEMO.axf: Error: L6406E: No space in
    目录问题描述:问题解决:问题分析:解决方法:1,2,问题描述:当出现这种报错的时候:.\Objects\SL_DEMO.axf:Error:L6406E:Nospaceinexecutionregionswith.ANYselectormatchingdrv_iap.o(i.EraseFlashSector).。是由于芯片闪存(FLASH)空间不够导致的问题解决:问题分析......
  • js async/await 用法
    1.使用async/await可以更好地控制事件循环,像处理DOM事件或定时器等场合。eg1......