首页 > 其他分享 >08. 场景加载

08. 场景加载

时间:2024-03-02 23:22:18浏览次数:19  
标签:SceneManager UnityEngine 场景 08 await async 加载

awaitable 关键字

本节涉及到场景的加载和卸载,在勇士传说中,我们使用协程的方式来加载和卸载场景,在本节使用了 unity2023.3 最新的特性 awaitable

awaitable 具体是啥,我也不太清楚,见下图

加载场景

在上一节中,我们监听了 LoadRoomEvent 事件,成功调用了 SceneLoadManager.OnLoadRoomEvent,现在补全这个代码

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.SceneManagement;

public class SceneLoadManager : MonoBehaviour
{
    private AssetReference currentScene;
    public AssetReference map;

    /// <summary>
    /// 在房间加载事件中监听
    /// </summary>
    /// <param name="data"></param>
    public async void onl oadRoomEvent(object data)
    {
        if (data is RoomDataSO)
        {
            RoomDataSO currentData = (RoomDataSO)data;
            // Debug.Log($"{currentData.roomType}");

            currentScene = currentData.sceneToLoad;
        }

        // 卸载当前场景
        await UnloadSceneTask();

        // 加载房间
        await LoadSceneTask();
    }

    /// <summary>
    /// 异步操作加载场景
    /// </summary>
    /// <returns></returns>
    private async Awaitable LoadSceneTask()
    {
        var s = currentScene.LoadSceneAsync(LoadSceneMode.Additive);
        await s.Task;

        if (s.Status == AsyncOperationStatus.Succeeded)
        {
            SceneManager.SetActiveScene(s.Result.Scene);
        }
    }

    private async Awaitable UnloadSceneTask()
    {
        await SceneManager.UnloadSceneAsync(SceneManager.GetActiveScene());
    }

    /// <summary>
    /// 监听返回房间的事件函数
    /// </summary>
    public async void LoadMap()
    {
        await UnloadSceneTask();

        currentScene = map;
        await LoadSceneTask();
    }
}

代码中,使用了 async、await 这些关键字

在 async 标注的方法中,我们可以直接调用异步方法,只需要在调用前添加 await 就行了,这样 unity 就会自动将该部分暂停,等到该部分直接结束之后再向下执行。

用 async 的好处可能就是方便访问局部变量吧

另外 async 标注的方法,也可以作为普通方法使用,如果是 IEnumerator 的话,就不能像下面这样操作了

参考:【Unity 2023.1】C# 正式支持 async/await? 试着用Awaitable吧!

卸载场景

上面加载场景中已经实现了,直接用await SceneManager.UnloadSceneAsync(SceneManager.GetActiveScene());

返回地图

进入场景战斗完毕之后,我们需要点击返回按钮回到地图,此时就需要让场景中的返回按钮发送LoadMapEvent事件

然后SceneLoadManager监听LoadMapEvent,事件发生时调用LoadMap

LoadMap里,会卸载掉当前场景,并加载 map 场景

测试

测试的话需要先激活Persistent场景,等程序起来之后,再激活Map场景,之后就能正常进入关卡和退出关卡了

项目相关代码

代码仓库:https://gitee.com/nbda1121440/DreamOfTheKingdom.git

标签:20240302_1325

标签:SceneManager,UnityEngine,场景,08,await,async,加载
From: https://www.cnblogs.com/hellozjf/p/18049449

相关文章

  • 说说你对vue的mixin的理解,有什么应用场景?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助一、mixin是什么Mixin是面向对象程序设计语言中的类,提供了方法的实现。其他类可以访问mixin类的方法而不必成为其子类Mixin类通常作为功能模块使用,在需要该功能时“混入”,有利于代码复用又避免了多继承的复杂Vue......
  • AT_arc083_b [ABC074D] Restoring Road Network 题解
    难度虚高,建议评橙/黄qwq。首先我们发现这是一道最短路问题,且\(N\le300\),于是采取floyd算法解决。具体地,我们分情况分类讨论。令我们当前枚举到的最短路径起点为\(i\),终点为\(j\),中转点为\(k\),输入的矩阵为\(dis\)。若\(dis_{i,j}>dis_{i,k}+dis_{k,j}\),则一定无......
  • 【题解】「HDU 7084」Pty loves string
    CQBZOJHDU7084不难想到把最终在\(S\)从中间分开,就变成了前后两个broder拼起来。考场重现:直接把所有的broder求出来,将相同长度的broder的下标存在一起,然后暴力匹配,最后还没来及优化。考场代码(除了fail树,其她其实都挺逼近正解正解是建出fail树(甚至搞忘还有这东......
  • Go语言的100个错误使用场景(55-60)|并发基础
    目录前言8.并发基础8.1混淆并发与并行的概念(#55)8.2认为并发总是更快(#56)8.3分不清何时使用互斥锁或channel(#57)8.4不理解竞态问题(#58)8.5不了解工作负载类型对并发性能的影响(#59)8.6不懂得使用Gocontexts(#60)小结前言大家好,这里是白泽。《Go语言的100个错误以及如何避免》......
  • 笔记:Git学习之应用场景和使用经验
    目标:整理Git工具的应用场景和使用经验一、开发环境Git是代码版本控制工具;Github是代码托管平台。工具组合:VSCode+Git需要安装的软件:vscode、Git其中vscode需要安装的插件:GitLens、GitHistory二、应用场景工作场景:嵌入式开发,多人本地使用三、使用总结基础操作,参考廖雪峰的Git教......
  • Java流程控制08:For循环详解
     For循环:条件.for1.虽然所有循环结构都可以用while或者do...while表示,但Java提供了另一种语句----->for循环,使一些循环结构变得更加简单。2.for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环机构。 3.for循环执行的次数是在执行前就确定的......
  • SC5307A SC5308A丨6 GHz射频下变频器
    产品简介:频率范围:100kHz至6GHz更多信息请加weixin-pt890111获取 SC5307A和SC5308A是高性能三级超外差下变频器,旨在满足诸如射频仪器,无线通信,卫星链路,软件定义无线电和信号智能等要求苛刻的应用。两个模块的输入射频频率范围为D至6GHz,可选IF带宽为80MHz,160MHz和320MHz。......
  • SC5407A SC5408A丨6 GHz射频上变频器
    产品简介:频率范围:100kHz至6GHz;在10kHz偏移,1GHz载波时,低残余相位噪声<-100dBc/Hz更多信息请加weixin-pt890111获取 SC5407A和SC5408A是高性能三级外差上变频器。输入射频频率范围从DC到6GHz,模块具有80MHz,160MHz和320MHz的可选IF带宽。每个模块都使用YIG振荡器作......
  • cnpm i报错 cpm:无法加载文件c:wsers vdministratorpata Roaming mpmcnpm.ps1,因为在
    cpm:无法加载文件c:wsersvdministratorpataRoamingmpmcnpm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅htps:/g.microsoft.con/fvlink/?LinkID=135170中的aboutExecutionPolicies。所在位置行:1字符:1+cnpmi.+CategoryInfoSecurityError:(:)[],PsSecuri......
  • vue项目引入高德地图报错:Map container div not exist (火狐浏览器不加载地图)
    问题描述:谷歌浏览器正常显示地图,火狐浏览器不加载,并且报错:  Mapcontainerdivnotexist错误代码如下:  修改后代码如下:  参考大佬:https://blog.csdn.net/white_777/article/details/128286558  ......