基于兴趣开发的策略战棋游戏开发日志(4-6)

作者:mioku
2022-11-22
4 0 0

前情回顾

宏大的计划目标是要制作一款策略玩法类似(欧陆风云/十字军之王),同时通过战棋玩法表现局部战略的游戏!

开发日志(1 - 3)

首先介绍一下命令菜单,简单来说就是为玩家展示当前可选的命令的面板。

对于玩家来说他所要做的就是不断的选中某个单元格,以执行作战策略,命令菜单则会显示当前单元格可以采取的命令。

例如在单元格为空时,目前就只有招募单位的功能。

而在单元格上有己方单位时,命令则显示了当前单位可以执行的命令。

当我们点击招募按钮,招募面板就会呼出。

招募面板

招募面板目前还很简陋,不过够用就行嘛!计划在实现游戏的基础逻辑后会好好细化~~先提前说一下计划,每条单位信息的蓝色图片会是单位的头像,而右边巨大的空白会用来预览单位的外形。

点击标着价格的按钮,单位就会在所选的单元格生成了!

招募单位

最后就是改了老半天 bug,终于初步实现的展示移动范围的功能了!

在选中红框单位后,就会展示其移动范围,蓝色为可移动区块,红色为地方区块,森林等地形则会有移动惩罚。目前的区块提示还十分简陋,晚些改成有些透明的样式应该会好不少。

OK!这就是本次日志的开发内容了!虽然实现内容展示十分简单,但实现的逻辑还是挺复杂的。

为了保证项目结构的清晰,很多逻辑在开发时,就会考虑到很多后续开发的扩展性,以及努力降低各个模块的耦合度,减少修改难度.

开发过程总是想的很多,能够实现的内容确相当有限,移动相关功能制作需要不少时间。下一回就来介绍介绍偏程序的项目结构吧!

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

  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 注册的实例则可以实现 StartUpdate 等 Unity 生命周期函数。

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

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

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

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

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

  1. 在以前我会通过单例,在场景中放置大量的 xxxManager 来管理一个逻辑模块,在项目复杂以后,大量的 Manager 真是让人看的头大,改用 DI 后,就再也看不到这些 Manager 啦。
  2. 通过将很多原来需要实现 MonoBehaviour 才能在场景中使用的逻辑,通过 RegisterEntry 来注册不需要继承自 MonoBehaviour 并放在场景中,可以节约不少资源使用。


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

首先是优化了一下移动范围反馈的颜色,让提示变得顺眼一些。

现在蓝色的板块提示就是可移动范围,黄色的是友军,红色所在的是敌人,黑色则是移动范围的尽头。

然后是整理了一下角色操控逻辑的设计模式,把原来混杂了大量控制逻辑的不同状态下的控制逻辑堆在一起的垃圾堆,改用状态机的模式重构了一下,的确清爽不少,接下来加逻辑也会省事不少.不过是比较简单的逻辑整理就不作展示了。

接下来就是单位的移动了,我们选中单位后,只要鼠标在可移动砖块上移动就会显示一个移动线路来展示单位移动至该处的路径。

线的样式十分简陋,凑合着看啦.接下来有空会给加上一些提示色以及节点序列的内容。

随后点击一格可行动单元格单位就会移动过去了,移动的过程用了 Dotween 来简单的实现了一下,不过感觉很奇怪,晚些应该也会再写一版.

其实还尝试些了一些 UI 的内容,不过留到下次展示吧,在放弃 UIToolKit 后,我转用了熟悉的 UGUI,很多基础内容的制作无趣异常,大家有什么推荐的 GUI 组件库么,欢迎在评论里推荐一下!

以上就是最近的开发内容了. 前段时间去贵阳出差了一段时间,开发内容就相对比较少,内容也很简陋还望谅解,

呀~贵阳真是座美丽的城市,山峦和高楼并立的城市我作为一个江南人还真是头一回见.我还第一回亲眼见到了大熊猫还是很开心的 ^_^。回来的高铁上看了川端康成的《山音》,情感相当细腻的一本书,推荐一看哦!


要是有志同道合的美术和策划就好啦~~如果你对开发项目有什么建议的话,欢迎与我交流哦! QQ: 2763686216