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

这篇具有很好参考价值的文章主要介绍了Unity | 以附加模式加载场景,实现多场景叠加及注意事项。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 多场景叠加

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

there are 2 event systems in the scene. please ensure there is always exactl,unity,unity,游戏引擎

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

SampleScene

AdditiveScene

2 编辑模式

2.1 添加场景

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

there are 2 event systems in the scene. please ensure there is always exactl,unity,unity,游戏引擎

2.2 层级结构

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

there are 2 event systems in the scene. please ensure there is always exactl,unity,unity,游戏引擎

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

2.3 场景特定设置

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

单场景烘焙

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

「导航网格」

「光照贴图」

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

there are 2 event systems in the scene. please ensure there is always exactl,unity,unity,游戏引擎

可以看到天空盒更改为 AdditiveScene

多场景烘焙

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

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

there are 2 event systems in the scene. please ensure there is always exactl,unity,unity,游戏引擎

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

there are 2 event systems in the scene. please ensure there is always exactl,unity,unity,游戏引擎

SampleScene

AdditiveScene

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

there are 2 event systems in the scene. please ensure there is always exactl,unity,unity,游戏引擎

但是光照贴图和实时 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 };

更多手记,请扫码领取文章来源地址https://www.toymoban.com/news/detail-803057.html

到了这里,关于Unity | 以附加模式加载场景,实现多场景叠加及注意事项的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 制作unity大世界场景编辑的一点心得和注意事项(场景地编)

    制作unity大世界场景的一点心得和注意事项(地编注意事项) 这是一个项目的整个注意事项,所注意点都是根据制作的项目整理的。所以在做任何项目的时候要注意 举一反三 。 1,检查分组里的各种检查(这里的分组是每一个场景尤其是大世界地图制作人员比较多需要合理规

    2024年02月07日
    浏览(59)
  • GameFrameWork框架(Unity3D)使用笔记(八) 实现场景加载进度条

            游戏在转换场景的时候,需要花费时间来加载相关的资源。而这个过程往往因为游戏场景的规模和复杂度以及玩家电脑配置的原因花费一小段时间(虽然这个项目里用不到)。         所以,如果这一小段时间,画面就卡在这里,啥也做不了,玩家也不知道啥时候能

    2024年02月02日
    浏览(49)
  • 微信小程序 background多个background背景图叠加以及连写注意事项

    background: url(\\\'https://xxxxxxxx.com\\\') no-repeat top/100% auto,linear-gradient(318deg, #3F0000 0%, #A9143A 100%); 效果: 坑点: 1:多个背景图叠加时(渐变也相当于图片)以逗号分割,越靠前图片叠加时层级越高。网上搜索时发现找到的都是说越靠后层级越高,但我测试的时候确实是越靠前越高。

    2024年02月15日
    浏览(59)
  • Unity 场景加载和资源加载

    一个游戏往往都是由很多场景组成的,例如会有主界面场景、战斗场景…等,不同的场景也是由若干的资源组合而成,在游戏的制作过程中,场景和资源的加载是不可或缺的。不管是场景还是资源都会涉及到加载的问题,在什么时候进行场景或资源的加载?场景的加载和资源

    2024年02月04日
    浏览(39)
  • Unity --- 场景/场景管理类 与 异步场景加载法

    1.一个游戏是由很多的场景组成的,比如游戏的开始页面,战斗场景,商店页面...等等,这些都是一个个游戏场景 或者比如说:一进入游戏,你一开始来到的是新手村这个场景,出了新手村后来到的就是荒野场景,过来荒野场景后来到的就是大城市场景.....  一个游戏是由很

    2024年02月04日
    浏览(44)
  • Unity 多场景/大场景加载解决方法

    记录一下最近学习的新的知识,关于解决多场景加载的问题,方便下次及时的巩固复习。 此次使用的是 Unity的异步加载 来实现功能。 将一个大场景的地图分成好几个场景,利用玩家的距离来判断加载哪个场景和卸载哪个场景。 利用玩家的自身距离和预加载场景的距离判断

    2024年02月04日
    浏览(50)
  • Unity基础 异步加载场景

    异步加载场景的基本概念 在Unity中,异步加载场景是指在游戏运行时,将场景中的资源分批次加载到内存中,以便提高游戏的加载速度和性能。通常情况下,加载场景的过程会在主线程中执行,而异步加载场景可以在后台线程中执行,从而不会阻塞主线程。 要使用异步加载首

    2024年02月12日
    浏览(46)
  • Unity场景进度条加载

    首先,创建Canvas,在Canvas中创建一个Button和一个Panel Button:点击之后进入场景加载 Panel:场景加载面板  其次,在panel当中,我们在创建slider和Text Text:用来描述进度条的百分比,所以text可有可无,看自己意愿   slider :就是我们的进度条了 Panel建好后,将SetActive设置为false,

    2023年04月09日
    浏览(49)
  • Unity异步加载场景

    当我们的场景资源过大时,为了能够不影响玩家体验,就会使用异步加载。 官方文档:AsyncOperation - Unity 脚本 API AsyncOperation的API allowSceneActivation 允许在场景准备就绪后立即激活场景。 isDone 操作是否已完成?(只读) priority Priority 允许您调整执行异步操作调用的顺序。 pro

    2024年02月02日
    浏览(44)
  • unity加载场景后光照变暗

    关于unity加载场景后光照变暗的问题 最近在做场景的加载功能时,发现加载新的场景后整个场景的光照都变暗,但是如果是直接运行当前场景的话就不会,后来才发现原来是选择的光照是realtime实时光照,在一开始的场景时,它的灯光是已经渲染好了,但重新加载的时候灯光

    2024年02月15日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包