任务:创建一个Actor类,当它与角色发生重叠时,播放粒子特效
FPSObjectiveActor.h代码如下:
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "FPSObjectiveActor.generated.h"
class USphereComponent;
class UStaticMeshComponent;
class UParticleSystem;
UCLASS()
class FPSGAME_API AFPSObjectiveActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AFPSObjectiveActor();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
//重写Actor类重叠函数
virtual void NotifyActorBeginOverlap(AActor* OtherActor) override;
protected:
UPROPERTY(VisibleAnywhere,Category = "Components")
UStaticMeshComponent* MeshComp;
UPROPERTY(VisibleAnywhere,Category = "Components")
USphereComponent* SphereComp;
//声明函数:特效播放函数
void PlayEffect();
//声明粒子系统:重叠特效(在默认面板中编辑)
UPROPERTY(EditDefaultsOnly, Category = "Effects")
UParticleSystem* GetInEffects;
};
FPSObjectiveActor.cpp代码如下:
// Fill out your copyright notice in the Description page of Project Settings.
#include "FPSObjectiveActor.h"
#include "Components/StaticMeshComponent.h"
#include "Components/SphereComponent.h"
#include "Kismet\GameplayStatics.h"
#include "Particles\ParticleSystem.h"
// Sets default values
AFPSObjectiveActor::AFPSObjectiveActor()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
MeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComp"));
RootComponent = MeshComp;
MeshComp->SetCollisionEnabled(ECollisionEnabled::NoCollision);
SphereComp = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComp"));
SphereComp->SetupAttachment(MeshComp);
SphereComp->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
SphereComp->SetCollisionResponseToAllChannels(ECR_Ignore);
SphereComp->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
}
// Called when the game starts or when spawned
void AFPSObjectiveActor::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void AFPSObjectiveActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
//重写Actor重叠函数
void AFPSObjectiveActor::NotifyActorBeginOverlap(AActor* OtherActor)
{
Super::NotifyActorBeginOverlap(OtherActor);
PlayEffect();
}
//播放特效函数
void AFPSObjectiveActor::PlayEffect()
{
//在Actor所在位置播放粒子特效
UGameplayStatics::SpawnEmitterAtLocation(this, GetInEffects, GetActorLocation());
}