C++ 典当类用开始重叠事件“虚幻引擎C+”击中自身+;

C++ 典当类用开始重叠事件“虚幻引擎C+”击中自身+;,c++,unreal-engine4,C++,Unreal Engine4,我做了一个简单的典当类,应该是一个球,四处移动,收集硬币。对于硬币收集系统,我做了重叠事件,当球被击中时通知它。以下是基本代码(APlayerBall是默认的pawn类,生成到游戏中): PlayerBall.h UCLASS() class ROLLINGBALL_API APlayerBall : public APawn { GENERATED_BODY() public: // Sets default values for this pawn's properties

我做了一个简单的典当类,应该是一个球,四处移动,收集硬币。对于硬币收集系统,我做了重叠事件,当球被击中时通知它。以下是基本代码(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;
}

如您所见,我添加了日志消息,以查看到底是什么击中了它。经过一点调试,我发现它由于某种原因被自己击中了。游戏一开始,日志屏幕就会显示如下:为什么会发生这种情况?如何修复此问题?

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

如果您只想知道您的参与者何时与另一个参与者重叠,您可能需要使用
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());
}

我对C++很生疏,但是我认为默认情况下,你应该知道静态网格组件会产生重叠事件。我假设静态网格组件彼此重叠。这对我来说有点像是瞎猜,但我希望这条评论能有所帮助。谢谢!虽然我已经完成了对虚幻引擎的修补,但我觉得这在将来我再次感到无聊时会很有用,所以我会将其标记为已接受。
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());
}