斯坦福UE4 C++课学习补充23:AI自定义任务

一、自定义任务节点

  1. 本节需要创建自定义任务节点BTTask,实现小兵进入角色范围后进射击的功能。
  2. 对于BTTaskNode的子类,我们需要在代码中重写ExecuteTask函数即可。返回值为EBTNodeResult::FailedEBTNodeResult::Successd,对应行为树的节点返回失败或者成功。
//SBTTask_RangeAttack.h
UCLASS()
class FPSPROJECT_API USBTTask_RangeAttack : public UBTTaskNode
{
   GENERATED_BODY()
protected:
   virtual EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) override;
   
   //用于角色发射投掷物攻击
   UPROPERTY(EditAnywhere, Category = "AI")
   TSubclassOf<AActor> ProjectileClass;
};


//SBTTask_RangeAttack.cpp
EBTNodeResult::Type USBTTask_RangeAttack::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
{
	AAIController* MyController = OwnerComp.GetAIOwner();
	if(ensure(MyController))
	{
		ACharacter* MyPawn = Cast<ACharacter>(MyController->GetPawn());
		if(MyPawn == nullptr)
		{
			return EBTNodeResult::Failed;
		}

		AActor* TargetActor = Cast<AActor>(OwnerComp.GetBlackboardComponent()->GetValueAsObject("TargetActor"));
		if(TargetActor == nullptr)
		{
			return EBTNodeResult::Failed;
		}

		FVector MuzzleLocation = MyPawn->GetMesh()->GetSocketLocation("Muzzle_01");
		//方向向量=目标位置-当前位置
		FVector Direction = TargetActor->GetActorLocation() - MuzzleLocation;
		FRotator MuzzleRotation = Direction.Rotation();

		FActorSpawnParameters params;
		params.Instigator = MyPawn;
		params.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;

		ensure(ProjectileClass);
		AActor* NewProj = GetWorld()->SpawnActor<AActor>(ProjectileClass, MuzzleLocation, MuzzleRotation);
		return NewProj ? EBTNodeResult::Succeeded : EBTNodeResult::Failed;
	}

	return EBTNodeResult::Failed;
}

二、优化

1. 子弹发射冷却

Cooldown节点会控制节点执行的间隔,当节点处于冷却时间时,会直接返回false,以下节点自然都不会执行。Loop节点则会循环执行以下节点。

此时AI的逻辑:如果目标在攻击范围外,会向目标移动。进入攻击范围后,开枪向角色以0.5s为间隔时间射击三次,冷却2s。在此期间,行为树会运行后面两个节点,再重新判断是否结束冷却。

2. 攻击时面朝玩家

行为树自带了一个修改AI小兵的朝向服务BTServiceSet defalt focus,从而不需要再使用SetActorRotation函数

  • 最终的完整图(包括之后的EQS):
    在这里插入图片描述
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值