撰写了文章 发布于 2019-05-21 12:59:17
《真菌洞窟(Fungus Cave)》五月开发日志
一线断时,落落磊磊。
游戏简介
《真菌洞窟(Fungus Cave)》(Github 页面,英文博客)是一款单人、回合制 Unity Roguelike 游戏,最新版本是 0.2.0。上个月 以来主要做了四件事情:
- 改进存档功能,使用事件(event)传递数据。
- 新增第三层地下城。
- 新增甲虫再生机制。
- 新增冲刺模式。
图 1:演示动画,五月。
图 2:演示动画,四月。
这款游戏已经做完了,大家感兴趣的话可以玩一玩。回顾整个开发过程,写代码用了八个月,在那之前花了两个月学习 C# 和 Unity——我觉得一个人的时间非常有限,一定要合理安排。
最后一篇开发日志讨论两个话题:用事件传递数据,设计敌人:2。
图 3:《空条承太郎想对我告白》
用事件传递数据
四月开发日志 谈过存储和读取游戏数据,这个月做了一些改进。首先回顾一下从二进制文件到游戏对象的数据管道:
- [ 二进制文件 <--> SaveLoadFile ] <--> [ SaveLoadGame ] <--> [ 游戏对象 Y ]
SaveLoadGame 为了传递或者读取数据,需要和大量游戏对象沟通,我们不妨在 SaveLoadGame 内部定义两个事件:
图 4:事件与事件参数。
游戏对象订阅上述两个事件,并实现接口 ISaveLoadBinary,它的数据就能被保存和读取了。接口定义在 SaveLoadFile 内部。
图 5:接口定义。
举个例子。假如我们要保存 Person 对象的 Salary:
图 6:保存数据。
读取存档的时候,我们根据 IDataTemplate.DTTag 筛选数据:
图 7:读取数据。
设计敌人:2
三月开发日志 介绍了怎样设计出一系列敌人原型,这里谈谈如何给原型添加数据。《真菌洞窟》的地下城共三层,每层的敌人组成和敌人数据见以下两张表格:
图 8:敌人组成。
图 9:敌人数据。
我们考虑一种最简单的情况:PC 和 NPC 站在相邻位置,轮流攻击,攻击必定命中,那么:
- 最终谁能活下来?
- 如果 PC 存活,那么他攻击了多少次?
PC 和 NPC 的资源发生了两种交换:
- PC 的伤害值 --> NPC 的生命值
- NPC 的伤害值 --> PC 的生命值
第一种交换是指 PC 用 3 点伤害“购买”NPC 的 3 点生命,这里涉及到两个问题:
- 我们能否给 PC 的伤害指定三个数值:低伤害,普通伤害和高伤害?
- 需要多少次攻击才能杀死拥有普通生命值和高生命值的 NPC?
在这个游戏里,PC 的普通伤害是 2 点,最小和最大值分别是 1 和 3。平均来说,需要 3 次攻击杀死普通生命值的敌人(动物和软泥),5 次攻击杀死高生命值的敌人(不死生物)。
现在来看第二种资源交换。假如 PC 攻击 3 次杀死目标,那么他将受到几次反击呢?如果 PC 先行动,受到 2 次反击;如果后行动,3 次反击——详见图 9 中的“命中下限”和“命中上限”。我们分三步确定 NPC 的伤害值和 PC 的生命值:
- 为 NPC 的伤害指定三个数值:低伤害,普通伤害和高伤害。
- 根据上述数值,确定 PC 可能受到的伤害总量。
- 根据伤害总量确定 PC 的生命值。
PC 的最大生命值是 10,略低于 NPC 造成的伤害总量,这背后涉及到两条规则:
- PC 生命值低于 1 时,自动消耗 1 瓶药剂,生命值恢复到最大值。如果没有剩余药剂,PC 死亡。
- 大部分敌人被击杀后掉落 1 瓶药剂。
因此,不考虑其它因素,PC 和 NPC 一对一战斗时不会吃亏,一旦被围攻极有可能死亡。这是为了鼓励玩家有策略地移动,利用地形分隔敌人。接下来,我们添加更多数据创造出有特色的的敌人,比方说行动能量、攻击感染率等等,这里不详细说了。
最后留一道思考题。既然人类的能力是有极限的,那么一台塔奇克马的最大输出功率相当于多少个御坂美琴?
图 10:I wonder what she does when she wakes up.
_