引言

好久没有写博客了,这半年在游戏公司工作,过得比较充实,每天不是add feature就是debug,所以忽视了写博客。今天发一篇关于AI博客。

主要是最近看了一些关于"The Last Of Us"(美国末日Only Play Station)的AI设计文档,并结合一些自己实际项目的心得,分享一些这方面的经验。

进入正题之前,我要呼吁一下,能不能给游戏开发建立一个网站博文分类。

分层次的状态机

关于游戏方面的AI,行为树和状态机,模糊逻辑,机器学习,导航网格,博弈一般是重点话题。本文主要谈的是状态机,并不会涉及其他的高深的东西。

首先状态机要分层次,我们可以粗略的分为高层次状态机和低层次状态机。对于低层次的状态机要充分的复用,高层次状态机可以高度定制。

举几个例子:

其一,初级行为状态机。跑步,行走,跳跃,游泳。对于主角和所有怪物来说,只有数据上
的不同,没有逻辑上的不同。换句话说,大家都会跑,无非是跑步速度和姿势不同。这两者都是数据上的不同,速度对应float变量,姿势对应string变
量(动画资源文件)、跳跃同理。初级行为状态机应该被高度复用。根据提供的阈值数据,如速度可以控制切换跑步和行走状态。

其二,行为状态机。跟随,聚集,分散,围绕,巡逻等行为,可以复用初级行为状态机,比
如跟随可以复用跑步,行走。对于主角和所有怪物来说,只有数据上的不同,没有逻辑上的不同。比如说跟随距离与时间,分散与聚集的程度等。行为状态机依旧需
要复用,但复用的程度要比初级行为状态机低一些。因为可能需要实现具有特殊效果的围绕,而不能通过简单修改数据实现。

其三,技能状态机。一般都包含如下阶段,前摇(precast),吟唱
(chant),施放(release),碰撞(hit),收尾(back)等等。这个对于游戏中的各种角色来说,也只有数据上的不同,而无逻辑上的不
同。我在这里认为它是低层次的。一个技能可以包含全部阶段,也可以包含某些阶段。每个阶段对应自己的动画和特效和时间。这些全部都是数据上的不同。当然我
们依据可以复用行为状态机的逻辑,但未免有些复杂,如果技能状态机复用行为状态机时,那么此时它可以被定义为高层次的状态机。

最后,我们需要一个数据驱动的动画管理器,它维护了一张动画表,里面包含动画的相关信息,优先级,位置,动画资源路径等。然后我们依据当前角色的低层次状态机的状态。来决定播放动画。

对于低层次的状态机要尽量复用,然后通过数据驱动的方式产生千变万化的效果。做法就是用一张数据表存储这些数据,它可以是json,也可以xml,以及其他任何形式。

对于高层次状态机,那么要体现出个性化,根据每个怪物的职能来决定。高层次的状态机的任务是做决定而不是执行。何时释放技能,释放那个技能,何时跟随,何时围绕等等。

对于高层次的状态机,可以使用Lua,组合调用是否技能的接口以及行为的接口。比如设计一个boss的ai,它在战斗中会依据玩家与自己的距离关系,选择释放不同的技能。

玩家逃跑时,选择追踪玩家。在没有发现敌人时,选择巡逻。之所以用lua,是因为lua支持热更新。我们可以为每一个类型的boss单独写一套AI逻辑。

高层逻辑复用低层逻辑,低层逻辑使用数据驱动。这样AI System就搭建完成。

分层次的状态机实现

在代码的实现层次上,所有不同的AI角色,编译类型是一样的。可以用一个数字表示他的
类型,是杂兵还是boss。他们都复用低层逻辑,且我们为不同类型的怪配置不同类型的数据表,有的跑的快,有的跳的高,有的听力好,有的视觉强。最后我们
只需再定义一些高级的逻辑,决定它们何时跑,何时跳,何时放什么技能,All Done

不对,并不是All Done.对于成群结队的小怪来说,最好不要都有一样的AI。这样行为太过统一会使玩家感到乏味,比如当玩家血量较低时,所有怪物同时挤在一块放同一个技能

这样非常不好。我们可能需要设计一个GroupAI,或者全局战斗AI来管理一组小怪物。告诉他们每个人需要做些什么。

参考文献

[日]大野功二 《游戏设计的236个技巧》

[国外]   Mark Botta "Game AI Pro 2 :Infected AI in the last of us"

[美]Steve Rabin 《人工智能游戏编程真言》

美国末日AI System设计分享的更多相关文章

  1. MOBA英雄AI设计分享

    转自:http://www.gamelook.com.cn/2018/07/333877 文/wataloo 1  设计概要 1.1  设计原则和目的 英雄AI的目的主要有: 1.新手过渡局,让玩家刚 ...

  2. 7.地图随机装饰,与转化过程补充,与ai的设计思路

    这两天本来只想实现地图的随机装饰,然后发现以前的bin格式设计存在不足,所以最后不得不去改地图,并去重制整个地图的阶段,此篇总结这个过程 先描述下bin结构 首先地图由无数六边形组合,一个六边形由两层 ...

  3. iOS网络层架构设计分享

    前言 前些天帮公司做了网络层的重构,当时就想做好了就分享给大家,后来接着做了新版本的需求,现在才有时间整理一下. 之前的网络层使用的是直接拖拽导入项目的方式导入了AF,然后还修改了大量的源码,时隔2年 ...

  4. [LeetCode] Design Search Autocomplete System 设计搜索自动补全系统

    Design a search autocomplete system for a search engine. Users may input a sentence (at least one wo ...

  5. [LeetCode] Design Log Storage System 设计日志存储系统

    You are given several logs that each log contains a unique id and timestamp. Timestamp is a string t ...

  6. [LeetCode] Design In-Memory File System 设计内存文件系统

    Design an in-memory file system to simulate the following functions: ls: Given a path in string form ...

  7. AI Boot Camp 分享之 ML.NET 机器学习指南

    今天在中国七城联动,全球134场的AI BootCamp胜利落幕,广州由卢建晖老师组织,我参与分享了一个主题<ML.NET 机器学习指南和Azure Kinect .NET SDK概要>, ...

  8. [LeetCode] 642. Design Search Autocomplete System 设计搜索自动补全系统

    Design a search autocomplete system for a search engine. Users may input a sentence (at least one wo ...

  9. AI: 字体设计中的贝塞尔曲线

    http://www.xueui.cn/tutorials/illustrator-tutorials/designers-must-know-the-secret-of-the-bezier-cur ...

随机推荐

  1. geomesa hbase geoserver

    在geoserver中配置hbase ln -s /root/hbase/hbase-1.4.8/conf/hbase-site.xml /root/tomcat/apache-tomcat-7.0. ...

  2. JDK(三)JDK1.8源码分析【排序】mergeSort

    归并排序是JDK对象数组的排序算法之一,接下来开始分析JDK的归并排序算法. /** * 将指定范围的对象数组按自然顺序升序排序 * * Src is the source array that st ...

  3. Shell笔记-02

    Shell支持自定义变量. 定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编 ...

  4. ubuntu配置telnet服务

    1.安装xinetd 以及telnetd #:~$ sudo apt-get install xinetd telnetd 2.配置文件(若文件不存在就手动添加文件和相应配置信息) 1): #:~$ ...

  5. leetcode -50. Pow(x, n) Accepted

    前言:其实之前自己也有了解关于算法数据结构的一点内容,但是都是用相应的开发工具来写相应的代码,今天面试的时候直接leetcode来写代码,还是用的体内根深蒂固的C和Java来解的题,毕竟目前没见支持O ...

  6. 简单的 Android 菜单

    Android 创建简单的菜单 一:上下文菜单: 1.在 res 下创建菜单项资源文夹 menu app->右击res->new->android resourse director ...

  7. node多图或者单图上传

    <form id="form" enctype="multipart/form-data"> <input type="text&q ...

  8. MySQL语句详解(用户表、密码、权限、远程)

    注: mysql.user表中Host为%的含义 Host列指定了允许用户登录所使用的IP,比如user=root Host=192.168.1.1.这里的意思就是说root用户只能通过192.168 ...

  9. Android环境搭建及Ionic打包(win7)

    本人刚刚接触Ionic3,初步进行打包操作,将其遇到的问题和整个流程记录下载,方便以后的巩固,也为小白们提供一个参考.因本人没有appleヽ(ー_ー)ノ,而且使用的是WIN7系统,所以暂时只提供了WI ...

  10. 我的 Delphi 学习之路 —— Delphi 的安装

    标题:我的 Delphi 学习之路 -- Delphi 的安装 作者:断桥烟雨旧人伤 1. Delphi 版本的选择 Delphi 版本众多,我该选择哪一个,这确实是个问题,自从 Borland 公司 ...