UE4爲組件Component註冊事件時沒有效果的問題解決

按照UE4的教程:

.h文件:

// 在 Project Settings 的 Description 頁面填入版權聲明。
#pragma once
#include "GameFramework/Actor.h"
#include "FPSProjectile.generated.h"
UCLASS()
class FPSPROJECT_API AFPSProjectile : public AActor
{
    GENERATED_BODY()
public: 
    // 設置該 actor 屬性的默認值
    AFPSProjectile();
    // 遊戲開始時或生成時調用
    virtual void BeginPlay() override;
    // 每幀調用
    virtual void Tick( float DeltaSeconds ) override;
    // 球體碰撞組件。
    UPROPERTY(VisibleDefaultsOnly, Category = Projectile)
    USphereComponent* CollisionComponent;
    // 發射物運動組件。
    UPROPERTY(VisibleAnywhere, Category = Movement)
    UProjectileMovementComponent* ProjectileMovementComponent;
    // 在發射方向上設置發射物初速度的函數。
    void FireInDirection(const FVector& ShootDirection);
    // 發射物命中物體時調用的函數。
    void OnHit(UPrimitiveComponent* HitComponent, class AActor* OtherActor, class UPrimitiveComponent* OtherComponent, FVector NormalImpulse, const FHitResult& Hit);
};


cpp文件:

// 在 Project Settings 的 Description 頁面填入版權聲明。
#include "FPSProject.h"
#include "FPSProjectile.h"
// 設置默認值
AFPSProjectile::AFPSProjectile()
{
    // 將此 actor 設爲每幀調用 Tick()。不需要時可將此關閉,以提高性能。
    PrimaryActorTick.bCanEverTick = true;
    // 使用球體代表簡單碰撞。
    CollisionComponent = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComponent"));
    CollisionComponent->BodyInstance.SetCollisionProfileName(TEXT("Projectile"));
    CollisionComponent->OnComponentHit.AddDynamic(this, &AFPSProjectile::OnHit);
    // 設置球體的碰撞半徑。
    CollisionComponent->InitSphereRadius(15.0f);
    // 將碰撞組件設爲根組件。
    RootComponent = CollisionComponent;
    // 使用此組件驅動此發射物的運動。
    ProjectileMovementComponent = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("ProjectileMovementComponent"));
    ProjectileMovementComponent->SetUpdatedComponent(CollisionComponent);
    ProjectileMovementComponent->InitialSpeed = 3000.0f;
    ProjectileMovementComponent->MaxSpeed = 3000.0f;
    ProjectileMovementComponent->bRotationFollowsVelocity = true;
    ProjectileMovementComponent->bShouldBounce = true;
    ProjectileMovementComponent->Bounciness = 0.3f;
    // 3 秒後消亡。
    InitialLifeSpan = 3.0f;
}
// 遊戲開始時或生成時調用
void AFPSProjectile::BeginPlay()
{
    Super::BeginPlay();
}
// 每幀調用
void AFPSProjectile::Tick( float DeltaTime )
{
    Super::Tick( DeltaTime );
}

// 在發射方向上設置發射物初速度的函數。
void AFPSProjectile::FireInDirection(const FVector& ShootDirection)
{
    ProjectileMovementComponent->Velocity = ShootDirection * ProjectileMovementComponent->InitialSpeed;
}
// 發射物命中物體時調用的函數。
void AFPSProjectile::OnHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComponent, FVector NormalImpulse, const FHitResult& Hit)
{
    if (OtherActor != this && OtherComponent->IsSimulatingPhysics())
    {
        OtherComponent->AddImpulseAtLocation(ProjectileMovementComponent->Velocity * 100.0f, Hit.ImpactPoint);
    }
}


運行後發現OnHit並沒有觸發。

改成下面即可解決問題:


.h文件:

// Fill out your copyright notice in the Description page of Project Settings.
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Components/SphereComponent.h"
#include "GameFramework/ProjectileMovementComponent.h"
#include "DelegateCombinations.h"
#include "FPSProjectile.generated.h"

UCLASS()
class FPSPROJECT_API AFPSProjectile : public AActor
{
	GENERATED_BODY()
	
public:
	UPROPERTY(VisibleDefaultsOnly, Category = Projectile)
		USphereComponent* CollisionComponent;

	UPROPERTY(VisibleAnywhere, Category = Movement)
		UProjectileMovementComponent* ProjectileMovementComponent;
	
public:	
	// Sets default values for this actor's properties
	AFPSProjectile();

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

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

	// 在發射方向上設置發射物初速度的函數。
	void FireInDirection(const FVector& ShootDirection);
	
	UFUNCTION()
	void OnHit(UPrimitiveComponent* HitComponent, class AActor* OtherActor, class UPrimitiveComponent* OtherComponent, FVector NormalImpulse, const FHitResult& Hit);
};


在事件的前面加上UFUNCTION()修飾符即可。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章