[UE5] TIL - 35 Actor에 부착된 Component에서 어떻게 Trigger를 만들까?

ChangJin·2024년 5월 29일
0

Unreal Engine5

목록 보기
63/114
post-thumbnail

2024-05-29

깃허브!
hhttps://github.com/ChangJin-Lee/Multiplayer-Puzzle-Platform

Udemy 언리얼 C++ 멀티플레이어 마스터 : 중급 게임 개발 강의를 수강하며 Component에서 어떻게 Trigger를 일으키는지 알게 된 내용을 정리한 글입니다.


1. 컴포넌트 추가하기


  • 원하는 유형의 Shape Component를 추가해야한다.

  • 나는 UBoxComponent를 선택했다.

  • 헤더파일에 다음처럼 선언해주었다. 편집이 필요한건 아니라서 VisibleAnyWhere로 지정자를 넣어주었다.

private:
	UPROPERTY(VisibleAnywhere)
	class UBoxComponent* TriggerVolume;
  • 여러 번 반복했던 것처럼 CreateDefaultSubobject를 사용해서 생성자에서 Component를 만들고 RootComponent에 부착해주어야한다.


2. 클래스 셋업하기

  • 컴포넌트 안에 들어설 때와 나설 때 트리거를 만들고 싶기 때문에 클래스를 셋업해주어야한다.

  • 밑에 두개의 함수를 선언해주고 원형을 헤더파일에 선언해준다.

  • 반드시 UFUNCTION()으로 선언해야한다.

    	OnOverlapBegin 
    	OnOverlapEnd 
	      /** 무언가가 구체 컴포넌트에 들어설 때 호출 */
      UFUNCTION()
      void OnOverlapBegin(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
 
      /** 무언가가 구체 컴포넌트를 나설 때 호출 */
      UFUNCTION()
      void OnOverlapEnd(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);


3. 다이내믹 델리게이트 등록해주기

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/dynamic-delegates-in-unreal-engine?application_version=5.3

  • 우리는 AddDynamic으로 등록하고자한다.
  • 공식문서의 내용을 잠깐 살펴보면 다음과 같다


언리얼 엔진 5 다이내믹 델리게이트 바인딩 헬퍼 매크로

언리얼 엔진 5에서 다이내믹 델리게이트를 사용하기 위해 제공되는 헬퍼 매크로들은 함수 이름 문자열을 자동 생성하여 바인딩 작업을 간편하게 해줍니다. 다음은 주요 헬퍼 매크로들의 설명입니다:

BindDynamic

다이내믹 델리게이트에서 BindDynamic() 호출을 위한 헬퍼 매크로입니다. 함수 이름 문자열을 자동 생성합니다.

BindDynamic( UserObject, FuncName )

AddDynamic

다이내믹 멀티-캐스트 델리게이트에서 AddDynamic() 호출을 위한 헬퍼 매크로입니다. 함수 이름 문자열을 자동 생성합니다.

AddDynamic( UserObject, FuncName )

RemoveDynamic

다이내믹 멀티-캐스트 델리게이트에서 RemoveDynamic() 호출을 위한 헬퍼 매크로입니다. 함수 이름 문자열을 자동 생성합니다.

RemoveDynamic( UserObject, FuncName )



  • 다음처럼 OnOverlapBegin 함수와 OnOverlapEnd를 각각 등록해준다.
void APlatformTrigger::BeginPlay()
{
	Super::BeginPlay();
	TriggerVolume->OnComponentBeginOverlap.AddDynamic(this, &APlatformTrigger::OnOverlapBegin);
	TriggerVolume->OnComponentEndOverlap.AddDynamic(this, &APlatformTrigger::OnOverlapEnd);
}


함수 완성하기

  • AMovingPlatform를 헤더파일에서 추가한 다음에 AMovingPlatform측에서 어떤 트리거가 생겼을때 움직임을 멈추거나 다시 움직이게하는 AddActiveTrigger, RemoveActiveTrigger 함수를 만들어 놓는다. 어떤 State 변수를 바꿔서 움직임을 제어할 것인데, bool 타입이면 안된다. 개수에 따른 트리거가 있을 수도 있으니 int로 선언해둔다. 해당하는 State 변수를 변형시켜서 움직임을 제어한다.
void APlatformTrigger::OnOverlapBegin(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
	for(AMovingPlatform* Platform : PlatformsToTrigger)
	{
		if(Platform != nullptr)
		{
			Platform->AddActiveTrigger();
		}
	}
	UE_LOG(LogTemp, Warning, TEXT("Activated"));
}

void APlatformTrigger::OnOverlapEnd(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)
{
	for(AMovingPlatform* Platform : PlatformsToTrigger)
	{
		if(Platform != nullptr)
		{
			Platform->RemoveActiveTrigger();
		}
	}
	UE_LOG(LogTemp, Warning, TEXT("DeActivated"));
}

  • 이건 AMovingPlatform 쪽에서의 함수이다.
void AMovingPlatform::AddActiveTrigger()
{
	ActiveTriggers++;
}

void AMovingPlatform::RemoveActiveTrigger()
{
	if(ActiveTriggers > 0)
	{
		ActiveTriggers--;
	}
}
profile
게임 프로그래머

0개의 댓글