美国末日AI System设计分享
引言
好久没有写博客了,这半年在游戏公司工作,过得比较充实,每天不是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设计分享的更多相关文章
- MOBA英雄AI设计分享
转自:http://www.gamelook.com.cn/2018/07/333877 文/wataloo 1 设计概要 1.1 设计原则和目的 英雄AI的目的主要有: 1.新手过渡局,让玩家刚 ...
- 7.地图随机装饰,与转化过程补充,与ai的设计思路
这两天本来只想实现地图的随机装饰,然后发现以前的bin格式设计存在不足,所以最后不得不去改地图,并去重制整个地图的阶段,此篇总结这个过程 先描述下bin结构 首先地图由无数六边形组合,一个六边形由两层 ...
- iOS网络层架构设计分享
前言 前些天帮公司做了网络层的重构,当时就想做好了就分享给大家,后来接着做了新版本的需求,现在才有时间整理一下. 之前的网络层使用的是直接拖拽导入项目的方式导入了AF,然后还修改了大量的源码,时隔2年 ...
- [LeetCode] Design Search Autocomplete System 设计搜索自动补全系统
Design a search autocomplete system for a search engine. Users may input a sentence (at least one wo ...
- [LeetCode] Design Log Storage System 设计日志存储系统
You are given several logs that each log contains a unique id and timestamp. Timestamp is a string t ...
- [LeetCode] Design In-Memory File System 设计内存文件系统
Design an in-memory file system to simulate the following functions: ls: Given a path in string form ...
- AI Boot Camp 分享之 ML.NET 机器学习指南
今天在中国七城联动,全球134场的AI BootCamp胜利落幕,广州由卢建晖老师组织,我参与分享了一个主题<ML.NET 机器学习指南和Azure Kinect .NET SDK概要>, ...
- [LeetCode] 642. Design Search Autocomplete System 设计搜索自动补全系统
Design a search autocomplete system for a search engine. Users may input a sentence (at least one wo ...
- AI: 字体设计中的贝塞尔曲线
http://www.xueui.cn/tutorials/illustrator-tutorials/designers-must-know-the-secret-of-the-bezier-cur ...
随机推荐
- Springboot时间参数格式化
@Configuration public class DateTimeFormatConfiguration extends WebMvcConfigurerAdapter { @Value(val ...
- 错误:maximum number of expressions in a list is 1000
某一日发现这么如下这么一个错误 --> maximum number of expressions in a list is 1000 原因:因为SQL语句中用到了IN字句,而IN中的元素个数 ...
- python -- 将string转换成dict的方法
装载自:http://smilejay.com/2014/10/convert_string_to_dict_python/ 我将数据库连接相关的一些用户名/密码/host/port等各种东西作为一个 ...
- php版本低更换php版本-问题以解决
Parse error: syntax error, unexpected 'class' (T_CLASS), expecting identifier (T_STRING) or variable ...
- 初始化mysql数据库 /usr/bin/mysql_install_db执行时报错
错误描述: FATAL ERROR: please install the following Perl modules before executing /usr/bin/mysql_install ...
- PHP绘制验证码
<?php //使用PHP绘图技术,画出自己的验证码 $checkCode=""; for($i=0;$i<4;$i++){ ...
- python class用法
创建一个名为 Restaurant 的类,其方法 __init__() 设置两个属性: name 和 type 1.创建一个名为 describe_restaurant() 的方法,前者打印前述两项 ...
- Tomcat 或JBOSS java.lang.ArrayIndexOutOfBoundsException: 8192原因及其解决方法
2018-04-02 09:24:55 org.apache.catalina.connector.CoyoteAdapter service 严重: An exception or error oc ...
- 前端提交表单两种验证方式记录 jq或h5 required属性
JQuery: <form id="form"> <input type="text" name="aaa"> &l ...
- Vue 父组件调用子组件的方法
qwq 前两天看了下vue,父子组件方法的调用,怕忘记,所以做个小记录. 一.父组件调用子组件的方法 1.父组件 <template> <div id="rightmen ...