阅读国外Coder教程时的笔记,Object Management篇(四)协程

原文地址:https://catlikecoding.com/unity/tutorials/object-management/multiple-scenes/
阅读国外Coder教程时的笔记,Object Management篇(一)
阅读国外Coder教程时的笔记,Object Management篇(二)
阅读国外Coder教程时的笔记,Object Management篇(三)
1.上个教程简单说了可以通过命名空间UnityEngine.SceneManagerment下的CreateScene和MoveGameObjectToScene实现临时场景的创建以及将临时物体比如预制体放入临时场景。当然,我们也可以通过Create创建新的场景,比如游戏中经常通过不同场景管理不同的关卡。一个Hierarchy面板下是可以同时存在不同的场景的,当然你需要调整下MainCamera和DirectionLight的数量。这里注意我们需要到build setting下添加场景到build里面,否则游戏打包时场景是不会被导出的。
在这里插入图片描述
这里后面会有0和1的数字,代表的是Scene的索引。SceneManager.GetSceneByIndex需要传入的参数就是这里的数字。

2.SceneManager下的几个API
SceneManager.LoadScene 加载场景。注意,场景是可以重复加载的。如果不通过条件过滤,会出现同一场景重复出现的问题。
这里传入的参数除了Scene的string名字以外,还需要设置SceneMode,有Additive和Single两种模式,前者是在原有基础上再打开一个场景的意思(即同时存在),后者是关闭所有场景只打开加载的场景,需要注意区分。
SceneManager.SetActiveSecene(Scene scene)
顾名思义,设定Active scene。这里知道的是Light是跟着Active Scene走的。如果你的场景同时存在两个Scene,但是active scene里没有Light,那么你的场景就是黑的。
SceneManager.GetSceneByName 通过名字查找场景
SceneManager.GetSceneByIndex 通过索引查找场景

3.有关灯光烘培
有时候我们会发现Unity的灯光显示很诡异,这个时候我们需要手动烘培以下灯光。具体操作,打开需要烘培灯光的场景设定为Active scene(可以在Hierarchy面板里设置),工具栏Windows/Rendering/Light里,取消勾选Auto Generate,然后点下Generate Lighting,过一会儿scene文件夹下就会生成lighting的文件。然后灯光就恢复正常了。
在这里插入图片描述
在这里插入图片描述
4.加载场景是需要耗时的
如果项目大,场景加载是很耗时的,比如下面这段代码运行时可能会报错。原因是场景还没加载出来,SceneManager.SetActiveScene只能设置已经加载出来的场景。

		SceneManager.LoadScene("Level 1", LoadSceneMode.Additive);
		SceneManager.SetActiveScene(SceneManager.GetSceneByName("Level 1"));

我们可以通过协程改写以下,比如:

	IEnumerator LoadLevel () {
		SceneManager.LoadScene("Level 1", LoadSceneMode.Additive);
		yield return null;
		SceneManager.SetActiveScene(SceneManager.GetSceneByName("Level 1"));
	}

一句yield return null 可以为我们争取一帧的时间。当然我们知道这不是最终解决方法。这里我们可以用到异步加载,比如:

	IEnumerator LoadLevel () {
		yield return SceneManager.LoadSceneAsync(
			"Level 1", LoadSceneMode.Additive
		);
		SceneManager.SetActiveScene(SceneManager.GetSceneByName("Level 1"));
	}

大致意思相同,不同的是LoadSceneAsync会帮你check场景是否已经加载出来了,然后才会到下一步。
PS:UnLoadSceneAsync则可以移除场景。
到这里,还有可以完善的地方。即便你把上面这个协程写到awake里面,还是有可能会在加载场景的时候Update运行了几帧,可以通过以下方法解决。

	IEnumerator LoadLevel () {
		enabled = false;
		yield return SceneManager.LoadSceneAsync(
			"Level 1", LoadSceneMode.Additive
		);
		SceneManager.SetActiveScene(SceneManager.GetSceneByName("Level 1"));
		enabled = true;
	}

大致意思就是,一开始禁用脚本中所有语句,只有到enabled为true的时候才可以运行。

以上,希望可以帮助到大家学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值