制作一个承载想法的东西(二)–场景管理器

  • A+
所属分类:Unity3d 原创文章

前面已经说过了,Unity那边就一个Main的启动类驱动着GameManager.lua的方法运行着,所以有关场景的运行都要衔接上GameManager来驱动场景的运行,此时场景管理器是非常重要的。讲讲想法,原本在Unity中,场景的加载后,挂载在游戏物体上的MonoBehaviour脚本文件就会驱动起来,调用Awake、Start、Update等等方法推动游戏的进程。现在想法是在其他场景中不挂载任何的MonoBehaviour脚本,因为需要保证在场景lua脚本中可以获取到场景的GameObject,这样就只能在保证场景资源完全加载完成后,驱动一个相应的场景lua脚本的初始化方法,获取相应的游戏物体、添加事件、在GameManager中注册帧运行方法等。

因为场景管理器的帧运行方法是不能被取消的,所以在上一篇中可以看到GameManager的Update方法是单独驱动场景管理器的Update方法的,

 

好了,下面直接看看场景管理器MySceneManager,lua的全貌

 

先看到的是上面还引入了两个管理类,一个是PathManager负责路径的管理,统一规范路径的使用,目前就只写了更新文件的目录,这里就不展示出来了。一个是UtilityManager是一个工具类管理器,其实是一个调用Unity启动文件Main.cs启动注册进lua虚拟机的衔接,例如点击事件驱动、保存文件资源等

 

接下来看Init方法,这个方法是在GameManager的Init方法驱动调用的。因为传入了挂载了Main.cs的游戏物体,这里就通过这个游戏物体获取加载场景时应该显示的进度条和百分比显示的文本显示物体,在每次加载场景的时候就显示这个进度条界面。在后面定义了一些需要保存加载场景信息的变量。最后直接加载默认的场景,这个默认的场景当然就是更新场景了。

 

接下来就是最重要的加载场景的方法了,先判断是否要使用远程的场景资源,如果需要就在更新目录中去查找这个场景文件,如果存在就加载到内存当中并保留好引用,方便在下一次加载其他场景的时候卸载资源。场景文件只要加载到内存当中,加载场景的时候就会优先使用该场景的,所以直接引用保存起来就不需要多做什么了。后面就直接异步叠加的方式的加载场景,保存异步操作指令用来获取进度和加载完成的状态。卸载先前加载的场景和原先驱动脚本的擦屁股操作。

 

显示加载场景的进度条,初始化加载UI信息,打开加载开关,更新UI的显示内容,待获取到异步操作加载场景的完成,开始驱动场景的运行了

 

因为场景加载已经时完成的了,就可以通过场景的名字获取到场景,设置这个场景为激活场景。获取到这个场景文件其实时为了获取这个场景中所有的根物体,从而才能获取到所有场景中的游戏物体,进项相应的操作。随后就是驱动相应的场景文件,存放在固定的目录下有着相应的命名规范,直接参考规范引入文件,并调用其的Init方法并传入当前场景资源以获取游戏物体。最后结束加载,隐藏进度条界面。

 

在最后看看场景脚本文件的基类,是怎么获取场景中所有的根物体的。可以看到Init中传入了scene,通过自带的方法GetRootGameObjects获取到所有的根物体,我这里转换成了table,遍历它,使用根物体的名字为索引保存在一个table变量中。在以后使用的时候,可以通过物体的名字,直接查找到该物体。这个基类提供了查找物体的方法,方便使用,后面还可以写更多方便的方法。最后调用一个Main方法,用来开始你自己场景的逻辑,获取游戏物体、注册事件、注册Update等,这样场景就跑起来啦。

 

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: