写在最前

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

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

1、创建战场(已完成)

根据预定尺寸生成战场地图,并随机一些障碍物。

2、添加地图功能 (已完成)

实现战场格子点击反馈,地图导航及范围选定。

3、添加对战双方(已完成)

向战场中添加作战单位,作战单位轮流行动,可进行移动、攻击。

4、加入玩家控制(已完成)

玩家可控制一个战斗单位,手动选择移动目标及攻击单位。

5、添加常用的界面(已完成)

建立界面管理器,加入一些常用的界面。

6、添加常用的战场显示(已完成)

为战斗单位添加血条,加入伤害文字特效。

7、扩展作战单位(已完成)

丰富战斗元素,加入并实现手动释放不同类型的技能。

8、加入AI系统(上)

建立超级简单的AI系统。

9、加入AI系统(中)

调整AI系统的决策方式。

10、加入AI系统(下)

总结AI系统。

11、扩展战场地图

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

12、规范战斗配置

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

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

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

| 目标

加入一个超级简单的AI系统,会自动释放不同类型的伤害技能。

自动释放技能的AI

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

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

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

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

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

| 非常简单的AI系统

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

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

如何实现一个非常简单的AI系统呢?为了让问题变得再简单些,我将AI的行为拆解成固定的三个步骤:

1、确定攻击目标;

2、向攻击目标移动;

3、使用技能。

| 确定攻击目标

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

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

AI使用仇恨列表确定攻击目标

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

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

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

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

| 向目标单位移动

向目标移动就很简单了,通过A-Star算法找到移动路径后,行动即可。

确定目标后沿路径移动

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

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

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

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

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

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

| 对目标使用技能

光说,不练,假把式。

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

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

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

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

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

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

计算技能得分并确定所使用的技能

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

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

也就众所周知的:

天啊,好麻烦。

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

可能我们只需要注意下远程范围技能的释放点选择问题即可。

释放影响半径为2的远程范围技能

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

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

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

| 能量值

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

最后,我们来回顾下整个行动流程吧:

1、打谁;

2、去哪打;

3、怎么打。

完整的AI行动流程

| 写在最后

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

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

愿不忘初心。

下回见。

从零点五开始用Unity做半个2D战棋小游戏(八)相关推荐

  1. 从零点五开始用Unity做半个2D战棋小游戏(完)

    好久不见. 这是第29篇与游戏开发有关的文章. | 写在最前 这次想要做一个简单且传统的战棋小游戏,大概的玩法是:在2D世界里创建一张由六边形地块组成的战斗地图,敌我双方在地图上轮流行动,并向对方发动 ...

  2. 从零点五开始用Unity做半个2D战棋小游戏(十一)

    好久不见. 这是第28篇与游戏开发有关的文章. | 写在最前 这次想要做一个简单且传统的战棋小游戏,大概的玩法是:在2D世界里创建一张由六边形地块组成的战斗地图,敌我双方在地图上轮流行动,并向对方发动 ...

  3. 从零点五开始用Unity做半个2D战棋小游戏(十)

    好久不见. 这是第27篇与游戏开发有关的文章. | 写在最前 这次想要做一个简单且传统的战棋小游戏,大概的玩法是:在2D世界里创建一张由六边形地块组成的战斗地图,敌我双方在地图上轮流行动,并向对方发动 ...

  4. 从零点五开始用Unity做半个2D战棋小游戏(九)

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

  5. 从零点五开始用Unity做半个2D战棋小游戏(五)

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

  6. 从零点五开始用Unity做半个2D战棋小游戏(四)

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

  7. 从零点五开始用Unity做半个2D战棋小游戏(二)

    好久不见. 这是第18篇与游戏开发有关的文章. | 写在最前 这次想要一个简单且传统的战棋小游戏,大概的玩法是:在2D世界里创建一张由六边形地块组成的战斗地图,敌我双方依据体力在地图上轮流行动并向对方 ...

  8. 从零点五开始用Unity做半个2D战棋小游戏(七)

    这是第24篇与游戏开发有关的文章. | 写在最前 这次想要一个简单且传统的战棋小游戏,大概的玩法是:在2D世界里创建一张由六边形地块组成的战斗地图,敌我双方依据体力在地图上轮流行动并向对方发动攻击,先 ...

  9. 从零点五开始用Unity做半个2D战棋小游戏(六)

    好久不见. 这是第23篇与游戏开发有关的文章. | 写在最前 这次想要一个简单且传统的战棋小游戏,大概的玩法是:在2D世界里创建一张由六边形地块组成的战斗地图,敌我双方依据体力在地图上轮流行动并向对方 ...

最新文章

  1. 使用Notepad++比较文件的差异
  2. AI给老照片上色,真的准吗?技术圈和历史圈吵了1000帖
  3. api 原生hbase_HBase客户端API
  4. Ubuntu下基于 Cilium CNI 的 Kubernetus集群环境搭建
  5. Spring JPA 开启原生sql打印
  6. java compareto date_int compareTo(Date anotherDate)
  7. POJ1226 Substrings(二分+后缀数组)
  8. 开源的数据库,PostgreSQL 基础入门实战
  9. WPF 使用FontAwesome字体图标
  10. 解决文件下载在火狐浏览器出现中文文件名乱码的方法
  11. 如何利用系统自带的小工具制作特殊字符
  12. 关于本地yum源的创建方法和使用
  13. 计算机显示器刷新率怎么调,显示器刷新率怎么超频?电脑显示器提高屏幕刷新率超频教程...
  14. 迷你迅雷+SqlServer2008r2下载
  15. SSM-Mybatis的Mapper.xml配置文件
  16. CCNA-静态路由实验
  17. NEON intrinsics 函数模式介绍
  18. html语言中kbd的含义,HTML kbd键盘元素
  19. 每秒解析千兆字节的JSON解析器开源,秒杀一大波解析器!
  20. 生肖猪年运势全方位---07年12生肖运程提点

热门文章

  1. 实战|利用机器学习解决一个多分类任务
  2. 中文 Python 开源资料合集!这应该是最全的了!
  3. 工业级路由器和家用路由器的区别_5G工业级路由器有哪些优势
  4. html删除的标签属性,如何从html标签中删除属性?
  5. java jvm 内存参数_深入详解JVM内存模型与JVM参数详细配置
  6. 一句话理解tf.identity的含义
  7. go 多线程并发 queue demo
  8. containsObject 总是不含有,你会用吗
  9. 2018-10-04-Python全栈开发-day61-DJANGO-MODELS操作补充
  10. python工程结构