TopDown Engine中文文档 (十二AI)

十一.先进的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连接在一起的地方。

Jekyll

所有这些都将被放在一个已经设置的角色之上,并有可能利用所有现有的能力。 

3.创建一个先进的AI角色

 我们将重新创建KoalaDungeon场景中可用的一个示例角色,NinjaSwordMaster。创建基本角色和创建任何角色都没有什么不同。一旦这个基本角色准备好了,你将想要向它添加一个AIBrain。

 我们想要从这个角色中得到以下行为:在敌人足够接近之前什么都不做,如果是这样的话,如果离它足够接近就进行攻击。然后,如果目标超出了范围,回到什么都不做,等待一个目标。

为了达到这一点,我们将使用引擎中一些现成的actions和decisions。我们将添加以下组件:AIDecisionDetectTargetRadius2D,AIDecisionTargetIsAlive,AIActionDoNothing,AIActionMoveTowardsTarget2D,AIActionShoot2D,AIDecisionDistanceToTarget。每一个都有一个面板,我们需要设置一些东西:

Jekyll

 我们的角色现在有了我们定义其行为所需要的所有actions和decisions。剩下要做的就是把这些都插入它的大脑。如前所述,我们的角色将有两种状态:巡逻和攻击。所以在它的AIBrain组件中,我们只需按右下角的“+”符号三次就可以添加三个状态。我们将把第一个状态命名为““Detecting”,第二个状态命名为““Moving”,第三个状态命名为““Attacking”。

Jekyll

现在在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放在假状态中。

Jekyll

为了确保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。如果你不做,它会自动在自己的子物体寻找一个。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值