本教程涵盖:解释状态机基础知识、菜单导航、随机行走等简单示例、时间规划、全局变量与实体变量、区域帧、战斗行为、函数。 简介 实体的“大脑”是设计师设置逻辑和控制AI的地方。要访问它,需先选择实体,打开“编辑对象”窗口,然后点击“编辑大脑”按钮。进入大脑界面后,我们先来了解一些基本导航操作。在大脑界面的空白区域点击并拖动鼠标,即可移动大脑内的摄像机位置,可使用左键、右键或中键进行操作。使用鼠标滚轮可放大或缩小视图。如果你在大脑中迷路了,可以使用屏幕底部的【重新定位】按钮回到大脑内的起始位置。让我们先简要了解一下大脑的工作原理。

1. 实体初始化并从每日日程开始运行。 2. 每日日程的输出会导向一个状态的输入。 3. 该状态将执行指令。 4. 事件会触发大脑切换至新状态。 在大多数情况下,AI逻辑会循环运行,随后游戏事件会触发循环中断。通常,事件逻辑完成后,实体要么返回旧的逻辑循环,要么开始运行新的循环。 每日日程 大脑中首先需要注意的部分是【每日日程】。这是大脑逻辑的起始点(若未指定起始状态)。每个小时都有对应的输出,该输出会根据实体初始化时的时间或大脑逻辑进入此状态时的时间触发。日常日程表中的【死亡时】部分几乎适用于所有实体。当一个实体死亡时,其“大脑”会被引导至【死亡时】的输出结果。对于非常重要的NPC,你可能需要在此处关联任务相关逻辑。一旦逻辑运行到【死亡时】输出的末尾,该实体将不再执行命令,也不会占用CPU资源。 【等级变更】部分会在游戏检测到玩家加载进入此AI所在的新等级时,运行与此输出相关联的逻辑。这主要用于跟随玩家的AI同伴。

状态 状态是设计AI逻辑时你会接触到的第二个(也是最常见的)关键元素。首先,你需要理解状态工作原理背后的基本理论。

1. 大脑的逻辑会进入状态的输入环节。 2. 状态会循环运行指令或动作,直至某个事件被触发。 3. 事件被触发(结果为真或假)后,大脑的逻辑会转向其他地方。

如果“起始状态”设置已开启,此状态将作为大脑逻辑初始化时的起点。只能有一个状态被设为起始状态。若未标记任何起始状态,大脑逻辑将从每日日程开始运行。 在继续设置AI逻辑之前,你需要了解一个状态内的所有元素。

1. 状态名称。你可以更改此名称以方便组织。点击名称旁边的条栏可以移动该状态。 2. 状态将要运行的操作或指令。 3. 状态内的事件,每个状态可以包含多个事件。 4. 事件的真假输出结果。 5. 状态的输入内容。 6. 添加新事件的功能。 7. 删除事件的功能,你必须先点击按钮,然后选择要删除的事件。 8. 重新排列事件顺序的功能。 9. 完全删除该状态的功能。 操作 大多数操作和要求根据其名称即可明白含义。通常,一个操作或要求会有与其对应的额外设置。一个状态执行多个动作是很常见的,因此你可以轻松地将它们添加到一个自上而下的列表中。点击状态的动作部分即可打开【编辑动作】窗口。你可以使用【上移】和【下移】按钮重新排列顺序。【无】按钮会清空动作列表。你还可以通过复制和粘贴图标一次性复制并粘贴整个动作列表。

要求:你可以编辑事件,并且通过点击某个状态的事件区域来打开【需求创建器】。如果未将真或假输出连接到另一个状态,那么当前状态将不会考虑该输出,并会继续执行该状态的操作。

默认情况下,一个事件仅使用一项条件来触发真或假的输出。不过,你可以将条件设置为【任意】或【全部】条件,这会为你提供4个额外条件的插槽。若插槽为空,则【任意/全部】条件在返回真或假输出时不会将其纳入考量。 如果是【任意】条件,只要4个嵌套条件中有任意一个返回真,【任意】条件就会返回真。若4个嵌套条件均未返回真,则【任意】条件返回假。 如果是【全部】条件,只有当4个嵌套条件全部返回真时,【全部】条件才会返回真。如果4个嵌套条件中有1个返回false,那么“全部”条件将返回false。 如果某个事件需要考虑4个以上的条件,你可以在彼此内部嵌套多个“任意/全部”条件。“无”按钮会清除所有条件,并将事件重置为使用“始终”条件。

请记住,状态的事件会在每一帧按从上到下的顺序进行检查。因此,如果两个事件在同一帧触发,列表中位置最靠上的事件将被用作输出。如果你正在使用带有【始终】条件的事件,要确保它位于列表的最后。将鼠标悬停在事件上时,会同时高亮显示事件内的文本以及与其相连的输出线路。

简单的大脑示例 本教程不会涵盖每一个操作和要求,因为这会花费太多时间。我们建议通过查看基础游戏中已存在实体的大脑来学习示例。不过,我们将创建一个非常简单的大脑,并逐步对其进行解析。

1. 初始化:大脑功能的启动阶段。建议让实体在静止时保持站立状态,以避免动画问题。【设置随机路径参数】动作用于告知实体后续随机移动所需的必要信息。该动作将【当前位置】设为随机移动的原点,最小和最大有效距离将从此处开始计算。 2. 设置路径:在此阶段告知实体将要沿行的路径类型。 3. 移动:实体在此阶段每帧进行移动,直至【路径终点随机】事件返回true,即到达路径终点。【沿路径移动】动作本身不附带任何信息。它会查看之前的【设置路径】动作来确定移动路径的类型,并通过【设置路径参数】动作获取沿该类型路径移动时所需的具体信息和参数。 4. 【设置计时器】:此状态会设置一个计时器,该计时器将在下一个状态中用作事件。 5. 【等待】:实体将保持站立状态,直到上一个状态设置的计时器结束。 6. 【跳转】:跳转动作会将逻辑流程直接传送至指定的状态。这一功能可避免因状态间连线过多而导致逻辑流程显得混乱。在这种情况下,它会形成一个从【设置路径】状态到【跳转】状态的循环。它不会回到“初始化”状态,因为一旦随机路径设置完成,除非你想要更改某些内容,否则无需再次设置。此外,在循环中更新“当前位置”的随机路径起点会导致实体以不可预测的方式移动。 变量 我们之前讨论的AI行为是一个无限循环。对于非常简单的AI来说这没问题,但更复杂的AI需要能够根据世界中的各种条件来决定执行何种行为。实现这一点的最佳方式是使用变量。游戏中支持以下类型的变量: 布尔值(Bool)—— 简单的真/假或开/关。常见用途是跟踪某件事是否应该发生。例如,一个布尔值可以命名为“世界是否终结”,如果它返回true,那么我们就可以让城镇的居民做出非常特定的行为。当游戏中出现特定情况(如任务完成)时,我们会将该变量设为true。 整数 - 像“1”或“20”这样的整数。常见用途是记录任务中特定类型敌人的击杀数量。例如,如果你想追踪每一只被杀死的老鼠,我们会在与死亡实体的“日常安排”相关联的“死亡时”逻辑中,将整数变量“已杀死老鼠数量”加1。 浮点数 - 支持小数的数字。使用方式与整数非常相似,但支持小数。 字符串 - 自定义文本。你可以设置一个名为【星期几】的字符串变量,并在游戏中每24小时更改一次。然后,城镇居民可以根据该变量输出的文本(即日期)执行不同的行为。 变量分为3类,类别表明变量在游戏中的创建位置或存在位置。 全局变量:存在于游戏读取的独立数据库中。你需要限制这类变量的数量。如果从逻辑上看使用其他类别的变量更合理,就应该这样做。前面提到的【星期几】字符串就是全局变量的一个好例子。 实体变量:附加到特定实体上。这些变量对于管理特定NPC的行为非常有用。例如,我们可以使用一个名为【沮丧】的布尔值,并根据【沮丧】是否为真来改变实体的标准行为。这个变量可能默认是开启的,但当你为该实体完成某个任务后就会关闭,这样你就能通过行为的变化看到自己决策带来的影响。 任务变量——附加在任务数据库中的特定任务上。之前提到的整数变量【杀鼠数量】就是任务变量的一个很好的例子。 既然现在你已经理解了在游戏中使用变量的原理,接下来我们将介绍如何创建变量并将其与我们的AI结合使用。让我们从创建实体变量开始。选择实体,打开【编辑对象】窗口,然后选择【编辑变量】按钮。

我们将创建一个布尔值,命名为“DontMove”,并将其设置为true。基本思路是,AI会识别到这个变量为true,然后决定原地站立,而不是随机四处走动。现在让我们看看如何在AI逻辑中实现这一点。

1. 存在一个额外事件,它会通过【检查变量】条件来判断该变量是否为真。注意,此事件位于【始终】选项之上,因此具有优先级。 2. 该事件会转向新的AI逻辑。这显然是一个过度简化的示例,通常变量引导AI执行的逻辑要复杂得多。 本教程暂不涉及任务变量,相关内容将在【任务设置】教程中讲解。目前,全局变量是你需要学习的最后一种变量类型。若要创建全局变量,需导航至【游戏玩法】选项卡,然后选择【编辑变量】按钮。


我们将创建一个全局布尔值,命名为“WorldHasEnded”,然后将其设置为true。基本思路是,AI会检测到此变量为true,然后自行停用,而不是随机四处走动。现在让我们看看如何在AI逻辑中实现这一点。

1. 新增了一个检查全局变量的事件。在这种情况下,与【WorldHasEnded】相关的行为可能比【DontMove】行为更重要,因此我们将其排在列表顶部。这样,如果两个变量碰巧都为真,将执行优先级最高的行为。 2. 这是一个使用【Set active】动作的简单状态。注意它的命名方式,以便保持内容清晰有条理。 区域框架 我们给出的示例与你在战役中需要设置的智能逻辑相比过于简化。随着情况变得更加复杂,你需要将逻辑部分组合在一起,并能够区分它们。我们创建了区域框架来解决这个问题。区域框架是一个可自定义名称的窗口,能够容纳状态并将它们一次性整体移动。你可以为区域框架添加颜色编码,使其更易于整理。区域框架的大小可以根据你的需求调整,也可以将其与内部所有内容一起折叠,以释放视觉空间。区域框架元素如下。

1. 区域框架的自定义名称。 2. 用于扩大或缩小区域框架尺寸的边角。 3. 折叠整个区域框架的功能。 4. 可一次性移动整个区域框架及其所有内容的移动条。 5. 为区域框架选择颜色的功能。 6. 删除区域框架及其所有内容的功能。 7. 保存区域框架以便之后导入到另一个脑图的功能。 8. 更新区域框架内容以匹配最近保存版本的功能。此功能可用于恢复更改或更新使用同一区域框架的多个脑图。 建议先将区域框架调至非常细的状态,然后移动到你想要覆盖的区域上方,再向下拖动以覆盖所需区域。


这个示例能让你了解区域框架如何帮助你保持大脑条理清晰。

本教程旨在介绍状态机和视频游戏AI。建议你在尝试制作自己的AI之前,先完成“实体与程序对话”“巡逻路径、兴趣点和区域触发器”“通用AI(UAI)大脑”“通用AI(UAI)对话”以及“任务设置”教程。 战斗行为 在深入了解实体大脑和AI逻辑之前,你需要先理解战斗行为。战斗行为是实体在战斗中可能做出的一系列决策列表。每个决策都可能有特定的关联要求,只有满足这些要求,该决策才会成为实体的可行选择。每个决策都可以设定最低和最高优先级,当满足触发条件时,优先级会作为该决策触发的百分比概率。

战斗行为可在【游戏玩法】标签页内创建。我们已制作了99%情况下所需的全部战斗行为。只有当你希望某个实体在任务中以非常特定的方式战斗时,才需要自行创建。我们还提供了每种战斗行为(供类人生物使用)的难度变体。

若要使实体参与战斗,必须在其智能模块中使用【设置战斗行为】指令。通常我们会在初始状态下为其分配该指令,但也存在根据任务情况更改战斗行为的可能。

功能 在创建大脑逻辑时,你会发现自己倾向于反复使用特定的状态序列。这类序列可能有多个,而且它们越复杂,你就越难组织和跟踪大脑逻辑的流程。 功能允许你将其中一个序列浓缩为一个状态,然后通过一个动作多次调用该逻辑。首先,我们将在创建功能之前,对下面的示例进行分解。

1. 我们设定了战斗行为,使实体能够发起攻击。 2. 实体会站立等待,直至侦测到敌人。 3. 我们设定了战斗目标,让实体明确攻击对象。 4. 我们会吸引区域内的所有盟友,使其能协助战斗。 5. 实体开始战斗,当目标死亡或长时间失去战斗目标时,将回到行为逻辑的初始状态。

要创建函数,我们必须从【游戏玩法】选项卡中使用【编辑大脑】按钮。此菜单用于保存区域框架。函数必须在区域框架内创建,因此需先保存区域框架,之后它才能作为函数存在。使用此窗口底部的【函数】复选框,将逻辑转换为函数。为使函数正常工作,必须指定一个起始状态,并添加一个带有【从函数返回】动作的结束状态。若没有该动作,逻辑将永远无法离开函数并返回至原始大脑。

既然该函数已创建完成,我们可以从原始逻辑中移除相关内容,并将其替换为一个带有【调用函数】操作的状态。

除非你需要一些特殊逻辑,否则我们建议你使用我们已创建的函数。这些函数能够处理多种情况,例如犯罪行为、任务中断、失聪或失明等。以下是一些示例:攻击最后发现的敌人

实体跟随

这些功能是我们【通用人工智能】系统的一部分。在完成【通用人工智能(UAI)核心】教程之前,你将无法正常使用它们。




换一换 






















