引言

好久没有写博客了,这半年在游戏公司工作,过得比较充实,每天不是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. php版本低更换php版本-问题以解决

    Parse error: syntax error, unexpected 'class' (T_CLASS), expecting identifier (T_STRING) or variable ...

  2. iOS中Block循环引用的问题

    说到循环引用问题,想必大家都碰到过吧,比如在使用Block的时候,使用__weakSelf来代替self解决等,但是对于这个,还是有不少可以探索的点,下面我就来说下,希望对大家有所帮助. 是否所有的B ...

  3. ping ipconfig telnet

    //查看本机IP ipconfig 内网拼其他机子, 其他机子一定要关闭防火墙 ping 192.168.198.46 telnet  192.168.198.46 3000     拼端口  会跳转 ...

  4. 基于 HTML5 Canvas 的 Web SCADA 组态电机控制面板

    前言 HT For Web 提供完整的基于 HTML5 图形界面组件库.您可以轻松构建现代化的,跨桌面和移动终端的企业应用,无需担忧跨平台兼容性,及触屏手势交互等棘手问题.也可用于快速创建和部署,高度 ...

  5. ES6学习之-let 和const命令

    let 和const命令 let命令 用来声明变量,类似于var .let声明的变量 只在let命令所在的代码块内有效. 在for循环里也是如此 每次循环其实都是一个代码块 function fn() ...

  6. Linux系统查找清理磁盘大文件

    本文主要介绍Linux系统磁盘使用空间不足时,如何查找大文件并进行清理的方法. 使用df-h检查一台服务器磁盘使用空间,发现磁盘已经使用了100%,其中/dev/mapper/vg_iavp-lv_r ...

  7. 【原创】CRM 2015/2016,SSRS 生成PDF文件,幷以附件的形式发送邮件

    主要步骤如下: 生成一条邮件记录 生成一条ActivityParty记录 生成PDF文件,并以Base64添加到ActivityMimeAttachment 中去 打开发送邮件窗口,以便编辑及发送邮件 ...

  8. bat脚本,winscp,shell加mysql存储过程实现mysql单条数据迁移

    起因 公司有个任务,需要迁移mysql中的单条数据.从公司的dev环境到staging环境,dev环境的mysql安装在windows server 2012 R2下,stage是aws的服务器不能直 ...

  9. SQL学习笔记:函数

    SQL函数 AVG select AVG(col) AS avgvalue from tablename select col2 from tablename where col1>(selec ...

  10. vue手脚架安装和项目创建

    一 node安装 1 如果不确定自己是否安装了node,可以在命令行工具内执行:node -v: 2如果执行结果显示:xx不是内部命令,说明你还没有安装node,node按爪给你地址 : http:/ ...