从零点五开始用Unity做半个2D战棋小游戏(四)
发表于2019-01-01
元旦快乐。
这是第20篇与游戏开发有关的文章。
| 写在最前
这次想要一个简单且传统的战棋小游戏,大概的玩法是:在2D世界里创建一张由六边形地块组成的战斗地图,敌我双方依据体力在地图上轮流行动并向对方发动攻击,先消灭掉所有敌人的一方将获得胜利。
预计将分为以下几篇(未完成前可能会调整...):
1、创建战场(已完成)
根据预定尺寸生成战场地图,并随机一些障碍物。
2、添加地图功能 (已完成)
实现战场格子点击反馈,地图导航及范围选定。
3、添加对战双方(已完成)
向战场中添加作战单位,作战单位轮流行动,可进行移动、攻击。
4、加入玩家控制
玩家可控制一个战斗单位,手动选择移动目标及攻击单位。
5、添加战场UI
添加可以随时显示战况的Hud、为作战单位添加血条等。
6、扩展作战单位
丰富作战单位的类型,添加职业,并加入若干不同类型的技能。
7、扩展战场地图
丰富战场地图,加入地形及道具等元素。
8、规范战斗配置
可以通过规范化的数据结构配置战场、职业、技能、道具等。
本次的主题是:加入玩家控制。
项目代码会上传至我的Github:https://github.com/elsong823/HalfSLG 中,有兴趣的同学请自取。
| 目标
分配一个角色给玩家手动操作,每回合玩家有一次行动机会,行动的规则是:可从移动、攻击、待命中选择一次操作,当玩家选择移动后,还可选择一次攻击或待命的操作;玩家也可以不进行移动直接选择攻击或待命,这也会结束当前行动回合。
实现后的效果如下图:
这次要做的非常少,因为之前已经写好了战斗逻辑,只需要把手动操作加入即可。
| 准备工作
首先,为战斗单位设置一个是否为手动操作的标记。
其次,为战斗单位设定一个手动操作状态,标记这个战斗单位是否可以移动、攻击。
最后,新增一种新的战斗单位操作状态和动作,分别是等待玩家操作状态及等待手动操作的动作。
当轮到玩家操作时,战斗的单位会显示绿色边框。
| 手动操作的逻辑
大概思路是:战场维护一个战斗单位的行动队列,每当轮到一个单位行动时,如果这个单位是自动操作的,那么它会自己决定目标,移动并攻击,上回我们将数据与渲染进行了分离,因此它只是产生了一次行动数据(Action)。
如果这个单位是手动操作的,那它会产生一个等待手动输入的行动数据,同时返回等待玩家操作状态。
当战场发现自己收到了一个等待玩家操作的状态,就明白其实刚才的家伙并没有生成任何有意义的战斗数据,因此它必须通知自己的渲染器(那个用来显示的模块,上回我们介绍过):嘿,帮我问问他到底想干嘛?
渲染器通过UI与玩家进行交互,获得玩家要移动、攻击或是待命等“有用”的战斗信息后,再回头通知战场“这个家伙已经行动过了”,战场再让下一个单位行动。
简易的行动流程图
由于下一回我们才会加入战场UI,这里我们先用Unity自带的GUI代替。
用GUI显示一个列表,接收玩家的操作
| 写在最后
2018年瞬间就过去了,回想年初时豪情万丈列下的“2018年必做之十大事”,如今...额...都不敢看清单上有什么...
过去的就让他过去吧...2019年,请自己继续加油吧。
初心易得,始终难求。
下回见。