본문 바로가기

언리얼엔진/UE5

UE5 Delay 함수를 C++로 써보자

BP에서 자주보던 Delay 함수를 C++로 가져와서 쓰자니

매 번 타이머핸들 호출하고 델리게이트 넣고 하는게 귀찮아서 

어느 클래스에서도 쉽게 사용할 수 있도록 만들어봤어요

 

 

#pragma once

// Engine
#include <CoreMinimal.h>
#include <Math/UnrealMath.h>
#include <Engine/World.h>
#include <TimerManager.h>


/**
 * 
 */
class PAPERNINJA_API PNFunctionLibrary
{
public:
	// 벡터에서 Z를 0으로 만드는 메서드
	static FVector flatten_vector(FVector value_in)
	{
		FVector return_vector;
		float X, Y, Z;
		X = value_in.X;
		Y = value_in.Y;
		Z = 0.f;

		return_vector = FVector(X, Y, Z);

		return return_vector;

	}

	// std::function을 써서 멤버함수를 캡슐화 시킨 후 인스턴스랑 함께 전달함
	static void delay_function(const std::function<void()>& function_in, float delay_time_in, UWorld* world_in)
	{
		if (IsValid(world_in)) 
		{
			FTimerHandle timer_handle;
			FTimerDelegate timer_delegate;
			timer_delegate.BindLambda([function_in, world_in, &timer_handle]() 
            {
				function_in();
				world_in->GetTimerManager().ClearTimer(timer_handle);
				});
			world_in->GetTimerManager().SetTimer(timer_handle, timer_delegate, delay_time_in, false);
		}
	}
};


static void delay_function 함수만 보세요~
핵심은 std::function을 사용해서 호출할 함수를 캡슐화 하고 해당 함수의 클래스를 인스턴스화해서 묶어주는 것입니다.




사용법)
PNFunctionLibrary::delay_function([this]() { your_function_name(); }, 5.f, GetWorld()); //함수 이름, 지연시간, 월드