• 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

  • 相关阅读:
    Spoj-ANTP Mr. Ant & His Problem
    Spoj-BIPCSMR16 Team Building
    cf575A Fibonotci
    cf660E Different Subsets For All Tuples
    cf468C Hack it!
    cf468B Two Sets
    cf701E Connecting Universities
    Spoj-BLMIRINA Archery Training
    Spoj-BITDIFF Bit Difference
    Spoj-VISIBLEBOX Decreasing Number of Visible Box
  • 原文地址:https://www.cnblogs.com/cloudboy/p/14075440.html
Copyright © 2020-2023  润新知