引言

好久没有写博客了,这半年在游戏公司工作,过得比较充实,每天不是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. Maven创建项目一些常见的问题

    1 .创建的项目中没有src/main/java.没有src/test/java 主要原因在于在创建项目的时候,使用的是系统自带的jdk,修改方法: 右键项目——Properties——javaBui ...

  2. Android 面试题之编程

    1.排序 package cn.java.suanfa; public class SuanFa { public static void main(String[] args) { int[] ar ...

  3. 《STL源码剖析》要点摘抄

    1. STL的空间配置器 SGI STL设计了双层级配置器,第一级配置器直接使用malloc().free(),第二级配置器则视情况采用不同的策略:当配置区块超过128bytes时,视为“足够大”,便 ...

  4. 身份认证系统(二)多WEB应用的单点登录

    随着互联网的发展,web应用的复杂度也一直在提升,慢慢的单一的web应用已经不能满足复杂的业务需求.例如百度的搜索.新闻.百科.贴吧,其实本质上都是不同的网站.当用户使用这些平台的时候,我们当然不希望 ...

  5. C# 自定义特性Attribute

    一.特性Attribute和注释有什么区别 特性Attribute A:就是一个类,直接继承/间接继承Attribute B:特性可以在后期反射中处理,特性本身是没有什么*用的 C:特性会影响编译和运 ...

  6. throws、throw和try catch

    在学习代理模式的时候,编写动态生成代理类.java文件时,用try{}catch(){}捕获异常发现catch(Exception e)报错,得换成catch(Throwable e),然后又查了查两 ...

  7. MySQL无法启动重启竟是因为改了Linux主机名

    MySQL无法重启.无法关闭.无法启动.无法使用,如果是因为修改了主机名,可以这样解决:关闭掉所有mysql进程,然后在启动一些mysql! 有时候,只要执行如下MySQL初始化命令即可解决:/usr ...

  8. jquery里遍历普通数组和多维数组的方法及实例

    jquery里遍历数组用的是$.each,下面站长给大家几个具体的实例: 实例1.遍历一个普通的一维数组: 1 2 3 4 5 6 7 8 <script> //声明数据有下面两种方式 / ...

  9. ElasticSearch优化系列四:ES的heap是如何被瓜分掉的

    以下分别解读几个我知道的内存消耗大户: Segment Memory Segment不是file吗?segment memory又是什么?前面提到过,一个segment是一个完备的lucene倒排索引 ...

  10. Java Hibernate Validator

    Hibernate Validator是Hibernate提供的一个开源框架,使用注解方式非常方便的实现服务端的数据校验. 官网:http://hibernate.org/validator/ hib ...