본문 바로가기

밟으면 사라지는 바닥 추가

Kwonriver 2022. 6. 17.
728x90

 

밟으면 사라지는 액터를 추가하였음.

기본 스태틱 메쉬와 밟았다는 것을 체크할 트리거 박스로 이루어진 액터.

DisappearActor라는 이름으로 Actor를 상속받아 추가하였음.

액터가 사라지기까지 걸리는 시간 변수를 EditAnywhere로 선언하여 레벨에 배치할 때 액터마다 사라지는 타이밍을 다르게 하였음

 

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include <Engine/Classes/Components/BoxComponent.h>
#include "DisappearActor.generated.h"

UCLASS()
class HARDTOGETGOAL_API ADisappearActor : public AActor
{
	GENERATED_BODY()

public:
	// Sets default values for this actors properties
	ADisappearActor();

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

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

public:
	UPROPERTY(EditAnywhere)
		float ActorDestroyDelay;
	
	UPROPERTY(EditAnywhere)
		UBoxComponent *Triggerbox;

	UPROPERTY(EditAnywhere)
		UStaticMeshComponent *DisappearActorStaticMeshComponent;

	UFUNCTION()
		void TriggerBoxBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent *OtherComp, int32 OtherBoxIndex, bool bFromSweep, const FHitResult& SweepResult);

	UFUNCTION()
		void TriggerBoxEndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent *OtherComp, int32 OtherBoxIndex);
};

 

UBoxComponent를 사용하기 위해 <Engine/Classes/;Components/BoxComponent.h> 를 인클루드 하였음.

TriggerBox는 EditAnywhere 이기 때문에 이 클래스를 상속받아 만든 블루프린트 내에서 크기를 조절할 수 있음.

 

TriggerBoxBeginOverlap 는 트리거박스에 다른 액터가 겹치기 시작할 때 동작시킬 함수

트리거 박스에 닿으면 액터를 제거하거나, 터지는 이펙트를 띄우거나 할 수 있음

 

TriggerBoxEndOverlap 는 트리거박스에 다른 액터가 나갔을 때 동작시킬 함수

트리거 박스에서 나갈 때 액터를 제거하거나 시간을 느리게 하거나 등등 할 수 있음

 

#include "DisappearActor.h"

// Sets default values
ADisappearActor::ADisappearActor()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you dont need it.
	PrimaryActorTick.bCanEverTick = true;

	DisappearActorStaticMeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMeshComponent"));
	SetRootComponent(DisappearActorStaticMeshComponent);

	Triggerbox = CreateDefaultSubobject<UBoxComponent>(TEXT("TriggerBox"));
	Triggerbox->SetupAttachment(RootComponent);
	Triggerbox->SetRelativeLocation(FVector(0.0f, 0.0f, 0.0f));

	bPlayerOn = false;
	fPlayerOnTime = 0.0f;
}

// Called when the game starts or when spawned
void ADisappearActor::BeginPlay()
{
	Super::BeginPlay();
	
	Triggerbox->OnComponentBeginOverlap.AddDynamic(this, &ADisappearActor::TriggerBoxBeginOverlap);
	Triggerbox->OnComponentEndOverlap.AddDynamic(this, &ADisappearActor::TriggerBoxEndOverlap);
}

// Called every frame
void ADisappearActor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	if (bPlayerOn == true)
	{
		fPlayerOnTime += DeltaTime;

		if (fPlayerOnTime >= ActorDestroyDelay)
		{
			// 해당 액터 파괴
			Destroy();
		}
	}
}

void ADisappearActor::TriggerBoxBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent *OtherComp, int32 OtherBoxIndex, bool bFromSweep, const FHitResult& SweepResult)
{
	bPlayerOn = true;
	fPlayerOnTime = 0.0f;
}

void ADisappearActor::TriggerBoxEndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent *OtherComp, int32 OtherBoxIndex)
{
	bPlayerOn = false;
	fPlayerOnTime = 0.0f;
}

 

현재는 닿자마자 사라지는 상태. bPlayerOn이 true가 되는 시점에 액터가 사라짐

틱에서 컨트롤을 하고 있지만 TriggerBoxBeginOverlap 함수가 동작할 때 타어미를 이용해서 동작시켜도 됨.

다만 타이머 자체가 오버헤드가 큰 편이기 때문에 틱에서 처리했음

 

Triggerbox->OnComponentBeginOverlap.AddDynamic(this, &ADisappearActor::TriggerBoxBeginOverlap);
Triggerbox->OnComponentEndOverlap.AddDynamic(this, &ADisappearActor::TriggerBoxEndOverlap);

 

이 두 줄이 함수를 바인딩하는 부분. 

728x90

'[Unreal4] > 횡스크롤 맵탈출' 카테고리의 다른 글

횡으로 이동하는 바닥 추가  (0) 2022.06.14
플레이어 이동 추가  (0) 2022.06.13