23

从零点五开始用Unity做半个2D战棋小游戏(八)-腾讯游戏学院

 5 years ago
source link: http://gad.qq.com/article/detail/289421
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
好久不见。

这是第25篇与游戏开发有关的文章。

| 写在最前
这次想要一个简单且传统的战棋小游戏,大概的玩法是:在2D世界里创建一张由六边形地块组成的战斗地图,敌我双方在地图上轮流行动,并向对方发动攻击,先消灭掉所有敌人的一方将获得胜利。

预计将分为以下几篇(未完成前可能会调整...):

1、创建战场(已完成)
根据预定尺寸生成战场地图,并随机一些障碍物。

2、添加地图功能 (已完成)
实现战场格子点击反馈,地图导航及范围选定。

3、添加对战双方(已完成)
向战场中添加作战单位,作战单位轮流行动,可进行移动、攻击。

4、加入玩家控制(已完成)
玩家可控制一个战斗单位,手动选择移动目标及攻击单位。

5、添加常用的界面(已完成)
建立界面管理器,加入一些常用的界面。

6、添加常用的战场显示(已完成)
为战斗单位添加血条,加入伤害文字特效。

7、扩展作战单位(已完成)
丰富战斗元素,加入并实现手动释放不同类型的技能。

8、加入AI系统(上)
建立超级简单的AI系统。

9、加入AI系统(中)
调整AI系统的决策方式。

10、加入AI系统(下)
总结AI系统。

11、扩展战场地图
丰富战场地图,加入地形及道具等元素。

12、规范战斗配置
可以通过规范化的数据结构配置战场、职业、技能、道具等。

本次的主题是:建立超级简单的AI系统。

项目使用的Unity版本为:Unity2018.3.0f2

代码会上传至我的Github:https://github.com/elsong823/HalfSLG 中,有兴趣的同学请自取。


| 目标
加入一个超级简单的AI系统,会自动释放不同类型的伤害技能。
5c85c38356151.gif
自动释放技能的AI

需要提前说明的是,建立简单的AI系统预计将拆分为三篇更新。

第一篇(本篇)通过加入一些简单的AI逻辑,保证战斗单位可以自动选择(伤害)技能、自动作战,进而顺利的完成一场战斗。

第二篇会进一步丰富AI的决策系统,让它的表现更具期待性,使战斗变得更加有趣。

此外,我邀请了我的好友Aillieo,拜托他按照自己的方式也设计一个AI系统。

因此,我会在第三篇介绍他所设计的AI系统,并对这三篇做一个整体的总结。


| 非常简单的AI系统
个人以为,有意思的AI系统可以简单的定义为:

让人觉得符合逻辑,却又在一定程度上超出了预期。


如何实现一个非常简单的AI系统呢?为了让问题变得再简单些,我将AI的行为拆解成固定的三个步骤:
1、确定攻击目标;
2、向攻击目标移动;
3、使用技能。

| 确定攻击目标
将”合理“的目标设定为攻击目标,是件并不太容易的事情。

这里我且不谈那些优秀的游戏是怎么做的,因为我也不知道。只说说我目前所使用的方法:仇恨系统。

5c85c39884606.png
AI使用仇恨列表确定攻击目标

每当一个战斗单位在战场中被敌人攻击时,他就会偷偷的在自己的小本本里记下攻击者的名字,以及他们的罪行。

当轮到他行动时,他就会掏出自己攥了很久的小本本,按照之前它们揍自己的程度进行降序排列,然后按照这个名单,判断自己反击的可能性

这里,没有反击的可能性,指的是:如果目标已经被人包围,自己却又是一个近战角色无法靠近,那他就会嘟囔着“哼饶你一条狗命”,然后继续看下一个人。

直到确定这个家伙可以被自己攻击到,他就会合上小本本,把他的名字刻上自己的心头,然后准备开始下一个步骤:向他移动。

| 向目标单位移动
向目标移动就很简单了,通过A-Star算法找到移动路径后,行动即可。
5c85c3b268ef8.png
确定目标后沿路径移动

但是这里有一个小问题:应该选择哪个格子作为移动的终点呢?

特别是当攻击者是某些远程攻击单位,比如游戏中常见的魔法师或者弓箭手,每次都走到目标旁边去攻击,感觉上就有点像“送外卖”

其实解决方法也很简单,在导航时仍然选择目标所在位置做为导航终点,但在距离终点一定距离时,停止导航并返回导航路径即可。这个停止距离,就是远程攻击单位的射程,或者手动设定的某个值。

5c85c3c1c108b.png
射程为2的小红,导航停止在距离小蓝两个单位的格子上

这与“真正的爱情,能跨越一切障碍”是一个道理。

当然,如果这个人儿并不在天边,而在触手可及的地方,那他根本就不用移动,直接进入下面的环节吧。

| 对目标使用技能
光说,不练,假把式。

好容易走到了他(她)的身边,总得有所表示吧?

试想一个场景:你很喜欢一个女孩儿,在表白的关键时刻,你有一百种表达方法,但你却只能选择一种,究竟哪种才是最有效的呢?

如果是真实的生活,答案很简单:看运气

但是游戏则不同,你可以用S/L大法(存、读档大法)来不断重试,直到找出效果最好的那一种!

决策将要使用的技能也可以是一样的。

这里我且不谈那些优秀的游戏是怎么做的,因为我也不知道。只说说我目前所使用的方法:简单的计算所有可用技能的释放回报

5c85c3d410808.png
计算技能得分并确定所使用的技能

计算技能释放得分的公式异常复杂,由于这并不是一篇学术性论文,因此这里不做详细的解释和说明,只把公式列出即可:

技能释放得分 = 技能造成的总伤害 ÷ 技能消耗的能量值

也就众所周知的:
5c85c3ee22ad4.png

天啊,好麻烦。

但是,在得到了按照释放得分降序排列的可用技能列表后,带着何种的心情、用着怎样的姿势、使用哪个技能的问题,就变得十分容易了。

可能我们只需要注意下远程范围技能的释放点选择问题即可。
5c85c4252a439.png
释放影响半径为2的远程范围技能

对于远程范围技能,我们当然可以使用一些方法,找到覆盖最多目标的释放点。

但为了省事儿,我这里是这么处理的:当目标超过技能释放距离时,尝试找到释放技能时,可以覆盖到目标单位的点,然后从这里随便选一个即可。当然,如果目标本身就在技能释放半径内,就选它为释放中心了。

5c85c4027d788.png
红色区域为覆盖半径为2的技能在释放时,可以伤害到蓝色格子的释放点

| 能量值
当然,为了帮助AI计算出哪个技能的释放得分更高,我为每个战斗单位都增加了一个能量值的属性(你也可以认为它是魔法值);为每个技能增加了释放的能量消耗;同时还为游戏增加了每次行动时恢复10个单位能量的设定。但是由于这些逻辑都很简单,这里就不赘述了。

最后,我们来回顾下整个行动流程吧:
1、打谁;
2、去哪打;
3、怎么打。

5c85c436dc34d.jpg
完整的AI行动流程


| 写在最后
至此,建立超级简单的AI系统篇就介绍到这了。如你所见,这里只是实现了非常简单的AI行动逻辑,并没有体现出各种类型AI的不同,我们下期将尝试着解决这个问题。

但是目前还没想好怎么做,而且最近又很忙,因此下回可能会拖得久一些吧。

5c85c440d681b.png

愿不忘初心。

下回见。

感谢您能读到这里,详细的代码可以移步Github(https://github.com/elsong823/HalfSLG)下载。
文章会在我的公众号 偶尔学学Unity 中不定期更新,欢迎关注,谢谢。
5c511861ac776.jpg


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK