RPG游戏的时候把这些场景通通加到玩家角色身上!

RPG游戏的时候把这些场景通通加到玩家角色身上!

感觉最近睡得有些不安,总是半夜突然惊醒。 然后我起床看了看手机,凌晨三点。

然后发现游戏体力满了,清完体力花了10分钟,什么都没掉。

我用这十分钟换来了一个不眠之夜,也不知道自己是不是做到了。

unity切换场景不销毁_unity切换场景卡顿_unity 异步切换场景

这导致我在下午补觉的时候梦到了一些奇怪的场景。 比如游戏里的男主抱着我的大腿问能不能就抽女主你个老皮子。

又或者是玩到超神的游戏就断网了,一下子就醒了,困意一下子消失了。

难怪医生说适当的午睡有益于人体的身心健康。 今天打了个游戏就愣了,不敢玩了,怕现实重演。 我把所有的时间都花在了学习上。

unity 异步切换场景_unity切换场景卡顿_unity切换场景不销毁

为了让其他人感受到我的痛苦,我打算在学习制作RPG游戏时将这些场景都添加到玩家角色中。

言归正传,今天要讲的是关于场景的知识。

话不多说,走吧!

unity切换场景不销毁_unity 异步切换场景_unity切换场景卡顿

1. 场景 (P27)

以上是一个通用的游戏框架。 之前人物立绘音乐音效,组件和脚本被添加到默认游戏场景中。 其实也可以通过代码或者组件来创建新的游戏场景。

在Unity的层级视图中,可以看到一个叫做SampleScene的东西,里面包含了两个游戏对象

unity 异步切换场景_unity切换场景不销毁_unity切换场景卡顿

这个SampleScene是一个默认的游戏场景,SampleScene在项目视图的Scenes文件夹中,所以你可以在Scenes文件夹中创建(鼠标右键)一个新的游戏场景。

unity切换场景卡顿_unity切换场景不销毁_unity 异步切换场景

双击打开后就是新建的场景

1-1。 通过代码加载场景(load from Sample to My)——场景跳转

在SampleScence中打开文件→Project-Generation and Settings(Ctrl+Shift+B)→将场景拖入build中的场景中(0和1为场景的索引号)

unity 异步切换场景_unity切换场景不销毁_unity切换场景卡顿

接下来创建一个空对象,创建一个脚本文件并挂载它。

首先在代码顶部导入:使用 UnityEngine.SceneManagement。

同步加载场景代码(index):SceneManager.LoadScene(1);

unity切换场景卡顿_unity切换场景不销毁_unity 异步切换场景

回到Unity后运行,系统会自动打开1号场景(MyScene)

除了index方法,还可以使用name方法,把数字改成“场景名”

场景管理器。 LoadScene("我的场景");

1-2。 获取当前场景(当前激活的场景)

场景 scene = SceneManager. 获取活动场景();

代码中的场景也是current SampleScene(当前场景)

为了验证是否获取成功,使用print方法验证:

调试。 日志(场景名称);

unity切换场景不销毁_unity 异步切换场景_unity切换场景卡顿

这里的场景就是场景类。 对于一些场景类,有一些属性需要了解。

除了上面提到的场景名称Debug.Log(scene.name);

1-3。 场景是否加载

调试。 日志(场景。isLoaded);

1-4。 场景路径

调试。 日志(场景。路径);

1-5。 场景索引(在构建场景面板中获取索引号)

调试。 日志(场景。buildIndex);

1-6。 获取所有根游戏对象

场景。 GetRootGameObjects();

这将返回一个主机:

GameObject[] gos = 场景。 GetRootGameObjects();

可以打印出来看看host里面有什么(打印长度):

调试。 日志(gos。长度);

unity切换场景卡顿_unity切换场景不销毁_unity 异步切换场景

下图中可以详细看到控制台的返回内容

unity切换场景不销毁_unity切换场景卡顿_unity 异步切换场景

2. 场景管理 (P27)

2-1. 场景管理类(当前加载的场景数)

调试。 日志(SceneManager.sceneCount);

2-2。 直接新建场景(括号内为自定义场景名称)

场景管理器。 CreateScene("新场景");

当然你也可以设置一个返回:

场景 newScene = SceneManager. CreateScene("新场景");

unity切换场景不销毁_unity 异步切换场景_unity切换场景卡顿

可以看到这里直接新建了一个名为NewScene的空场景

如果把上面两行代码的顺序倒过来,你会发现当前加载的场景会从1变成2。

2-3。 卸载场景(异步销毁)把你要销毁的场景放在括号里

场景管理器。 UnloadSceneAsync(newScene);

异步销毁:该函数不会立即销毁对象,而是为对象添加一个标识符。 该对象仍在内存中unity切换场景不销毁unity切换场景不销毁,将在下一帧被销毁并从内存中移除。

unity 异步切换场景_unity切换场景卡顿_unity切换场景不销毁

这里运行后可以看到左下角的active scene还是2但是场景newScene并没有出现。

因为创建后直接删除了。

2-4. 加载场景(多参数)

SceneManager.LoadScene("MyScene",LoadSceneModel.Single);

这里的Single作为简单的替换加载存在,运行后会直接加载为 MyScene,替换原来的SampleScene。

如果将 Single 更改为另一个:

SceneManager.LoadScene("MyScene", LoadSceneModel.Additive);

unity切换场景不销毁_unity 异步切换场景_unity切换场景卡顿

可以看到两个场景的内容会叠加

但是这种方式在加载复杂场景或者大型游戏场景时容易造成卡顿

关于如何加载复杂场景的异步加载会在下篇笔记中讲解。

今天的内容就到这里!

每次写完一篇,都十点多了,每天都觉得无所事事。

今天开始先学习再打游戏,所以想好好犒劳一下自己。