按照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); } }
改成下面即可解決問題:
.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); };