재료
- 발판 액터
- 발판 활성화
- 발판 비활성화
- 발판 유지시간
- 발판 주기
헤더파일
#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는 없어도 알아서 둘이서 무한으로 잘 돌아간다.
'언리얼 공부 > C++' 카테고리의 다른 글
순수가상함수, 추상클래스 그리고 인스턴스 (0) | 2025.02.20 |
---|---|
플로우 차트 (0) | 2025.02.18 |
FPS무기 구조 생각 (0) | 2025.02.17 |
액터 회전, 반복 이동 (0) | 2025.02.03 |
C++클래스로 액터 생성하고 컴포넌트 추가하기. (1) | 2025.01.23 |