首页 > 其他分享 >unity3d————场景异步加载

unity3d————场景异步加载

时间:2024-11-17 18:16:41浏览次数:3  
标签:unity3d 场景 协程 异步 ao 切换 加载

总结

本文介绍了Unity中场景切换的两种方法:同步切换和异步切换。同步切换在切换场景时会删除当前场景的所有对象并加载下一个场景的信息,可能导致卡顿。因此,异步切换被引入来解决这个问题。异步切换有两种实现方式:通过事件回调函数和通过协程。

通过事件回调函数实现异步加载

代码示例

public class Lesson18Test : MonoBehaviour
{
    void Start()
    {
        AsyncOperation ao = SceneManager.LoadSceneAsync("Lesson20Test");
        ao.completed += LoadOver;

        //ao.completed += (a) =>
        //{
        //    print("加载结束");
        //};
    }
    private void LoadOver(AsyncOperation ao)
    {
        print("LoadOver");
    }
}

说明

  • 使用SceneManager.LoadSceneAsync方法异步加载场景。
  • 加载完成后,会自动调用completed事件,执行LoadOver方法。

优缺点

  • 优点:写法简单,逻辑清晰。
  • 缺点:只能在加载完成后执行一些操作,无法在加载过程中处理逻辑。
通过协程实现异步加载

代码示例

public class Lesson18Test : MonoBehaviour
{
    void Start()
    {
        DontDestroyOnLoad(this.gameObject);
        StartCoroutine(LoadScene("Lesson20Test"));
    }

    IEnumerator LoadScene(string name)
    {
        AsyncOperation ao = SceneManager.LoadSceneAsync(name);
        print("异步加载过程中 打印的信息");

        // 在加载过程中可以做其他事情,比如更新进度条
        yield return ao;

        print("异步加载结束后 打印的信息");
        // 场景加载完成后可以做一些后续处理
    }
}

说明

  • 使用协程StartCoroutine来异步加载场景。
  • 在协程中,使用yield return ao等待异步加载完成。
  • 可以在加载过程中执行其他逻辑,比如更新进度条。
  • DontDestroyOnLoad(this.gameObject); 就是用来实现这个目的的。当你调用这个方法时,你告诉Unity:“请不要在加载新场景时销毁这个游戏对象”。这样,即使场景切换了,这个游戏对象也会继续存在,并且可以在新场景中继续工作。

优缺点

  • 优点:可以在加载过程中处理逻辑,比如更新进度条。
  • 缺点:写法相对复杂,需要使用协程。

结论

两种异步加载场景的方法各有优缺点,选择哪种方法取决于具体的需求。如果只需要在加载完成后执行一些操作,可以选择通过事件回调函数的方式;如果需要在加载过程中处理逻辑,比如更新进度条,可以选择通过协程的方式。在实际开发中,可以根据具体情况选择最适合的方法来实现场景异步加载。

 

标签:unity3d,场景,协程,异步,ao,切换,加载
From: https://blog.csdn.net/2401_82978699/article/details/143816737

相关文章

  • 如何在原生鸿蒙中进行RN热加载
    一、背景在上一篇博客中,我分享了将RN的bundle包在原生鸿蒙开发中进行使用。但是如果我们在实际的开发过程中,每次修改完代码都需要打包,然后重新运行原生项目的话效率就有点太低了。原生鸿蒙支持RN的热加载,每次改完代码直接ctrl+s即可,改动后的代码会自动同步到手机上。除此之外,还......
  • 同步和异步
    一、javascript中为什么需要引入异步?  1.我们知道js是单线程语言,只能同时做一件事。但在遇到需要等待(网络请求,定时任务)不能卡住,所以引入了异步  2.异步就是为了解决单线程需要等待的问题(如:网络请求,定时任务) 3.异步是基于回调callback函数形式 二、同步和异步1.异步......
  • 未能加载文件或程序集 “项目名称对应的程序集,Version=1.0.0.0.culture=neutral.Publi
    VisualStudio2022,AutoCAD开发,wpf项目,因viewmodel中代码出现问题,造成窗体设计器中无法预览(这个问题通过修改viewmodel代码解决), 删除项目路径下的obj及bin文件夹后,重新生成项目,出现新的错误:窗体能够显示了,但个别控件无法正常显示,以为是visualstudio出了问题,修复、......
  • unity3d————Resources异步加载
    知识点一:Resources异步加载是什么?在Unity中,资源加载可以分为同步加载和异步加载两种方式。同步加载会在主线程中直接进行,如果加载的资源过大,可能会导致程序卡顿,因为从硬盘读取数据到内存并进行处理是需要时间的。而异步加载则是Unity内部新开一个线程进行资源加载,这样就不会造......
  • 使用model-viewer加载glb文件
    实现效果代码react项目引入方式可选其一1.在html中引入<scripttype="module"src="https://unpkg.com/@google/model-viewer/dist/model-viewer.min.js"></script>npm或者yarn安装yarnadd@google/model-viewerindex.jsimportReact,{useStat......
  • React setState是异步吗?
     React官网对于setState的说明:将setState()认为是一次请求而不是一次立即执行更新组件的命令。为了更为可观的性能,React可能会推迟它,稍后会一次性更新这些组件。React不会保证在setState之后,能够立刻拿到改变的结果。以上说明执行setState时,有可能是异步(大部分情况下)更新......
  • 异步学习小例子
    voidTest1(){ChangeText("==========================================================");ChangeText("iamwashingleftnow...");}//执行Test方法为Test线程asyncvoidTest()......
  • cef cefsharp加载网页空白
    屏蔽ssl验证即可Browser.RequestHandler=newExampleRequestHandler();publicclassExampleRequestHandler:RequestHandler{protectedoverrideboolOnCertificateError(IWebBrowserchromiumWebBrowser,IBrowserbrowser,CefErrorCodeerrorCod......
  • java类加载中的双亲委派机制
    ​ 双亲委派机制的优点: 同样的类不会被重复加载。 一、概述:类加载器:类加载器用于加载 .class字节码文件到内存中(并为每个.class字节码文件生成 Class对象)。 二、四种类加载器介绍:​编辑  2.1.启动类加载器(BootstrapClassLoader): 用于加载jdk的核......
  • stringRedisTemplate 异步操作的问题记录
    一、问题背景StringRedisTemplate使用stringRedisTemplate.opsForValue().set时,会出现set之后立马get获取值,发现获取不到set进去的值。二、问题原因1、在使用redisson的情况下,stringRedisTemplate.opsForValue().set操作会是异步操作,造成。你在set之后,立马get获取值的时候会......