首先是项目大概会有的主要场景:
1.开始场景:进行游戏设置,管理存档的功能场景。
2.策略场景:策略场景会贯穿整剧游戏的始终,玩家在策略地图上决策,已尽可能优势的进入作战场景,并取得最终的胜利。
3.作战场景:游戏主要的玩法集中在这里,六边形单元格组成的网格地图,回合制的战棋策略玩法,也是目前日志一直在分享的开发内容。每场作战的结果会反馈到策略场景,影响全局策略的执行。
本次日志主要内容就是介绍一下作战场景的逻辑结构(是很偏程序的内容,要是内容晦涩难懂还望体谅,如果有什么建议,也请一定提出):
首先要介绍一下DI(依赖注入):这是我在后端开发工作中常用的一种设计模式,在我们编写某个逻辑对象A时(比如某个类实例),我们会需要调用另一个逻辑对象B的功能,就可以称作A是依赖于B的,这时我们一般会自己去实现逻辑对象B(比如实例化一个B,或是调用B的单例等等),这是十分麻烦的。DI则是替代了我们自己实现依赖的过程,我们只需要决定那些逻辑对象被需要,就将其注入。
简单来说,DI会准备好我们可能会依赖到的对象,当我们需要使用这些对象时,直接通过DI来注入,就能实现调用了。这个过程中省去了我们创建依赖的需要,因此DI也被叫错控制反转。
在我的开发项目中DI功能的实现是依靠名为Vcontainer的类库,这是它的网站:https://vcontainer.hadashikick.jp/
在整个逻辑的入口是一个Entry类,这个类在项目中就负责准备好我们会依赖的对象。
上图中的Configure方法内,我们将依赖一一注册准备。
RegisterInstance会将我们在场景中已经准备好的实例注册。
RegisterComponentInNewPrefab可以在注册实例的同时,在场景中创建对应的物体。
RegisterEntry注册的实例则可以实现Start,Update等Unity生命周期函数。
Refister则用于注册我们普通的逻辑类。
在注册时,注册的对象会有一个生命周期(LifeScope)的概念,它决定了当我们注入依赖时,这个依赖对象的留驻时间,这里不作具体介绍,大家可以参考类库的文档。
依赖都注册准备好后,随后就是注入依赖了。例如在游戏过程中,玩家选择单元格相关的管理逻辑需要知道,网格地图相关的信息,那么就需要将网格信息注入进来。
上图时最常用的注入方式,构造体注入。在注入后外面就能直接调用_hexGrid来实现依赖了。注入的方式也有很多,理解上需要一些对DI的概念基础,这里就不深入说明了。
最后说说,使用DI后一些的好处:
1.在以前我会通过单例,在场景中放置大量的xxxManager来管理一个逻辑模块,在项目复杂以后,大量的Manager真是让人看的头大,改用DI后,就再也看不到这些Manager啦。
2.通过将很多原来需要实现MonoBehaviour才能在场景中使用的逻辑,通过RegisterEntry来注册不需要继承自MonoBehaviour并放在场景中,可以节约不少资源使用。
以上就是本次十分乏味的逻辑结构分享日志,很欢迎大家进行建议和评价,在下才学疏浅可能会有一些概念介绍的疏漏,还望见谅。如果你对Vcontainer感兴趣可以看看这个视频:精选Unity-Github开源库分享 最实用的依赖注入框架VContainer DI && IOC_哔哩哔哩_bilibili
项目仍然在缓慢开发中,要是有感兴趣的伙伴也可以联系我哦!QQ:2763686216
暂无关于此日志的评论。