Unity | 以附加模式加载场景,实现多场景叠加及注意事项

1 多场景叠加

Unity 允许多场景叠加,这种叠加包括编辑模式及运行模式

新建两个简单的场景,SampleScene 和 AdditiveScene,设置不同的天空盒及平行光源颜色

SampleScene

AdditiveScene

2 编辑模式

2.1 添加场景

在编辑器中的场景资源右键选择 Open Scene Additive,或者直接拖拽场景资源到层级视图,都可以实现多场景编辑

2.2 层级结构

多场景叠加时,无论编辑模式还是运行模式,每个场景的内容将在 Hierarchy 窗口中单独显示在场景分隔栏下方,该分隔栏会显示场景的名称及其保存状态

场景叠加后,每个场景中的游戏对象都会出现在 Hierarchy 中,因此这些 GameObject 也会同时产生作用,比如 Main Camera 会造成多次渲染,Directional Light 会造成光照效果叠加等,因此一定要根据需求合理规划

2.3 场景特定设置

除了层级视图中的 GameObject,场景也会有一些特定的设置,比如天空盒、导航网格、光照贴图等

单场景烘焙

分别对 SampleScene 及 AdditiveScene 烘焙导航网格及光照贴图,然后将两个场景同时放入编辑器,可以看到导航网格数据及光照贴图会同时出现在场景中,即也会共同生效

「导航网格」

「光照贴图」

「活动场景」
但是可以看到天空盒依然是 SampleScene,并不会产生叠加,毕竟天空只有一个,如果想要使用 AdditiveScene 的天空盒,就需要设置其为当前活动场景,场景右键选择 Set Active Scene

可以看到天空盒更改为 AdditiveScene

多场景烘焙

除了使用已经烘焙好的数据外,Unity 还支持烘焙多场景的导航网格及光照贴图等,在编辑器中打开想要烘焙的场景,点击对应的烘焙按钮即可

「导航网格」
导航网格数据以单个资源(NavMesh.asset)的形式保存在与当前活动场景同名的目录内

该单个资源由所有参与烘焙的场景共享,即每个场景都会引用到该资源,所以单独打开场景时,依然可以看到完整的导航网格数据

SampleScene

AdditiveScene

「光照贴图」
光照贴图数据同样保存在与当前活动场景同名的目录内,但光照计算的输入是所有场景中的静态几何体和光源,因此阴影和 GI 光反弹将适用于所有场景

但是光照贴图和实时 GI 数据拆分为每个场景单独加载/卸载的数据,光照贴图和实时 GI 数据图集在场景之间拆分。这意味着,场景之间的光照贴图永远不会共享,卸载场景时可以放心卸载光照贴图。目前始终会共享光照探针数据,并会同时加载所有烘焙在一起的场景的所有光照探针

SampleScene

右边的图片

更多操作请参考官方中文文档:「https://docs.unity3d.com/cn/2021.2/Manual/MultiSceneEditing.html」

3 运行模式

运行时通过代码动态添加场景,最终表现效果和编辑模式一样,只是在编辑器中的操作需要用代码实现

3.1 添加及卸载场景

  • 同步加载场景

SceneManager.LoadScene("AdditiveScene", LoadSceneMode.Additive);
  • 异步加载场景

SceneManager.LoadSceneAsync("AdditiveScene", LoadSceneMode.Additive);
  • 异步卸载场景

SceneManager.UnloadSceneAsync("AdditiveScene");

运行时控制台会看到下面的警告

There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene.
There are 2 event systems in the scene. Please ensure there is always exactly one event system in the scene

这是因为场景中同时存在两个 AudioListener(挂在 Main Camera 对象上) 及 EventSystem,处理方式可以通过编辑器禁用或者删除,也可以通过代码动态控制

3.2 获取及设置场景

通过代码控制,一般也有两种方式,通过全局变量标记需要的 GameObject,或者动态获取指定场景,然后获取需要的 GameObject

  • 根据场景名获取场景

Scene scene = SceneManager.GetSceneByName("AdditiveScene");
  • 根据场景索引获取场景

Scene scene = SceneManager.GetSceneAt(0);
  • 获取当前活动场景

Scene scene = SceneManager.GetActiveScene();
  • 获取场景中的所有根游戏对象

List<GameObject> rootGameObjects = new List<GameObject>();
scene.GetRootGameObjects(rootGameObjects);
GameObject go = rootGameObjects.Find(o => o.name == "Main Camera");
  • 将游戏对象从当前场景移至新场景

SceneManager.MoveGameObjectToScene(go, scene);
  • 设置当前活动场景

SceneManager.SetActiveScene(scene);

Unity 中 new 或者 Instantiate 游戏对象时,默认的 parent 也是当前活动场景,Camera.main 指向的同样是当前活动场景

如果有需要,也可以手动更改天空盒及光照贴图等

  • 更改天空盒

RenderSettings.skybox = this.skyBox;
  • 更改光照贴图

LightmapData data = new LightmapData
{
    lightmapColor = this.lightmapColor
};
LightmapSettings.lightmaps = new LightmapData[1] { data };

更多手记,请扫码领取

  • 16
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity中预加载多个场景的方法有两种:一种是使用SceneManager.LoadSceneAsync()方法,另一种是使用SceneManager.LoadScene()方法配合使用异步加载的方式。 第一种方法是使用SceneManager.LoadSceneAsync()方法,该方法可以异步加载一个场景。可以通过创建AsyncOperation对象,然后调用SceneManager.LoadSceneAsync()方法传入场景名称或场景索引来实现加载。可以通过设置AsyncOperation.allowSceneActivation属性来控制是否立刻激活场景。 如果要预加载多个场景,则可以在一开始创建多个AsyncOperation对象,然后分别调用SceneManager.LoadSceneAsync()方法去加载不同的场景,最后使用AsyncOperation.isDone属性来判断是否加载完成。可以在加载完成后,再通过调用SceneManager.SetActiveScene()方法将需要预加载场景设置为活动场景。 第二种方法是使用SceneManager.LoadScene()方法配合使用异步加载的方式。可以先调用SceneManager.LoadScene()方法去加载一个主场景,然后在该场景中使用异步加载的方式去加载其他的场景。可以通过创建AsyncOperation对象,再调用SceneManager.LoadSceneAsync()方法传入其他场景的名称或索引来实现加载。可以通过设置AsyncOperation.allowSceneActivation属性来控制是否立刻激活场景。 以上两种方法都可以实现加载多个场景的效果,在游戏中需要使用到的场景可以提前加载好,提高游戏的加载速度和性能。 ### 回答2: Unity是一款游戏引擎,可以实现加载多个场景来提高游戏的流畅度和体验。 在Unity中,可以使用异步加载场景的方法来实现加载多个场景。首先,需要在场景管理器中设置需要加载场景,然后使用SceneManager.LoadSceneAsync方法来异步加载场景加载场景时,可以将加载进度显示给玩家,让他们了解加载的进展情况。可以通过AsyncOperation的progress属性来获取当前加载的进度,并将其转化为百分比显示。 在加载场景时,如果需要进行一些后台操作或初始化工作,可以使用协程Coroutine来实现,这样加载场景时,可以在后台进行额外的操作,提高游戏的加载效率。 要预加载多个场景,可以使用多个AsyncOperation进行异步加载。使用SceneManager.LoadSceneAsync方法加载多个场景,并使用协程来控制加载的顺序和等待时间。 在加载多个场景时,可以根据游戏的需要来决定加载的优先级,高优先级的场景可以先加载,以保证玩家能够尽快进入游戏。 预加载多个场景可以提前加载游戏中需要使用的资源和场景,减少加载时间和闪烁现象,提高游戏的流畅度和用户体验。 总之,通过Unity中的异步加载场景和协程,我们可以方便地预加载多个场景,提高游戏的性能和用户体验。 ### 回答3: Unity是一款强大的游戏开发引擎,可以通过预加载多个场景来提高游戏的性能和流畅度。 在Unity中,预加载多个场景可以通过以下步骤实现: 1. 创建多个场景:在Unity编辑器中,首先创建多个需要预加载场景。可以使用菜单栏中的"File" -> "New Scene"来创建新的场景,并按照需求进行设计。 2. 设置场景加载顺序:在Unity编辑器中,使用"Build Settings"面板来设置场景加载顺序。打开"Build Settings"面板后,选择需要预加载场景,并按照顺序将它们添加到"Scenes In Build"列表中。确保需要预加载场景在游戏开始时被加载。 3. 加载场景:在游戏开始时,使用Unity提供的API来加载加载场景。可以使用场景管理器(SceneManager)的LoadSceneAsync()方法来异步加载场景,从而避免游戏卡顿。加载场景时,可以指定要加载场景的名称或索引。 4. 切换场景:一旦场景加载完成,可以使用SceneManager.LoadScene()方法来切换到已经加载场景。这样就可以在不同的场景之间切换,实现更复杂的游戏逻辑。 预加载多个场景可以提高游戏的性能和流畅度,因为场景加载时会消耗一定的时间和资源。通过预加载多个场景,可以减少在游戏运行时切换场景时的加载时间,从而提高游戏的用户体验。 总之,Unity提供了强大的场景管理功能,通过预加载多个场景可以提高游戏的性能和流畅度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值