撰写了文章 更新于 2019-08-20 22:08:51
《斧头人(Axe Man)》八月开发日志
游戏简介
《斧头人(Axe Man)》(Github 页面,英文博客)是一款正在开发的单人回合制 Unity Roguelike 游戏。上个月 以来,大部分时间都在开发技能系统。目前玩家人物可以使用技能,但是还不能用“基本元素”自行组装技能。这个系统是《斧头人》的核心特色,挺复杂的,以后有机会详细讲一讲。另外这个月还写了三篇文章,接下来分享一下其中两篇文章的内容(略有删减)。
图 1:演示动画,八月。
图 2:演示动画,七月。
创建游戏对象
为了通过 prefab 创建游戏对象,我们可以这样做:
图 3:创建游戏对象。
但是这里有几个问题。首先,输入参数是字符串,一不留神会弄错。其次,我们可能希望在创建对象时设定对象的位置,并添加更多组件。所以说,从外部看,我们需要一个黑盒子接受数据标签作为输入,输出游戏对象。盒子内部的结构如下:
图 4:对象工厂框架。
本章节涉及到以下代码:
首先,我们把黑盒子的输入参数从字符串改成自定义对象:
图 5:使用自定义对象作为输入参数。
接下来,我们发布事件(AddingComponent)给当前对象添加更多组件:
图 6:添加组件。
事件的订阅者根据对象标签添加相应组件:
图 7:订阅事件。
最后,我们使用 Blueprint 生成每个对象的位置:
图 8:生成对象坐标。
现在生成对象需要两个步骤:
图 9:创建游戏对象,最终版。
处理玩家按键输入
最简单的输入系统是这样的:
图 10:输入系统的简单实例。
但是随着游戏逻辑变得复杂起来,我们需要把代码拆分成更小的模块,比如:
图 11:输入系统框架。
本章节涉及到以下代码:
首先,我们把接受输入和执行命令拆分成三个环节:
- [接受输入 --> 把输入转化成命令] --> [发布事件广播命令] --> [执行命令]
第一个环节需要至少一个命令转换器:
图 12:把输入转化成命令。
接下来,PCInputManager 把命令发送给订阅者:
图 13:发布命令。
执行命令与本章节无关,所以不谈了。
为了控制代码长度,我们可以创建多个转换器,每一个都实现了 IConvertInput,负责把某一组按键转化成相应的命令,比方说 MovementInput,SkillInput 和 InventoryInput。同时,稍微修改图 13 的代码:
图 14:发布命令,修订版。
还有一个问题。同一个按键,比方说左方向键,既可以在地下城里让玩家人物向左移动,也可以在物品栏里让光标向左移动。我们为每种游戏模式创建一个游戏对象,每个对象有独立的输入管理器,但是共享一套转换器。考虑到转换器内部有一个 Update() 方法,我们用另一个对象 XInputSwitcher 订阅某些事件,启用或禁用管理器,就这样解决了按键冲突的问题。
图 15:输入切换器。
最后献上心の俳句:高一的暑假,人生中只有 NaN 次,千万要珍惜。
目录