Files
Obsidian_Unity/项目学习/王国之梦制作/8.加载房间.md
T

61 lines
2.8 KiB
Markdown
Raw Normal View History

2026-05-03 14:06:26 +08:00
## 疑问
### 1.addressable场景有什么作用?如过不addressable会怎么样?
使用addressable需要引入包
加载房间也是一个重点和难点,因为他涉及到了我没有学习过的场景加载方面的内容
传统的场景异步加载使用的是协程而不是async/await,因为协程是Unity集成的,他的性能比C#的Task差,但是在2023更新之后,将c#的Task更新为了Awaitable,他的性能比C#的Task好得多,因此教程使用了Awaitable来进行场景加载,这节笔记首先讲解课程所使用的方法,在讲解协程的老方法.
同时我在刚开始对Task非常疑惑,Task类型其实就是一个异步操作,我们在使用async/await的时候需要将其中的方法设置为Task,在Unity更新之后,我们可以用Awaitable代替Task.
协程是使用yield来实现异步的等待,Awaitable是使用await来实现异步的等待.
# **使用Awaitable实现场景切换**
本节课加载房间的流程:首先创建我们所有需要的房间并且将他们设置为Addressable,然后在
Windows->Asset Management->Addressables->Groups当中简化我们房间的名字.
我们需要在场景中创建一个空对象命名为SceneLoadManager用来控制我们的场景加载,在类中我们首先声明两个变量,他们的类型是AssetReference,一个名为currentScene一个为map,标明一个是需要加载的场景,另一个是地图场景.
我们目前处于地图场景当中,当我们点击了房间的图标的加载进入图标的房间,当我们点击房间的时候通过事件会将当前房间的数据传入到我们这个类当中,所以我们可以知道我们需要加载的场景是什么,同时将我们的currentScene赋值为当前需要加载的场景,然后我们卸载Map,加载currentScene,同时将他设置为setactiveScene.
加载房间和卸载房间的方法,首先他的类型是async Awaitable,这是2023以后推出.
加载房间中我需要异步加载当前场景
```
private async Awaitable LoadSceneTask()
    {
        var s = currentScene.LoadSceneAsync(LoadSceneMode.Additive);
        await s.Task;
        if (s.Status == AsyncOperationStatus.Succeeded)
        {
            SceneManager.SetActiveScene(s.Result.Scene);
        }
    }
```
我们通过AssetReference.LoadSceneAsync,加载场景, await s.Task等待加载完成,然后通过一个if语句判断,如过加载成功,就将当前场景切换为currentScene
```
private async Awaitable UnLoadSceneTask()
    {
        await SceneManager.UnloadSceneAsync(SceneManager.GetActiveScene());
    }
```
卸载场景也是一样的.
在本教程当中,由于设置了一个持久化场景,我们其余的Map,Room场景都是第二第三个场景,并且每一个场景都包含很多的东西,因此我们在加载场景的过程中需要先卸载,在加载场景.
## **使用协程进行场景切换**