An Introduction to Game Engine and OO Design Patterns
AI
游戏智能,尽管没有权威的定义,但可以理解为:在游戏规则约束下,通过适当的 算法 使得游戏中 NPC(Non-Player Character) 呈现为具有一定人类智能行为的 博弈对手,让游戏玩家面临不间断的 挑战,并在挑战中有所收获,包括知识和技能等。
因此,游戏智能与人工智能在设计目标上有着比较大的不同:
“sense-think-act” paradigm(范式) 是构造 agent、robot、NPC(Non-Player Character) 的基础概念。自从上世纪80年代提出以来,我们使用 Sense-Think-Act 范例思考机器人如何工作,并设计它们。 即使机器人最终设计的方式不同,STA 通常仍然是一个有用的开始。 随着机器人技术的发展,协同技术越来越重要,机器人之间的 “Communicate”通常也纳入设计之中。本节主要关注 NPC 如何产生看似理性(Rational)的行为(模拟人)的设计方法。
它与算法设计思考输入、处理、输出类似,但完全不同哦!
1、感知(Sense)
感知是 agent 接收世界信息的行为,其获取的数据将是思考的输入。在游戏中,程序是可以获得游戏世界任意信息的,设计一个“干死”玩家的算法通常是比较容易的,因此如何限制信息获取是设计不同级别 agent 的核心问题。(类似围棋哪种“完美信息贯序博弈”算法,属于学习型智能,不在这里考虑)
在游戏中,定义获取信息能力通常可以从视觉、听觉和嗅觉等渠道去考虑:
使用距离、角度、障碍物限制 agent 发现玩家位置等信息,或者使用干扰影响信息的准确性,这些是设计游戏 agent 常见的手段。如果 agent 都拥有玩家位置和导航地图,结果就是一窝蜂的现象,这是没有趣的事情。合适的限制,将使得 agent 在相同的决策算法下,呈现丰富的行为。
一种简单的方法就是 agent 结合不同类型的触发器、探头,构造不同的获取信息的场景。最后将感知的结果放在一个数据结构中(类似 UnityEngine.EventSystems.PointerEventData)
在 Agent Thinking 时,不可获取感知以外的数据信息。
2、思考(Think)
Think 就是算法,它的输入是感知的数据,输出是行为(behaviours)。 思考的算法,通常就是我们所说的游戏规则的一部分,即 agent 能做什么,该做什么。 通常这不是程序员的工作,而是游戏设计师的工作。游戏 agent 的思考类似人脑的决策过程,这其中的关键不是打造最强大脑,而是建立符合游戏玩家难度曲线,可以控制、且符合社会准则的行为。另一个相关问题,玩家难度曲线在编程阶段是未知的,依赖众多玩家与 agent 的操作与对抗结果。它在游戏测试和运维过程中存在巨大不确定性(在数据驱动的设计和集成脚本引擎等章节中讨论解决方案),因此:
将 agent 决策过程用 If … Then … 硬编码写入程序逻辑是不可行的!
目前,主要方法有:
规则推理引擎
规则推理引擎(Rule-based Inference Engine)也叫产生式系统或推理模型(inference model),是由基于规则的专家系统发展而来。基于规则的专家系统是人工智能领域中专家系统的一个分支,它模拟人类的推理方式,使用试探性的方法进行推理,并使用人类能理解的术语解释和证明它的推理结论。基于规则的专家系统,基本概念包括:
IF 条件 Then 动作
,例如 Rule1: Human(x) => Mortal(x)
(一阶谓词逻辑,离散数学)规则推理引擎的基本部件包括:
规则推理引擎有许多实现,一般基于 RETE 算法。 入门读物
状态机引擎
有限状态自动机(Finite State Machine / FSM)是可以图形化的自动执行工具。在 unity 中,它是标准化的 agent(NPC) 动作自动控制工具。
举个例子,让我们来看一个典型的射击游戏中的人工智能守卫。它的状态可以非常简单,如巡逻(Patrol)、追逐(Chase)和射击(Shoot)。因此,定义一个状态机主要工作包括:
《雷神之锤2》里的怪物可能具有以下状态:站立、行走、跑步、躲避、攻击、空闲和搜索。有限状态机广泛地应用于游戏人工智能中,因为它们易于实现,不管对于简单还是相对复杂的游戏都游刃有余。
决策树
决策树(Decision Trees)又称为行为树(Behaviour Trees)。
本人属于代码程序优于可视化程序的支持者,并不喜欢用图编程序。如果你有兴趣,这篇博客可入门,UNITY行为树制作AI简单例子 。
更好的方案就是集成动态脚本程序,游戏逻辑一般不复杂,配合动态脚本和简单游戏设计工具,会有更灵活的编程体验。
以上仅是经典人工智能的一些方法
3、行动(Act)
行动(Act)将思考(Think)的结果作为输入,该部分的任务就是使得 agent 行为更符合物理世界的规律,使得“心想事成”这样理想的结果变得不确定。
例如:用户 或 agent 获取了目标位置,并发出“shoot(pos)”这个命令。这时的逻辑是子弹的时点、射击位置。如果你设计的 agent 立马将子弹送到指定位置,多少对手都死了!
通常需要考虑的要素包括:
Unity 导航系统允许创建给游戏角色导航的游戏世界。如下图所示,游戏角色可以在蓝色联通的网格上,找到去任意一点最短的路径,且具有一定爬坡、跳沟壑的能力。
更详细的描述,参见官方 导航系统的内部工作原理
本节的任务是熟悉上述概念及其使用。
操作 10-01 ,Agent 和 Navmesh 练习:
图中:
完成布局后
这时运行并不会自动寻路,系统会提示 "GetRemainingDistance" can only be called on an active agent that has been placed on a NavMesh.
现在需要的是制作 Navmesh 让 NavMeshAgent 工作
图中,水蓝色凸多边形构成的网格就是寻路算法的数据结构,agent 将用它来导航。
要预先生成的 Navmesh 、光照纹理贴图,都是高资源消耗的哦!
最后对 target 挂一段熟悉的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlaceTarget : MonoBehaviour {
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown (0)) {
Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast (ray, out hit)) {
Debug.Log (hit.collider.name);
if (hit.collider.name == "Plane") {
this.transform.position = hit.point;
}
}
}
}
}
运行!寻路功能完成
操作 10-02,Obstacle 和 Off Mesh Link 练习:
运行!在运行过程中,
做一个门打开、关闭的效果,如何实现?
掌握了以上概念,做一般项目一定没问题。以下博客阅读起来也会更容易。
参见师兄的实践 Navmesh使用
使用 Bake 构建的导航并不一定能满足所有游戏需求。因此有必要根据物体表面手动编辑或程序控制 navmesh。
具体参见官方手册
以下作业三选一
1、 有趣 AR 小游戏制作
2、 坦克对战游戏 AI 设计
从商店下载游戏:“Kawaii” Tank 或 其他坦克模型,构建 AI 对战坦克。具体要求
3、P&D 过河游戏智能帮助实现,程序具体要求: