一.游戏AI

游戏AI(Game AI),是指在游戏中,由已经写定好的程序控制的“类人化玩家”,俗称电脑玩家。一般的游戏AI能够拥有对真实玩家的一系列操作感知的能力并对此作出交互行为,比如:攻击(Attack),逃跑(Run away)等。而且AI所做出的反应并不是凭空生成,而是通过模仿真实玩家的操作使其行为富有“智能化(Intelligent)”。

需要注意的是,一般的游戏AI与我们讨论计算机视觉、自然语言处理等领域时所说的AI(人工智能)并不相同,考虑到游戏的开发成本,周期以及家用计算机处理能力,游戏AI的智能度相对较低。不过随着硬件的发展,游戏AI始终会朝着真正AI的方向发展。

游戏AI中通常分为定性非定性两种。

  • 定性:定性即AI的行为是人为设计好的,只有true(做出反应)或false(不做出反应)。比如说怪物AI,感知到玩家进入视野范围,就会往玩家此时的方位移动,AI不会思考玩家是否携带武器,是否处于某种状态之类的情况。
  • 非定性:非定性即AI的行为有一部分是不可预测的,具体实例是让AI角色学习到适应玩家的行为。这样的学习能力可以利用人工智能的神经网络、贝叶斯技术或遗传算法得到。该技术可以让 AI 自主进行学习,并进化出新的行为,增加游戏可玩性。开发者也无需考虑到AI在游戏中所出现的所有情况,可以减少定性AI所产生的一些BUG。目前已经有一些3A开发厂商开始对这一方面进行深入研究。

目前游戏AI基本归结为三个部分的能力:感知,思考,动作。

  1. 感知:是指能够察觉到周围环境变化,如玩家进入视野,AI受到攻击等。
  2. 思考:是指能够对感知到的事物进行一个选择反馈,“思考”该做出什么行为,这是AI中最主要的组成部分。
  3. 动作:是指AI通过思考得出结果并根据该结果在游戏做出实际的行为,攻击,逃跑,交流等都属于这一类。

二.游戏AI的基本实现方式

Ⅰ.朴素AI

朴素AI指的是仅仅使用简单的分支语句(if…else或switch…case)对AI的行为进行判别和分类。

举个栗子,一个敌方士兵在基地站岗,拥有以下几个基本行为:

  • 玩家未靠近时自动巡逻
  • 玩家靠近基地时(5m)向玩家移动
  • 碰见玩家(<2m)就进行攻击
  • 血量低于30%时寻找掩体并躲起来
  • 血量为0时死亡

IF…ELSE实现:

if(AI.HP == 0){AI.Dead();
}else if(AI.HP > 0 && AI.HP <= 0.2){AI.FindBunker();
}else if(AI.Distance - Player.Distance <= 2){AI.Attack();
}else if(AI.Distance - Player.Distance <= 5){AI.MoveToPlayer()
}else{AI.Patrol();
}

由于游戏中有多种AI,每种AI的行为方式不尽相同,用这种方法我们需要为每一种AI单独写一份代码,几乎没有可重用性,会使开发人员的工作量增大。但是因为朴素AI的效率高,代码直观,所以一般用在项目初期的测试以及应急时期。

Ⅱ.AI有限状态机 (Finite-state machine,FSM)

有限状态机是一种抽象机制,通常设定了各种不同的预定状态。有限状态机也可以定义一连串的条件,以便确认何时应该改变状态,当一个事件的发生,将会触发一个动作,或者执行一次状态的迁移。FSM中一定存在两种状态–初始状态结束状态,在启动一个FSM时,首先必须将FSM置于“起始状态”,然后通过输入一系列操作,最终,FSM会到达“结束状态”或者“消亡状态”。

任何一个FSM都可以用状态转换图来描述。这里我仍然拿上一个栗子来说,下面是一个实际栗子的状态转换图:


简单的FSM代码:

private Enemy enemy = new Enemy();
public void EnemyAction()
{if(enemy.HP){status = AI.Dead(); }else if(enemy.HPLower){status = AI.FindBunker();}else if(enemy.CloseToPlayer){status = AI.Attack();}else if(!enemy.CloseToPlayer && enemy.DistanceToPlayer){status = AI.MoveToPlayer()}else{status = AI.Patrol();}
}

FSM相比于朴素AI的优点:

  • 可以通过分类封装接口,让每一种AI调用接口来实现状态的迁移
  • 不需要实时计算各类函数,减少计算产生的损耗

但是也有缺点:

  • AI越智能,状态流程图就越复杂,后期难以维护
  • AI的功能难以扩展,新加状态的时候需要考虑目前状态间的关系
Ⅲ.AI行为树 (Behavior Tree,BT)

Behavior Tree是一种树状的数据结构。每次调用都会从根节点开始遍历,自顶向下,通过一些条件来检索这颗树,最终确定需要做的行为并执行。下面是一个简单的行为树:

在游戏中,行为树的父节点统称控制节点,而子节点则称行为节点

  • 控制节点:当AI接收到来自游戏中的某一条件时,就会开始遍历这颗行为树,例如:Attack的时候就会从根节点遍历到Attack这个节点上去,并且执行该节点下的行为。这时候的控制节点的作用就是接收信息并对信息进行决策筛选,它没有执行具体操作的功能
  • 行为节点:行为节点处于树的最底端,是最后一个接受信息的地方,意味着它需要对控制节点筛选出来的信息进行具体的操作反馈,是执行具体状态行为的地方

事实上,行为树又称决策树,因为整棵树最主要的部分是控制节点,它需要对条件进行决策,判断出需要执行的正确的行为

行为树的优点不仅在于它逻辑清晰,而且我们可以对其控制节点自定义判断。一般简单的自定义控制节点有三种:

  1. 选择(Selector):根据条件信息,只选择其子节点的某一个执行。
  2. 序列(Sequence):根据条件信息,将其所有子节点依次执行一遍,只有当前一个子节点返回“完成”状态后,才能继续运行下一个子节点。
  3. 并行(Parallel):根据条件信息,将其所有子节点都运行一遍。

不过单独使用行为树也是有缺点:

  • 行为树后期分支数量庞大,每次遍历寻找合适节点的过程消耗高。
  • 如果需要序列或并行状态,需要对整棵树进行多次遍历,过程繁琐。
Ⅳ.个人总结

无论是什么游戏,游戏AI所使用的最好的方法从来不是一个,而是通过不同类型AI来寻找适合该时期使用的方法:状态机+行为树,朴素AI+状态机+行为树等等。随着游戏的不断发展,游戏AI也还有很大的成长空间,会有更多的算法和优化方法去构造更加智能的游戏AI。

总结不易,如有不足,恳请指导!

游戏开发——游戏AI的简述相关推荐

  1. H5数独游戏开发——游戏通关及重玩

    如何判断游戏是否通关?通关后如何重新开始游戏,让用户重玩?今天给大家详细介绍如何实现以上功能.先看一下数独游戏通关后的提示界面,截图如下: 首先,我们需要判断游戏是否通关,那么如何判断呢?有两个条件: ...

  2. 1.15 从0开始学习Unity游戏开发--游戏UI

    上一章中,我们剩下最后一个任务,需要支持鼠标控制准心来进行设计,那么准心本质上就是一个始终呈现在屏幕上的一个图片,你当然可以用一个3D物体来制作,之前讲解渲染概念的时候也提到过,我们的屏幕就是相机的近 ...

  3. H5数独游戏开发——游戏中的事件处理

    假设你正在玩一款角色扮演游戏(RPG),主角走进了一家店铺,你用鼠标点击店铺里管家,这时屏幕显示一个待售物品菜单,然后你可以选购你需要的物品.那么,你知道从你点击鼠标的那一刻起,游戏是怎样响应的吗?让 ...

  4. Android游戏开发–游戏循环

    游戏循环是每个游戏的心跳. 到目前为止,我们仅使用了非常简单的一种(您可以在此处找到),无法控制我们更新游戏状态的速度或速度以及要渲染的帧. 概括地说,最基本的游戏循环是while循环,该循环一直执行 ...

  5. android_Android游戏开发–游戏循环

    android 游戏循环是每个游戏的心跳. 到目前为止,我们使用的是非常简单的游戏(您可以在此处找到),无法控制我们更新游戏状态的速度或速度以及要渲染的帧. 概括地说,最基本的游戏循环是while循环 ...

  6. android游戏开发_Android游戏开发–游戏循环

    android游戏开发 游戏循环是每个游戏的心跳. 到目前为止,我们仅使用了非常简单的一种(您可以在此处找到),无法控制我们更新游戏状态的速度或速度以及要渲染的帧. 概括地说,最基本的游戏循环是whi ...

  7. 游戏运营全过程剖析,游戏开发,游戏运营,游戏推广问题分析

    产品策划:一个好的idea至关重要,结合当时的社会环境,游戏开发水平,玩家喜好,市场需求等考虑.精美的画面,流畅的游戏节奏,情节,完善的游戏系统能让你的游戏立于不败之地. 产品开发:游戏主线框架定好后 ...

  8. Xcode与C++之游戏开发: 游戏对象

    上一篇:Xcode与C++之游戏开发:Pong游戏 游戏对象 在前面的 Pong 游戏中,没有用不同的类去代表墙,球拍和球,仅仅使用了一个 Game 类.像 Pong 这种简单游戏当然没问题,但它不是 ...

  9. Unity游戏开发-游戏热更新以及登录流程

    本篇主要分享基于热更新的游戏初始化方案. 整体初始化的流程大致为:检查是否需要解压资需要则解压,之后再检查是否存在需要热更新的资源文件需要则更新,更新完成后则初始化结束可进入登录界面. 关于登录这块的 ...

最新文章

  1. 网站内链如何布局才能使蜘蛛更喜欢?
  2. (转)CentOS 5.5 64bit 编译安装Adobe FlashMediaServer 3.5
  3. datagrid如何获取一行数据中的某个字段值_使用Mysql 数据库 新手常见问题
  4. Linux快捷键及文件和目录的操作
  5. 检索数据_3_查询满足某个条件行
  6. linux 读取内存颗粒,linux查看主板内存槽与内存信息的命令dmidecode怎么用
  7. python 结构体数组_python实现结构体数组(初始化并赋值)
  8. delphi 中如果不进行 closehandle 会怎么样_报考八一农大的十一大选择之七|带你走进不一样的“信息世界”...
  9. 你能否列出与 Elasticsearch 有关的主要可用字段数据类型?
  10. 关于share prefrences功能的一些理解
  11. 河南省多校连萌(一) E题【kruskal】
  12. 通过的镜像源安装python包
  13. Python操作数据库完成接口测试
  14. 护卫神 mysql 升级_护卫神php套件 php版本升级方法
  15. Springer期刊参考文献格式如何用Latex生成
  16. Linux下彻底卸载mysql
  17. comsol 5.3 matlab,COMSOL5.3在Linux下的安装
  18. 基于医疗RFID手术用品智能柜管理应用方案
  19. 20本必读的用户体验书目
  20. vue移动端用什么数据可视化插件_AntV F2+vue-cli构建移动端可视化视图

热门文章

  1. 木马另类删除文件的方法
  2. 利用注册表更改win7下Office文件图标
  3. LeetCode 516. 最长回文子序列
  4. 公开课《夏季服装秀》_荔枝班_新浪博客
  5. 【2023-04-20】小红书web端搜索采集笔记视频点赞关注自动评论去水印接口源码php
  6. Nginx——nginx作为负载均衡服务(负载均衡示例)
  7. 基于springboot的redis集群配置
  8. 肖 sir_就业课__016非技术面试题
  9. 嵌入式物联网开发,linux,单片机32(仅供借鉴,代码不共享 自行编写)
  10. 中企海外周报 | 哈尔滨啤酒亮相纽约时装周;分享时代新三板摘牌赴美IPO