Unreal Engine 5 C++ Advanced Action RPG 五章笔记

发布于:2025-02-10 ⋅ 阅读:(65) ⋅ 点赞:(0)

第五章 Enemy AI

2-Perparing Enemy For Combat(为战斗准备敌人)

  • 现在我们主要解决两件事,一件是AI控制器,一件是行为树
    在这里插入图片描述
  • AI拥有AI避障、AI感官、设置团队ID区分敌我
    在这里插入图片描述
  • 行为树要讨论的事件
    在这里插入图片描述
  • AI控制器要讨论的事件
    在这里插入图片描述
  • 在讨论AI回避之前,为了让它正常工作,我们必须获取其中的一个属性
    在这里插入图片描述
  • 为了回避功能正常,我们需要准确反应胶囊体半径,将之前调过胶囊体的大小恢复成默认,网格尺寸调整就行,调胶囊体尺寸要调整他的高与宽,不要使用缩放
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

3-Crowd Following Component(人群跟随组件) ps.这集理论避障

  • AI回避的构建方法两种
    在这里插入图片描述
  • RVO(反向速度障碍)避障的两种方法
    • 使用代理远离彼此:使用次方法会忽略障碍物和导航网格,因此当在移动的时候,AI很可能脱离导航网格边界体积,导致卡在某个位置
      在这里插入图片描述
      在这里插入图片描述
  • Detour Crowd Avoidance(绕道人群回避)
    • 该方法知道其他的代理,会生成一条新的路径来绕过彼此,而且还知道我们导航网格的大小
      在这里插入图片描述
  • 新建一个AI控制器,然后重写这个组件类,因此我们不需要使用这个新的路径跟踪组件,而是需要使用的他的子类,这意味着,我们需要重写WarriorAIController类中的此类
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 然后创建一个子蓝图添加到敌人身上
    在这里插入图片描述
    在这里插入图片描述

4-AI Perception

  • 添加感官系统
  • 头文件
    • #include “Perception/AIPerceptionComponent.h”
    • #include “Perception/AISenseConfig_Sight.h”
      在这里插入图片描述
      在这里插入图片描述
  • 委托函数的参数变量是从这里来的
    在这里插入图片描述
    在这里插入图片描述

5-Generic Team ID

  • 设置团队编号,重写IGenericTeamAgentInterface接口中的GetTeamAttitudeTowards函数,这里这个函数记得加Override
    在这里插入图片描述
    在这里插入图片描述
  • 然后在角色控制器中设置角色的团队属性,这里这个函数记得加Override
    在这里插入图片描述
    在这里插入图片描述
  • 最后在AI感官更新信息的回调函数中测试一下信息
    在这里插入图片描述
    在这里插入图片描述

6-Behavior Tree

  • 行为树,这节内容不怎么多,看看即可
    在这里插入图片描述

7-Configure AI Avoidance(配置AI避障)ps.这集需要多研究

  • 使用AI.Crowd.DebugSelectedActors 1命令可以查看避障调试绘图
  • 新建三个变量用来控制AI避障状态
    在这里插入图片描述
  • 在BeginPlay中设置,避障的参数
    在这里插入图片描述
  • 这几个参数与回避质量最相关的值,具体每个参数的作用看视频,上面这个数组对应我们代码中的那四个质量,我们使用最高质量所以调节Index[3],这里设置为0,当AI到达不了角色位置就会停下来
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

8-Behavior Tree Node Types

  • 虽然绕道回避设置很不错了,但它仍然不能神奇地解决我们在战斗中可能遇到的所有问题。
    在这里插入图片描述
  • 这节课就写了一个获取玩家距离敌人的服务蓝图任务
    在这里插入图片描述在这里插入图片描述

9-Observer Aborts(观察中止 )

  • 首先讨论两个问题,一个是是否进入扫射,一个是判断自己是否离角色远了
    在这里插入图片描述
  • None:无
  • Self:当结果为假时中止自己
  • Lower Priority:当结果为真时,中止其他优先级低的分支
  • Both:以上两点都有
    在这里插入图片描述
  • 具体看视频

10-Orient To Target Actor(瞄准目标Actor)

  • 新建一个BTService类来瞄准目标Actor
    在这里插入图片描述
  • UBTService_OrientToTargetActor.cpp
// Fill out your copyright notice in the Description page of Project Settings.


#include "AI/BTService_OrientToTargetActor.h"

UBTService_OrientToTargetActor::UBTService_OrientToTargetActor()
{
   
	// 设置蓝图中显示的服务节点名称
	NodeName = TEXT("Native Orient Rotation To Target Actor");

	// 初始化服务节点的通知标志,确保该行为树服务能够正常工作并响应事件
	INIT_SERVICE_NODE_NOTIFY_FLAGS();

	RotationInterpSpeed = 5.f;//设置旋转插值速度,默认为5.0f。这个值控制角色朝向目标时的旋转速率
	Interval = 0.f;//这是父类中的变量,定义服务的后续节拍之间的时间跨度
	RandomDeviation = 0.f;//这是父类中的变量,为服务的间隔添加随机范围

	// 添加对象过滤器,确保InTargetActorKey只能选择AActor类型的对象
	InTargetActorKey.AddObjectFilter(this, GET_MEMBER_NAME_CHECKED(ThisClass, InTargetActorKey), 
		AActor::StaticClass());
}

void UBTService_OrientToTargetActor::InitializeFromAsset(UBehaviorTree& Asset)
{
   
	Super::InitializeFromAsset(Asset);

	// 获取行为树关联的黑板资产
	if (UBlackboardData* BBAsset = GetBlackboardAsset())
	{
   
		// 解析所选黑板键࿰