UE4的PawnSensingComponent人形感应组件

人形感应组件通常是使用在AI角色上的,开始前我们先提前创建一个守卫的角色,为其添加视觉感应和听觉感应
注意:本文基于UE4C++第一人称模板,但组件使用方法都是通用的,不影响学习

1.添加人形感应组件

头文件

//Header

class UPawnSensingComponent;
//Create PawnSensingComponent
UPROPERTY(VisibleAnywhere,Category = "Components")
UPawnSensingComponent* PawnSensingComp;

C++

//Init
PawnSensingComp = CreateDefaultSubobject<UPawnSensingComponent>(TEXT("PawnSensingComp"));
//Init PawnSensingComp's method
PawnSensingComp->OnSeePawn.AddDynamic(this, &AFPSAIGuard::OnPawnSeen);
PawnSensingComp->OnHearNoise.AddDynamic(this, &AFPSAIGuard::OnNoiseHeard);

2.视觉感应

通过PawnSensingComp组件,我们可以重写其视觉感应函数,在析构函数中绑定了OnPawnSeen函数,我们下面就将其内容进行实现

头文件

UFUNCTION()
void OnPawnSeen(APawn* SeenPawn);

C++

实现部分,为了可视化视觉感应到玩家角色,加入了绘制球体的函数,当AI看到玩家角色的时候触发OnPawnSeen函数,该函数会在看见玩家的位置绘制一个球体

// When the Guard see the pawn do
void AFPSAIGuard::OnPawnSeen(APawn* SeenPawn)
{
	UE_LOG(LogTemp, Warning, TEXT("see pawn ok"));

	//If found nothing
	if (SeenPawn == nullptr) {
		return;
	}
	//Draw Sphere when guard see the pawn
	DrawDebugSphere(GetWorld(), SeenPawn->GetActorLocation(), 32.f, 12, FColor::Red,false, 10.f);

}

参数设置

当为角色添加了感应组件后,我们通过继承C++Ai,来创建一个蓝图角色,可以在其参数面板设置视觉范围的大小和距离,听觉感应也相同

image-20201202170003368

效果展示

每间隔一段时间,感应到角色后就会将角色的位置画上一个小红球,当然这只是一个可视化来证明功能的有效性。

image-20201202170054922

3.听觉感应

听觉感应其实可以说是噪声感应,通过产生专用感应用的声音组件来实现AI对声音的感应,这部分尝试设置不同位置上的声音,一个玩家角色发出的声音,一个是子弹击中的声音

头文件

这里的自定义函数的参数需要我们去OnSeenPawn功能去查找源码

image-20201202170713463

UFUNCTION()
void OnNoiseHeard(APawn* NoiseInstigator, const FVector& Location, float Volume);

C++

该部分实现的主要是当听到噪声源时,触发在噪声源处画上一个绿色的球,但是这时候我们发现并没有噪声源,该函数只管接受噪声,需要在玩家角色中去创建一个噪声发生器

void AFPSAIGuard::OnNoiseHeard(APawn* NoiseInstigator, const FVector& Location, float Volume)
{
	//Draw Sphere when guard hear the pawn
	// Location is the NoiseInstigator Location
	DrawDebugSphere(GetWorld(), Location, 32.f, 12, FColor::Green,false, 10.f);

}

为玩家角色创建噪声

打开Character的头文件,我们需要创建一个噪声发射器组件PawnNoiseEmitterComponent,这样才能产生噪声的函数才会有效(为什么ue4不集成在一起,或许有更高级的用法吧)

头文件

class UPawnNoiseEmitterComponent;

protected:
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "AI")
    UPawnNoiseEmitterComponent* NoiseEmitterComponent;

CPP

在玩家角色的C++初始化NoiseEmitterComponent组件,然后我们在玩家角色的蓝图中创建噪声,当然也可以通过C++创建

//AFPSCharacter::AFPSCharacter()
// Create a PawnNoiseComponent to character
NoiseEmitterComponent = CreateDefaultSubobject<UPawnNoiseEmitterComponent>(TEXT("NoiseEmitter"));

蓝图

其中Loundness参数是音量,最大为1;Noise Location默认为actor的位置;noise maker值的是噪声源,这里也就是角色本身

image-20201202173222868

效果展示

在听觉范围内,角色路过AI后会产生绿色的球体,说明AI感应到了玩家发出的噪声

image-20201202173456881

为子弹创建噪声

记得在玩《孤岛惊魂》时,可以通过丢一些石头来吸引敌人的注意力,从而实现潜行。这里我尝试为子弹击中时添加噪声,这样同样可以实现吸引敌人的注意力。

首先可以在第一人称模板的子弹Projectile中的击中函数中添加一个发生噪声的函数,这样子弹击中时就可以发出噪声吸引AI的注意力

子弹Onhit函数中(Projectile.cpp)

MakeNoise这里第二参数是pawnInstigator,这个pawnInstigator指的是谁控制这个噪声的产生,那当然是玩家角色啦(也可以设置为其他AI角色),pawnInstigator是一个pawn类型,pawnInstigator必须具有NoiseEmitterComponent,那么这个makenoise才会生效,因此这个Instigator需要进行指定为玩家角色

如果MakeNoise不填写Instigator则为actor自身的Instigator,这里我们将子弹actor的Instigator设置成玩家角色即可

//use the the actor's Instigator if pawnInstigator is None
MakeNoise(1.0f);
Destroy();

在FPS模板中子弹的参数在玩家角色的Fire函数中进行设置的,因此我们可以在那里把子弹的Instigator设置为玩家角色,设置在下面的步骤

Character函数中

image-20201202180240470

效果展示

在子弹击中的地方产生了可视化的球,说明成功触发了AI的听觉感应。

image-20201202180512041

最后,还是这个Instigator参数有诸多疑惑,这个子弹的Instigator和玩家角色自己的Instigator初值是什么,在UE4 4.25版本中,MakeNoise(1.0f,Instigator);直接写Instigator是不对的。等后面做玩家伤害的时候再去仔细研究下Instigator这个值

image-20201202181240573

原文地址:https://www.cnblogs.com/cloudboy/p/14075440.html