언리얼 공부/C++

일정 주기로 나왔다 사라지는 발판

jeongchanhyo 2025. 2. 4. 18:09

재료

  1. 발판 액터
  2. 발판 활성화
  3. 발판 비활성화
  4. 발판 유지시간
  5. 발판 주기

헤더파일

#pragma once

#include "CoreMinimal.h"
#include "FloorBase.h"
#include "CH_Timer.generated.h"

UCLASS()
class SETTING_API ACH_Timer : public AFloorBase
{
	GENERATED_BODY()
public:
	ACH_Timer();
protected:
	virtual void BeginPlay() override;
public:
	virtual void Tick(float DeltaTime) override;

	FTimerHandle TimerHandle;
	//발판 활성화 주기
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Platform")
	float ActivationInterval;
	//발판 유지 시간
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Platform")
	float ActiveDuration;
	//시작 상태
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Platform")
	bool bIsActive;
private:
	// 활성화
	void ActivatePlatform();

	// 비활성화
	void DeactivatePlatform();
};

여기서 처음보는 개념 하나가 나오는데 FTimerHandle이다.

FTimerHandle

타이머를 관리하는 핸들이다. 시작, 중지, 또는 조작할 때 사용되고 특정 시간 간격으로 함수를 호출하거나 일회성 작업을 예약할 때 유용.

 

CPP

#include "CH_Timer.h"
#include "TimerManager.h"
#include "Engine/World.h"

ACH_Timer::ACH_Timer()
{
	PrimaryActorTick.bCanEverTick = true;
	ActivationInterval = 2.0f;
	ActiveDuration = 2.0f;
	bIsActive = false;
}

void ACH_Timer::BeginPlay()
{
	Super::BeginPlay();

	if (bIsActive)
	{
		ActivatePlatform();
	}
	else
	{
		DeactivatePlatform();
	}
}

void ACH_Timer::Tick(float Deltatime)
{
	Super::Tick(Deltatime);
}
//발판 활성화
void ACH_Timer::ActivatePlatform()
{
	bIsActive = true;

	SetActorHiddenInGame(false);
	SetActorEnableCollision(true);

	GetWorld()->GetTimerManager().SetTimer(TimerHandle, this, &ACH_Timer::DeactivatePlatform, ActiveDuration, false);

}
//발판 비활성화
void ACH_Timer::DeactivatePlatform()
{
	bIsActive = false;

	SetActorHiddenInGame(true);
	SetActorEnableCollision(false);

	GetWorld()->GetTimerManager().SetTimer(TimerHandle, this, &ACH_Timer::ActivatePlatform, ActivationInterval, false);
}

큰 구조를 보면

  • 생성
  • 발판 활성화 함수
  • 발판 비활성화 함수

이렇게 볼 수 있다.

생성

ACH_Timer::ACH_Timer()
{
	PrimaryActorTick.bCanEverTick = true;
	ActivationInterval = 2.0f;
	ActiveDuration = 2.0f;
	bIsActive = false;
}

생성하고 주기 설정 및 초기 상태 설정이다.

발판 활성화 함수

void ACH_Timer::ActivatePlatform()
{
	bIsActive = true;

	SetActorHiddenInGame(false);
	SetActorEnableCollision(true);

	GetWorld()->GetTimerManager().SetTimer(TimerHandle, this, &ACH_Timer::DeactivatePlatform, ActiveDuration, false);

}

Set Actor Hidden In Game() : 이름과 같은 기능인데 액터를 게임 중에 보이거나 숨긴다. 단 시각적인부분이다. true가 숨기는거다.

Set Actor Enable Collision() : 액터의 출돌을 키거나 끈다. 위에서 보이는것만 관리 했으니 여기서 충돌을 관리하는 것이다.

GetWorld()->GetTimerManager().SetTimer() :  타이머를 설정하여 특정 시간 후에 함수를 호출합니다. 

GetWorld()->GetTimerManager().SetTimer(TimerHandle, this, &ACH_Timer::DeactivatePlatform, ActiveDuration, false);

이거는 ActivationInterval(활성화 주기)마다. ACH_Timer::DeactivatePlatform(발판 비활성화 함수)를 가져오라는 뜻으로 보면 된다.

발판 비활성화 함수

void ACH_Timer::DeactivatePlatform()
{
	bIsActive = false;

	SetActorHiddenInGame(true);
	SetActorEnableCollision(false);

	GetWorld()->GetTimerManager().SetTimer(TimerHandle, this, &ACH_Timer::ActivatePlatform, ActivationInterval, false);
}

 

 

 

위에랑 똑같다. 근데 여기서 bIsActive라고 상태 변수가 있는데 이거는 나중에 발판이 있을 때 무언가 기능을 넣고싶어 계속 바꿔주는것 뿐 bIsActive는 없어도 알아서 둘이서 무한으로 잘 돌아간다.