战棋战略制作组

创建于:2022-06-27

创建人: mioku

16 信息 15 成员
海量的小元素汇聚成巨大的历史流向,一只蝴蝶扇动翅膀。在庞大的世界框架中纵横捭阖,与偶然的随机性和必然的历史对抗,这就是大战略的魅力!

[策略][战棋]项目逻辑结构(依赖注入)!基于兴趣开发的策略战棋游戏的开发日志~ 五

mioku 2022-10-16

首先是项目大概会有的主要场景:

1.开始场景:进行游戏设置,管理存档的功能场景。

2.策略场景:策略场景会贯穿整剧游戏的始终,玩家在策略地图上决策,已尽可能优势的进入作战场景,并取得最终的胜利。

3.作战场景:游戏主要的玩法集中在这里,六边形单元格组成的网格地图,回合制的战棋策略玩法,也是目前日志一直在分享的开发内容。每场作战的结果会反馈到策略场景,影响全局策略的执行。

作战场景概览


本次日志主要内容就是介绍一下作战场景的逻辑结构(是很偏程序的内容,要是内容晦涩难懂还望体谅,如果有什么建议,也请一定提出):

首先要介绍一下DI(依赖注入):这是我在后端开发工作中常用的一种设计模式,在我们编写某个逻辑对象A时(比如某个类实例),我们会需要调用另一个逻辑对象B的功能,就可以称作A是依赖于B的,这时我们一般会自己去实现逻辑对象B(比如实例化一个B,或是调用B的单例等等),这是十分麻烦的。DI则是替代了我们自己实现依赖的过程,我们只需要决定那些逻辑对象被需要,就将其注入

简单来说,DI会准备好我们可能会依赖到的对象,当我们需要使用这些对象时,直接通过DI来注入,就能实现调用了。这个过程中省去了我们创建依赖的需要,因此DI也被叫错控制反转。


在我的开发项目中DI功能的实现是依靠名为Vcontainer的类库,这是它的网站:https://vcontainer.hadashikick.jp/

在整个逻辑的入口是一个Entry类,这个类在项目中就负责准备好我们会依赖的对象。

Image title


上图中的Configure方法内,我们将依赖一一注册准备。

RegisterInstance会将我们在场景中已经准备好的实例注册。

RegisterComponentInNewPrefab可以在注册实例的同时,在场景中创建对应的物体。

RegisterEntry注册的实例则可以实现Start,Update等Unity生命周期函数。

Refister则用于注册我们普通的逻辑类。

在注册时,注册的对象会有一个生命周期(LifeScope)的概念,它决定了当我们注入依赖时,这个依赖对象的留驻时间,这里不作具体介绍,大家可以参考类库的文档。

依赖都注册准备好后,随后就是注入依赖了。例如在游戏过程中,玩家选择单元格相关的管理逻辑需要知道,网格地图相关的信息,那么就需要将网格信息注入进来。


Image title

上图时最常用的注入方式,构造体注入。在注入后外面就能直接调用_hexGrid来实现依赖了。注入的方式也有很多,理解上需要一些对DI的概念基础,这里就不深入说明了。

最后说说,使用DI后一些的好处:

1.在以前我会通过单例,在场景中放置大量的xxxManager来管理一个逻辑模块,在项目复杂以后,大量的Manager真是让人看的头大,改用DI后,就再也看不到这些Manager啦。

2.通过将很多原来需要实现MonoBehaviour才能在场景中使用的逻辑,通过RegisterEntry来注册不需要继承自MonoBehaviour并放在场景中,可以节约不少资源使用。


以上就是本次十分乏味的逻辑结构分享日志,很欢迎大家进行建议和评价,在下才学疏浅可能会有一些概念介绍的疏漏,还望见谅。如果你对Vcontainer感兴趣可以看看这个视频:精选Unity-Github开源库分享 最实用的依赖注入框架VContainer DI && IOC_哔哩哔哩_bilibili


项目仍然在缓慢开发中,要是有感兴趣的伙伴也可以联系我哦!QQ:2763686216









(转发自:原日志地址
 

加入 indienova

  • 建立个人/工作室档案
  • 建立开发中的游戏档案
  • 关注个人/工作室动态
  • 寻找合作伙伴共同开发
  • 寻求线上发行
  • 更多服务……
登录/注册