【问题标题】:Pawn Class Hitting Itself With The On Begin Overlap Event Unreal Engine C++Pawn 类使用 On Begin Overlap 事件 Unreal Engine C++
【发布时间】:2020-09-29 02:47:57
【问题描述】:

我制作了一个简单的 pawn 类,它应该是一个球,可以四处移动并收集硬币。对于硬币收集系统,我制作了重叠事件以在球被击中时通知球。下面是基本代码(APlayerBall 是生成到游戏中的默认 pawn 类):

PlayerBall.h

UCLASS()
class ROLLINGBALL_API APlayerBall : public APawn
{
    GENERATED_BODY()

public:
    // Sets default values for this pawn's properties
    APlayerBall();

    UPROPERTY(VisibleAnywhere, Category="Mesh")
    UStaticMeshComponent* Mesh;

    UPROPERTY(VisibleAnywhere, Category="Mesh")
    class UCameraComponent* Camera;

    UPROPERTY(VisibleAnywhere, Category="Mesh")
    class UCapsuleComponent* Capsule;

protected:
    // Called when the game starts or when spawned
    void BeginPlay() override;

    UFUNCTION()
    void BeginOverlap(UPrimitiveComponent* OverlappedComponent, 
                      AActor* OtherActor, 
                      UPrimitiveComponent* OtherComp, 
                      int32 OtherBodyIndex, 
                      bool bFromSweep, 
                      const FHitResult &SweepResult );
public: 
    // Called every frame
    void Tick(float DeltaTime) override;

    // Called to bind functionality to input
    void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
};

PlayerBall.cpp

构造函数:

APlayerBall::APlayerBall() {
    Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
    Mesh->SetStaticMesh(ConstructorHelpers::FObjectFinder<UStaticMesh>(TEXT("StaticMesh'/Game/StarterContent/Shapes/Shape_Sphere.Shape_Sphere'")).Object);
    Mesh->SetSimulatePhysics(true);
    Mesh->SetEnableGravity(true);
    SetRootComponent(Mesh);

    Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));
    Camera->SetRelativeLocation(FVector(-500.0f, 0.0f, BaseEyeHeight));
    Camera->SetupAttachment(RootComponent);

    Capsule = CreateDefaultSubobject<UCapsuleComponent>(TEXT("Capsule"));
    Capsule->OnComponentBeginOverlap.AddDynamic(this, &APlayerBall::BeginOverlap);
    Capsule->SetupAttachment(Mesh);

    AutoPossessPlayer = EAutoReceiveInput::Player0;
}

还有BeginOverlap 方法:

void APlayerBall::BeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) {
    UE_LOG(LogTemp, Warning, TEXT("%s"), *OtherActor->GetHumanReadableName());
    UE_LOG(LogTemp, Warning, TEXT("%s"), *GetHumanReadableName());
    UE_LOG(LogTemp, Warning, TEXT("%s"), OtherActor == this ? TEXT("The Colliding Actor Is Myself") : TEXT("The Colliding Actor Is Not Myself"));
}

如您所见,我添加了日志消息以查看究竟是什么击中了它。经过一点调试,我发现它由于某种原因被自己击中了。游戏一开始,登录界面是这样的:为什么会这样?我该如何解决这个问题?

【问题讨论】:

  • 我对 C++ 非常生疏,但是我认为您应该知道静态网格组件默认会生成重叠事件。我假设您的静态网格组件相互重叠。这对我来说有点摸不着头脑,但我希望这条评论对我有所帮助。

标签: c++ unreal-engine4


【解决方案1】:

另一种方法是使用IgnoreActorWhenMoving,你可以得到更多细节here~

【讨论】:

    【解决方案2】:

    看起来网格组件与胶囊组件重叠。将组件添加到您的日志以进行确认。

    如果您只想知道您的演员何时与另一个演员重叠,您可能想改用AActor::NotifyActorBeginOverlap

    如果您想使用组件重叠,但又想忽略您自己的 Actor 中其他组件的重叠,那么您要么必须在 BeginOverlap 中自己过滤掉它们,要么调整您的物理碰撞配置文件,以便每个组件具有不为彼此生成重叠事件的不同对象类型。如果是我,我会像这样做一个过滤器:

    void APlayerBall::BeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) {
        if (this == OtherActor) {
            // The Colliding Actor Is Myself. Ignoring because I don't care about this for some reason.
            UE_LOG(LogTemp, Warning, TEXT("Ignoring component overlap of my own components"));
            return;
        }
        UE_LOG(LogTemp, Warning, TEXT("%s"), *OtherActor->GetHumanReadableName());
        UE_LOG(LogTemp, Warning, TEXT("%s"), *GetHumanReadableName());
    }
    

    【讨论】:

    • 谢谢!虽然我已经完成了对虚幻引擎的修改,但我觉得这在我以后再次感到无聊时会有用,所以我将其标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 2018-06-04
    相关资源
    最近更新 更多