文章目录
一、引入感知组件并绑定委托
PawnSensingComponent
是UE中用于感知其他 Pawn
(或 Actor)存在的一个组件,常用于 AI 角色的视觉、听觉等感知功能 。它为 AI 提供了基础的感知能力,允许它们在游戏中做出智能反应,如检测玩家位置、追踪目标等。
- 功能:视觉感知、听觉感知、视锥角度
- 主要属性 :
① SightRadius
(视觉半径):控制 Pawn 能看到的最大距离。
② SensingInterval
(感知间隔):设置每次感知的时间间隔,减少感知的频率来优化性能。
③ HearingThreshold
(听觉阈值):AI 需要检测的最低噪音水平。
④ PeripheralVisionAngle
:定义视觉的视野角度。
cpp
复制代码
//SAICharacter.h
void SetTargetActor(AActor* NewTarget);
UPROPERTY(VisibleAnywhere, Category = "Components")
UPawnSensingComponent* PawnSensingComp;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")
USAttributeComponent* AttributeComp;
UFUNCTION()
void OnPawnSeen(APawn* Pawn);
cpp
复制代码
//SAICharacter.cpp
PawnSensingComp = CreateDefaultSubobject<UPawnSensingComponent>("PawnSensingComp");
void ASAICharacter::OnPawnSeen(APawn* Pawn)
{
SetTargetActor(Pawn);
//DrawDebugString(GetWorld(), GetActorLocation(), "PLAYER SPOTTED", nullptr, FColor::White, 4.0f, true);
}
void ASAICharacter::SetTargetActor(AActor* NewTarget)
{
AAIController* AIC = Cast<AAIController>(GetController());
if (AIC)
{
AIC->GetBlackboardComponent()->SetValueAsObject("TargetActor", NewTarget);
}
}
- 委托绑定初始化
cpp
复制代码
void ASAICharacter::PostInitializeComponents()
{
Super::PostInitializeComponents();
PawnSensingComp->OnSeePawn.AddDynamic(this, &ASAICharacter::OnPawnSeen);
AttributeComp->OnHealthChanged.AddDynamic(this, &ASAICharacter::OnHealthChanged);
}
二、优化角色旋转
- 在观察AI角色移动时,我们注意到AI角色在转向时是一下就转到就看到的角色方向,非常突兀。为了优化,可以在
MovementComponent
组件里勾选使用控制器所需的旋转 。该选项将使角色按照旋转速率平滑地旋转到目标角度。
- 想使上述选项生效,还需取消勾选自身细节面板里的使用控制器旋转Yaw ,这样AI控制器不再强制设置角色当前的
Yaw
,实现Movement
组件完全控制角色的旋转。*