TopDown Engine中文文档 (十二AI)
十一.先进的AI1.介绍TopDown引擎提供了一个先进的AI系统,它将帮助您创建各种有趣的模式和属性。简要概述您可以用它做什么,您可以查看MinimalAI演示场景,它将展示您可以用这个系统创建的一小部分东西。2.核心内容先进的AI系统是基于您可以在MMTools/AI/文件夹中找到的几个核心类:1.AIState:状态是一个或多个actions和一个或多个transitions的组合。一个st
十一.先进的AI
1.介绍
TopDown引擎提供了一个先进的AI系统,它将帮助您创建各种有趣的模式和属性。简要概述您可以用它做什么,您可以查看MinimalAI演示场景,它将展示您可以用这个系统创建的一小部分东西。
2.核心内容
先进的AI系统是基于您可以在MMTools/AI/文件夹中找到的几个核心类:
1.AIState : 状态是一个或多个actions和一个或多个transitions的组合。一个state的例子是“巡逻直到敌人到达射程”。
2.AIAction :actions是一种行为,并描述你的角色在做什么。例如巡逻、射击、跳跃等。该引擎带有很多预定义的操作,并且很容易创建你自己的操作。
3.AIDecision : Decisions是将通过转换、每一帧进行评估的组件,并将返回真或假。示例包括在状态中花费的时间、到目标的距离或区域内的对象检测。
4.AITransition : Transitions是一个或多个decisions和目标状态的组合,无论这些转换是真的还是假的。transition的一个例子可能是“如果敌人进入射程,过渡到射击状态”。
5.AIBrain : AI大脑根据定义的transitions负责从一种state走到另一种state。它基本上只是一个states的集合,它是你将所有的actions、decisions、states和transitions连接在一起的地方。
所有这些都将被放在一个已经设置的角色之上,并有可能利用所有现有的能力。
3.创建一个先进的AI角色
我们将重新创建KoalaDungeon场景中可用的一个示例角色,NinjaSwordMaster。创建基本角色和创建任何角色都没有什么不同。一旦这个基本角色准备好了,你将想要向它添加一个AIBrain。
我们想要从这个角色中得到以下行为:在敌人足够接近之前什么都不做,如果是这样的话,如果离它足够接近就进行攻击。然后,如果目标超出了范围,回到什么都不做,等待一个目标。
为了达到这一点,我们将使用引擎中一些现成的actions和decisions。我们将添加以下组件:AIDecisionDetectTargetRadius2D,AIDecisionTargetIsAlive,AIActionDoNothing,AIActionMoveTowardsTarget2D,AIActionShoot2D,AIDecisionDistanceToTarget。每一个都有一个面板,我们需要设置一些东西:
我们的角色现在有了我们定义其行为所需要的所有actions和decisions。剩下要做的就是把这些都插入它的大脑。如前所述,我们的角色将有两种状态:巡逻和攻击。所以在它的AIBrain组件中,我们只需按右下角的“+”符号三次就可以添加三个状态。我们将把第一个状态命名为““Detecting”,第二个状态命名为““Moving”,第三个状态命名为““Attacking”。
现在在Detecting状态下,我们将只有一个action和一个transition,所以我们将通过按下它们各自的“+”符号一次来添加一个Action和一个Decision。现在我们将把角色的目标组件拖到动作的数组槽,并将AIDecisionDetectTargetRadius2D拖到转换的第一个Transitions槽。我们想在玩家在范围内切换到移动,所以我们将把“Moving”在我们的过渡的True状态字段。
我们将以同样的方式继续我们的第二个state:我们将添加一个action,这次,三个过渡,然后拖动AIActionMoveTowardsTarget2D组件到Moving的槽,然后拖动AIDecisionDetectTargetRadius2D第一个transition的槽,AIDecisionTargetIsAlive到第二个transition的槽,最后AIDecisionDistanceToTarget在第三个transition的槽。当目标不再在范围内时,我们想回到检测,所以我们将把Detecting在第一个过渡的假状态,我们也想回到Detecting当目标死亡时,所以我们将把Detecting放在第二个过渡的假状态。如果到目标的距离足够近,我们想要攻击,所以我们将把Attacking放在第三过渡的真状态。
在我们最后的状态Attacking,我们将添加一个action和一个transition。然后我们想在Action中拖动AIActionShoot2D,以及AIDecisionDistanceToTarget到transition的槽中。如果这个距离太远,我们想回到Detecting,所以我们将把Detecting放在假状态中。
为了确保AIbrain是正确的,我们可以“阅读”它。从上到下,我们有一个角色什么都不做,同时等待目标到达它的半径内。然后它开始移动,除非目标已经死亡或太远/看不见。然而,如果目标足够近,它就会发动攻击,并返回到检测目标是否到达足够远。
你已经完成了什么可能是与TopDown引擎“最难”做的事情,现在你知道如何创建各种角色行为了。当然,您可以在一个状态下有多个动作(例如跑步和跳跃),在一个状态下有多个过渡,所以您可以真正想出复杂的东西。
4.Actions
该引擎带有所有这些预定义的操作,可以在您自己的角色中使用:
1.AIActionAimObject : 将让您对象的轴(通常是右或向前)指向角色的运动方向或目标方向。
2.AIActionAimWeaponAtMovement : 将迫使武器瞄准运动的方向。
3.AIActionChangeWeapon : 强迫你的角色切换到另一种武器。只要把一个武器预制体拖进它的NewWeapon槽就好了。
4.AIActionCrouchStart : 让你的角色蹲下
5.AIActionCrouchStop :让你的角色停止蹲伏
6.AIActionDoNothing :顾名思义,他什么也不做。在那里等着。
7.AIActionMMFeedbacks : 可以让您播放您绑定到其面板中的任何MMFeedbacks
8.AIActionFaceTowardsTarget2D : 这个AI动作可以让你改变CharacterOrientation2D面向的方向,Koala场景中的一个例子有使用到。
9.AIActionMoveAwayFromTarget2D/3D :使角色向与目标相反的方向移动
10.AIActionMovePatrol2D/3D : 将让角色通过MMPath组件中定义的一组节点进行巡逻。确保您将MMPath的cycle option设置为Loop或BackAndForth(您不能在OnlyOnce模式下沿着路径巡逻,它必须是连续的)。
11.AIActionInvertPatrolDirection : 让您反转目标2D或3D巡逻的方向
12.AIActionMoveRandomly2D/3D :使角色随机移动,直到在路径中发现障碍,在这种情况下它会随机选择一个新方向
13.AIActionMoveRandomlyGrid :在网格上随机移动,无论是2D还是3D网格
14.AIActionMoveTowardsTarget2D/3D :指示CharacterHorizontalMovement 的能力,以向目标的方向移动。
15.AIActionPathfinderToPatrol3D :将使用Pathfinding3D 能力移动到其最后一个巡逻点
16.AIActionPathfinderToTarget3D :如果能找到一条路径,将使用Pathfinding3D 能力移动到目标
17.AIActionReload : 导致代理重装其当前的武器
18.AIActionRotateConeOfVision2D :将该AI的ConofVision2D转向AI的移动或武器瞄准方向
19.AIActionRotateTowardsTarget2D/3D :使CharacterOrientation3D 能力将角色旋转到大脑的目标上
20.AIActionRunStart : 将导致代理开始跑步(需要一个CharacterRun 能力)
21.AIActionRunStop : 将导致代理停止跑步(需要一个CharacterRun 能力)
22.AIActionSetLastKnownPositionAsTarget :将将目标的最后已知位置设置为新目标
23.AIActionShoot2D/3D : 使用目前装备的武器进行射击。如果你的武器处于自动模式,将射击到你退出这个状态,并且只会在半自动模式下射击一次。您可以选择将角色面(左/右)作为目标,并瞄准它(如果武器具有WeaponAim组件),或者选择各种原点来定义如何计算目标方向。
24.AIActionSwapBrain :让你从一个角色当前的大脑变成另一个大脑。例如,对于boss阶段很有用
25.AIActionUnityEvents :允许您触发绑定到其面板中的任何Unity事件
就像引擎中的其他东西一样,你也被鼓励创建自己的AI。让我们看看一个Action的代码,看看它是如何工作的:
public class AIActionJump : AIAction
{
public int NumberOfJumps = 1;
protected CharacterJump _characterJump;
protected int _numberOfJumps = 0;
protected override void Initialization()
{
_characterJump = this.gameObject.GetComponent<CharacterJump>();
}
public override void PerformAction()
{
Jump();
}
protected virtual void Jump()
{
if (_numberOfJumps < NumberOfJumps)
{
_characterJump.JumpStart();
_numberOfJumps++;
}
}
public override void OnEnterState()
{
base.OnEnterState();
_numberOfJumps = 0;
}
}
如您所看到的,这个类重载了一些方法:
1.Initialization:我们将做任何我们需要做的事情来初始化我们的操作,在这种情况下,我们存储了CharacterJump功能,以备将来使用。
2.PerformAction : 每次我们的角色处于这个动作所处的状态时,它都会被调用。在这种情况下,我们只需调用我们的Jump方法,如果满足我们的条件,它将依次调用CharacterJump的JumpStart方法。
3.OnEnterState : 每次我们返回此操作的状态时,我们都希望重置当前的jumps次数。
5.Decisions
1.AIDecisionDetectTargetConeOfVision2D/3D : 使用一个视场来确定一个目标是否在视图中。如果是这样,则返回true。
2.AIDecisionDetectTargetLine2D : 如果其TargetLayer上的任何对象进入其视线,将返回true。它还将设置大脑的目标为该目标。您可以选择让它处于射线模式,在这种情况下,它的视线将是一条实际的线(射线),或者让它更宽。您还可以为射线的原点指定一个偏移量,以及一个将阻挡它的障碍layer。
3.AIDecisionDetectTargetLine3D :允许您在3D中使用射线型或box型检测目标
4.AIDecisionTargetRadius2D/3D : 如果其TargetLayer上的对象在其指定的半径内,将返回true,否则返回false。它还将设置大脑的目标为该目标。
5.AIDecisionDistanceToTarget :如果当前大脑的目标在指定的范围内,将返回true,否则返回false。
6.AIDecisionGrounded : 如果角色在地面,将返回true,否则false。
7.AIDecisionHealth :如果满足指定的健康状况条件,将返回true。您可以使它低于指定值、、等于、高于指定值。
8.AIDecisionHit : 如果角色被命中此帧,或者在达到指定的命中数之后,则返回true。
9.AIDecisionLineOfSightToTarget2D/3D :如果从指定的偏移中追踪到目标,并且没有击中指定的层,则将返回true
10.AIDecisionNextFrame :当进入此决定开启的状态时,将返回真。
11.AIDecisionRandom : 如果结果低于或等于其面板中指定值,将掷骰子并返回true
12.AIDecisionReloadNeeded : 如果需要在其评估的帧上重新加载,则返回true
13.AIDecisionTargetFacingAI2D : 如果大脑的当前的目标面对这个角色,将返回真。
14.AIDecisionTargetIsAlive : 如果目标还活着,将返回true
15.AIDecisionTargetIsNull : 如果目标为空,将返回true
16.AIDecisionTimeInState : 将在指定的持续时间(以秒)通过后返回true,因为大脑已经处于这个决定的状态。
17.AIDecisionTimeSinceStart : 在加载关卡后指定的持续时间(以秒为单位)后将返回true。
就像actions一样,创建你自己的Decisions也很容易。
6.组织AI组件
当构建复杂的角色时,角色的组件面板可以在代理的核心类(Character, TopDownController,等)、能力、大脑、动作和决策之间获得相当繁杂。我们可以将这些能力分成多个节点的能力,这对大脑、行动和决策也是如此。
您可以在Loft3D演示场景中看到一个角色设置的示例,使用PatrolSeekAndDestroyAI预制体。在它的顶层,你会找到它的核心类。然后,在嵌套在它下面的空游戏对象上,你会发现一个具有其能力(能力)和一个具有其大脑的节点(AIBrain)。为了进一步推动事情,如果需要,操作和决策也可以跨越更多的节点进行分割。关于这个设置,唯一重要的事情是确保你已经绑定了你的大脑到Character的面板,在它的CharacterBrain。如果你不做,它会自动在自己的子物体寻找一个。
更多推荐
所有评论(0)