2024-05-29
깃허브! |
---|
★ hhttps://github.com/ChangJin-Lee/Multiplayer-Puzzle-Platform |
Udemy 언리얼 C++ 멀티플레이어 마스터 : 중급 게임 개발 강의를 수강하며 Component에서 어떻게 Trigger를 일으키는지 알게 된 내용을 정리한 글입니다.
원하는 유형의 Shape Component를 추가해야한다.
나는 UBoxComponent를 선택했다.
헤더파일에 다음처럼 선언해주었다. 편집이 필요한건 아니라서 VisibleAnyWhere로 지정자를 넣어주었다.
private:
UPROPERTY(VisibleAnywhere)
class UBoxComponent* TriggerVolume;
컴포넌트 안에 들어설 때와 나설 때 트리거를 만들고 싶기 때문에 클래스를 셋업해주어야한다.
밑에 두개의 함수를 선언해주고 원형을 헤더파일에 선언해준다.
반드시 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);
언리얼 엔진 5에서 다이내믹 델리게이트를 사용하기 위해 제공되는 헬퍼 매크로들은 함수 이름 문자열을 자동 생성하여 바인딩 작업을 간편하게 해줍니다. 다음은 주요 헬퍼 매크로들의 설명입니다:
다이내믹 델리게이트에서 BindDynamic()
호출을 위한 헬퍼 매크로입니다. 함수 이름 문자열을 자동 생성합니다.
BindDynamic( UserObject, FuncName )
다이내믹 멀티-캐스트 델리게이트에서 AddDynamic()
호출을 위한 헬퍼 매크로입니다. 함수 이름 문자열을 자동 생성합니다.
AddDynamic( UserObject, FuncName )
다이내믹 멀티-캐스트 델리게이트에서 RemoveDynamic()
호출을 위한 헬퍼 매크로입니다. 함수 이름 문자열을 자동 생성합니다.
RemoveDynamic( UserObject, FuncName )
void APlatformTrigger::BeginPlay()
{
Super::BeginPlay();
TriggerVolume->OnComponentBeginOverlap.AddDynamic(this, &APlatformTrigger::OnOverlapBegin);
TriggerVolume->OnComponentEndOverlap.AddDynamic(this, &APlatformTrigger::OnOverlapEnd);
}
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"));
}
void AMovingPlatform::AddActiveTrigger()
{
ActiveTriggers++;
}
void AMovingPlatform::RemoveActiveTrigger()
{
if(ActiveTriggers > 0)
{
ActiveTriggers--;
}
}