본문 바로가기

프로그래밍

언리얼 엔진 5: UShapeComponent 오버랩 이벤트에서 특정 액터 무시하기

728x90
728x90

안녕하세요! 언리얼 엔진 5를 활용한 게임 개발을 진행하다 보면, UShapeComponent (또는 UPrimitiveComponent)의 오버랩 이벤트에서 특정 액터만을 무시해야 하는 경우가 종종 발생합니다. 예를 들어, 플레이어 캐릭터 주변의 범위 컴포넌트가 있지만, 특정 NPC나 아이템과는 상호작용하지 않아야 할 때가 그렇죠. 이번 글에서는 언리얼 엔진 5에서 이러한 특정 액터 무시 기능을 어떻게 구현할 수 있는지, 그리고 관련 API에 대한 정확한 정보를 공유하고자 합니다.


1. 오버랩 이벤트의 기본 동작 원리 이해하기

언리얼 엔진의 오버랩 이벤트 (예: OnComponentBeginOverlap)는 두 컴포넌트콜리전 설정에 따라 자동으로 발생합니다. 이 시스템은 주로 콜리전 채널이나 오브젝트 타입 단위로 동작하며, 아쉽게도 개별 액터 단위로 직접적으로 무시(IGNORE)하는 기능은 엔진의 기본 구조에 내장되어 있지 않습니다. 즉, 콜리전 시스템은 "이러한 타입의 오브젝트와는 오버랩하지 않는다"라고 설정할 수는 있지만, "이 액터와는 오버랩하지 않는다"라고 직접적으로 지정할 수는 없다는 의미입니다.


2. 특정 액터만 무시하는 표준적인 방법

그렇다면 특정 액터를 무시하려면 어떻게 해야 할까요? 가장 일반적이고 권장되는 방법은 오버랩 이벤트가 발생했을 때, 이벤트 함수에서 전달되는 OtherActor (혹은 OtherComp)를 직접 비교하여 무시할 대상을 필터링하는 방식입니다.

다음은 간단한 C++ 코드 예시입니다:

C++
 
void AMyActor::OnSphereBeginOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor,                                    UPrimitiveComponent* OtherComp, int32 OtherBodyIndex,                                    bool bFromSweep, const FHitResult& SweepResult){
    // 유효성 검사: OtherActor가 nullptr일 경우를 대비
    if (!OtherActor) return;

    // 자기 자신과의 오버랩 무시 (자주 필요한 경우)
    if (OtherActor == this) return;

    // 특정 액터 리스트에 포함된 경우 무시
    // IgnoredActors는 UPROPERTY(EditAnywhere) 등으로 선언된 AActor* 배열 또는 TSet<AActor*> 일 수 있습니다.
    if (IgnoredActors.Contains(OtherActor)) return;

    // --- 여기서부터 실제 오버랩 처리 로직을 구현합니다 ---
    UE_LOG(LogTemp, Log, TEXT("Overlap with: %s"), *OtherActor->GetName());
    // 예: 데미지 적용, 아이템 획득 등
}

이 방식은 블루프린트에서도 동일하게 구현할 수 있습니다. Other Actor 핀을 사용하여 원하는 액터와 같거나, 특정 배열에 포함되어 있는지 확인하는 노드를 연결하면 됩니다.


3. SetIgnoreActor, AddIgnoredActor 관련 함수는 존재할까?

언리얼 엔진을 사용하다 보면, 특정 액터에 대한 오버랩을 무시하는 기능이 필요할 때, 혹시 SetIgnoreActorAddIgnoredActor와 같은 편리한 함수가 UPrimitiveComponentUShapeComponent에 존재하지 않을까 찾아보게 됩니다. 하지만 안타깝게도 이러한 함수는 해당 컴포넌트에는 존재하지 않습니다. 저 또한 처음에는 그런 함수가 있을 것이라고 생각하고 검색해 보았지만, 직접적으로 컴포넌트에 특정 액터를 무시 대상으로 등록하는 API는 제공되지 않습니다.

이는 언리얼 엔진의 콜리전 시스템이 주로 콜리전 채널오브젝트 타입을 기반으로 하기 때문입니다. 개별 액터 단위의 무시 설정은 컴포넌트 레벨이 아닌, 오버랩 이벤트 발생 시 개발자가 직접 로직으로 처리해야 합니다.

간혹 **라인 트레이스(Trace)**나 스윕(Sweep) 계열 함수에서 ActorsToIgnore 리스트를 지정하는 기능을 보신 분들이 있을 겁니다. 이 기능은 이름에서 알 수 있듯이 트레이스나 스윕 연산에만 적용되며, 컴포넌트 자체의 지속적인 오버랩/블록 콜리전에는 적용되지 않습니다. 이 점을 혼동하지 않도록 주의해야 합니다.


4. 결론 및 요약

언리얼 엔진 5에서 UShapeComponent의 오버랩 이벤트에서 특정 액터만 무시하는 방법에 대해 다시 한번 정리해 보겠습니다.

  • 특정 액터만 오버랩 이벤트에서 직접적으로 무시하는 기능은 엔진 기본 구조에는 없습니다.
  • 오버랩 이벤트 함수(OnComponentBeginOverlap 등) 내부에서 OtherActor를 직접 비교하여 무시하는 로직을 구현해야 합니다.
  • SetIgnoreActor, AddIgnoredActor와 같은 함수는 UPrimitiveComponent나 UShapeComponent에는 없으므로, 반드시 이벤트에서 직접 처리해야 합니다.
  • 트레이스/스윕에는 ActorsToIgnore가 있지만, 이는 컴포넌트의 일반적인 오버랩/블록 콜리전에는 적용되지 않습니다.
  • 만약 그룹 단위로 콜리전을 제어해야 한다면, 커스텀 콜리전 채널/오브젝트 타입을 설계하여 활용하는 것을 고려할 수 있습니다.

이처럼 언리얼 엔진 5에서는 특정 액터에 대한 오버랩 무시를 개발자가 직접 이벤트 핸들러 내에서 처리하는 방식으로 구현해야 합니다. 이 글이 여러분의 언리얼 엔진 개발에 도움이 되기를 바랍니다!

 

728x90
반응형