类守望先锋游戏AI设计

类《守望先锋》游戏指的是:有很强的FPS属性,同时有丰富的技能系统(和MOBA接近)。

目录

类守望先锋游戏AI设计

1 设计概要

1.1 设计思路

2 FPS游戏AI设计

3 MOBA游戏AI

4 结合MOBA和FPS的游戏AI

4.1行为树脑图

5 总结

1 设计概要

1.1 设计思路

考虑到游戏的最主要特性是FPS+Moba,我们将游戏AI的实现建立在这两种属性之上。先分别分析FPS游戏AI核心功能和MOBA游戏的AI核心功能,然后考虑两种AI融合。

2 FPS游戏AI设计

核心AI元素抽象:跑路,射击,利用掩体

我们从零开始,搭建FPS游戏的AI框架

第一步:实现跑路

在地图上的关键路点之间建立双向导航的网络,如下图所示:

图1.带权重的有向图

这是一个带权有向图,权重归一化之后就是游走概率,比如当AI到达a点时,它下一时刻走到b点的概率为:

此处需要注意的细节:

AI此时移动规律是符合马尔科夫过程的,如果路点过多,很可能出现AI很长时间都无法完成一次全路点遍历,或者一直在一个小区域来回游走。

路点也不能太稀疏,太稀疏则AI路线会比较固定,一般岔路口或者拐角都需要布置路点。

第二步:实现射击

最开始可以简化设定遇到敌人开枪即可。

后续可以增加危险躲避和释放技能的功能。

第三步:利用掩体

我们玩家利用掩体,一般情况下是为了在射击间隔保护自己,一个场景物件能作为掩体的基本要求是:当AI躲在掩体附近合适位置时,没有敌人可以攻击到它。

但实际AI是不认识任何场景物件的。我们在此处让AI识别掩体的简单策略是,在场景物件附近种上若干战术点,当AI处于某个战术点时,如果正好可以避免敌人看到它,就认为这个场景物件可以当做掩体。

如图所示,三个战术点ABC,相对于这个箱子来说,A不是合适的战术点,不能掩藏AI,B和C都可以掩藏好AI。这个箱子可以当做掩体。

图2.战术点和掩体关系

至此我们一个带有寻路,射击和利用掩体的基本FPS机器人就完成了。

3 MOBA游戏AI

一个基本的MOBA游戏AI需要满足沿路线行走,放技能和躲避危险。

其基本实现可以参照《MOBA游戏英雄AI设计》

4 结合MOBA和FPS的游戏AI

我们需要将两种类型的AI做一个融合:游走、射击和利用掩体时采用FPS的AI设定,释放技能时采用MOBA的设定。

4.1行为树脑图

每个英雄都需要单独编写此子树。技能释放逻辑每个英雄都会有差异。

5 总结

至此,结合MOBA和FPS的类似守望先锋游戏AI就完成了。基本可以在温暖局使用而且没有明显的AI痕迹。

 具体实现时比较麻烦的地方在于技能的释放时机判定,基本上每个英雄都要单独写独立的行为子树。

    再做个预告,用行为树或者状态机实现的AI其实根本就不属于人工智能领域。下次分享,将是使用我的研究生阶段专业知识——机器学习——来实现真正意义上的游戏人工智能。可以预料到的,读者会非常小众。目前也仅仅有一些思路,具体开发验证需要利用大量业余时间,策划去编码还是比较痛苦的,并且我的业余时间,呵呵……所以可能是天坑。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏海说

Java应用中常见的JDBC连接字符串(SQLite、MySQL、Oracle、Sybase、SQLServer、DB2)

Java应用中常见的JDBC连接字符串 Java应用中连接数据库是不可或缺的,于是便整理一些可能用到的JDBC的jar包及其相匹配的URL,以备日后查阅。 1)...

2970
来自专栏码匠的流水账

聊聊spring cloud的LoadBalancerAutoConfiguration

本文主要研究一下spring cloud的LoadBalancerAutoConfiguration

1362
来自专栏Pulsar-V

C# 数据类型之String转byte[]

string类型转成byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBytes ( str...

2925
来自专栏Pulsar-V

C#下各种获取时间的姿势

直接贴代码吧 DateTime dt = DateTime.Now; Label1.Text = dt.ToString();//2005-11-5 13:21...

3436
来自专栏互联网开发者交流社区

WinForm之窗体应用程序

2083
来自专栏成长道路

JDBC动态SQL语句连接orcale数据库的工具类

import java.sql.Connection; import java.sql.DriverManager; import java.sql.P...

2700
来自专栏C/C++基础

C#获取系统当前时间

ystem.DateTime currentTime=new System.DateTime(); 1.1 取当前年月日时分秒 currentTime=Sy...

1283
来自专栏james大数据架构

C#日期格式转换

DateTime dt = DateTime.Now; // Label1.Text = dt.ToString();//2005-11-5 13:21:25 ...

2005
来自专栏c#开发者

C# : row-clickable GridView and get and set gridview rows using JavaScript

Complete C# code: ---------------- using System; using System.ComponentModel; ...

3166
来自专栏跟着阿笨一起玩NET

GB2312转换成UTF-8与utf_8转换成GB2312

2291

扫码关注云+社区