官方案例解析4
开始之前的准备工作:
0下载Unity编辑器(2019.1.0f1 or 更新的版本),if(已经下载了)continue;
1下载官方案例,打开Git Shell输入:
git clone https://github.com/Unity-Technologies/EntityComponentSystemSamples.git --recurse
or 点击Unity官方ECS示例下载代码
if(已经下载了)continue;
2用Unity Hub打开官方的项目:ECSSamples
3在Assets目录下找到HelloCube/4. SubScene ,并打开SubScene 场景
4. SubScene
这个案例演示子场景的工作流程,为在Unity中编辑和加载大型游戏场景提供一种高效方式。下面来一探究竟:
- Main Camera ……主摄像机
- Directional Light……光源
- RotatingCube……旋转的方块?No,这是场景Scene
这次可不太一样了,RotatingCube不在是之前的那对舞娘方块儿了,而化身成为一个场景。可即便是以更高级别的Scene出场,她始终逃不出旋转的命运,突然觉得RotatingCube命运之忧伤,仿佛那首天后的歌:
旋转的木马没有翅膀
但却能够带着你到处飞翔
音乐停下来你将离场
我也只能这样
一边听着《旋木》,一边来看看主宰RotatingCube命运的SubScene脚本好了:
这个脚本主要将案例2的IJobForEach场景里的那对方块实体复用到这个场景中,提供了复用实体的解决方案
在编辑器中点击Edit,就可以看到RotatingCube出现在场景中,这个时候它身上已经不再需要ConvertToEntity脚本了
因为它本身将以实体的形式被创造出来,所以无需转换
代码做的就是这样,因为代码篇幅较长,所以并没有详细注释粘贴出来,有兴趣的朋友不妨研究一下。
我比较看重如何使用SubScene的特性,以下是使用步骤:
0在Unity编辑器Hierarchy层级窗口中,选中想要添加到SubScene的父游戏对象,这样其子游戏对象也会随着父亲进入SubScene场景,鼠标右击弹出下拉列表;
1在下拉列表的最下方,找到New SubScene from Selection选项,点击该选项;
2接下来,Unity会将该对象及其子对象,一同移入到SubScene对象中,并在项目中创建一个Scene Asset文件;
3该Scene Asset文件会显示在SubScene对象的Inspector检视窗口中;
4我们还可以通过Inspector检视窗口中的AutoLoadScene(是否自动加载)复选框来操纵其加载时机;
5也可以通过Inspector检视窗口中的Edit(编辑)和Save(保存)按钮来进行改动。
小结
那么为什么ECS要使用SubScene呢?
原因很简单,速度快,可以根据需求来快速加载场景资源。
看下SubScene的工作原理,也许就更加明白了!
SubScene 逻辑图表
不知道有没有画明白整个流程,再大概解释一下吧,当我们保存SubScene的时候,是以原生的二进制(Binary)形式来储存的。这种原生二进制加载速度非常快,可以说是时刻准备着(memory-ready),它将以随机存取储存器RAM (Random Access Memory) 最小代价来加载。这种形式非常适合加载大量的实体,所以在主场景(MainScene)加载SubScene的时候,RAM将返回大量的实体到主场景中,从而完成子场景SubScene的加载。
这些从SubScene加载到主场景的大量的实体依然由DOTS来掌控,一旦加载完成就自动交接给DOTS了,剩下的东西在前面已经讲过了,此处应该可以看明白了。
这里要指出的是,这个流程是我根据表象来推测的,底层是否这么做,关系并不大,我们只需要编写ECS的代码即可。
更新计划
作者的话
如果喜欢我的文章可以点赞支持一下,谢谢鼓励!如果有什么疑问可以给我留言,有错漏的地方请批评指证!
如果有技术难题需要讨论,可以加入开发者联盟:566189328(付费群)为您提供有限的技术支持,以及,心灵鸡汤!
当然,不需要技术支持也欢迎加入进来,随时可以请我喝咖啡、茶和果汁!( ̄┰ ̄*)