Unity | 以附加模式加载场景,实现多场景叠加及注意事项
创始人
2024-02-13 01:46:24

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 rootGameObjects = new List();
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 };

更多手记,请扫码领取

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...