引言

好久没有写博客了,这半年在游戏公司工作,过得比较充实,每天不是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. wepy build 错误 [Error] 未发现相关 less 编译器配置,请检查wepy.config.js文件。

    [Error] 未发现相关 less 编译器配置,请检查wepy.config.js文件. 缺少less包,npm install less -d

  2. PAT——1021. 个位数统计

    给定一个k位整数N = dk-1*10k-1 + ... + d1*101 + d0 (0<=di<=9, i=0,...,k-1, dk-1>0),请编写程序统计每种不同的个位数字 ...

  3. App测试需要测什么

    App,做为当下最热的手机安装软件,无论是产品本身的设计还是性能,易用性等都是非常受考验.一个app能在用户的手机上使用,并作为一个长期用户是非常不容易的.那么,App的测试中我们到底要测试什么呢? ...

  4. MongoDB简易

    一   安装 1.下载 $ brew install mongodb 2.启动 $ mongod --config /usr/local/etc/mongod.conf 3.连接 $ mongo 二 ...

  5. 解决apache启动错误:Could not reliably determine the server's fully qualified domain name

    启动apache遇到错误:httpd: Could not reliably determine the server's fully qualified domain name [root@serv ...

  6. [iOS]AVSpeechSynthesizer语音合成

    #import <AVFoundation/AVFoundation.h> // 初始化方法 AVSpeechSynthesizer *speech = [[AVSpeechSynthes ...

  7. 关于iOS Block当中为什么要用weakSelf和strongSelf的思考

    场景:当你在某个界面请求网络数据的时候,用户不愿意等待点击了返回按钮,此时在Block当中用如下的方式使用weakSelf的话,有可能会奔溃(因为在并发编程的情况下,虽然在if判断的时候weaksel ...

  8. ubuntu服务器安装jupyter notebook, 并能够实现本地远程连接

    1.terminal 敲击 pip3 install jupyter 2.terminal 敲击 jupyter notebook --generate-config 3.terminal 敲击 py ...

  9. MySQL----MySQL数据库入门----第二章 数据库和表的基本操作

    2.1 数据库和数据库表的创建 ①数据库的创建(在数据库系统中划分一块存储数据的空间): create database 数据库名称 [charset 字符集]: ②数据库表的创建 use 数据库名 ...

  10. php面试题,百度答案

    一公司: 1.@当将其放置在一个PHP表达式之前有什么作用? 2.用foreach把$arr=array(1,2,3,4)每个values值乘2输出: 3.PHP定界符如何使用? 4.说出mysql_ ...