두 이벤트는 서로 다른 충돌 처리 방식이라 동시에 작동하지 않는다.
어떤 충돌을 감지하거나 무시할지 설정
플레이어 캐릭터에 태그 추가
해당 블루프린트 Details -> Actor -> Advanced -> Tags 추가
오버랩 이벤트 발생 시 플레이어인지 확인하기 위해 추가한다.

아이템 인터페이스를 구현하는 BaseItem 클래스에서 오버랩 이벤트에 클래스의 오버랩 함수를 바인딩한다.
이벤트 바인딩은 런타임에서 이루어지기 때문에 게임 실행 전에는 어떤 객체가 어떤 상황에서 이벤트를 발생시킬 지 알 수 없다. 이런 예측 불가능한 상황에 대비하려면 이벤트 함수를 게임 실행 중에 동적으로 연결해야한다.
// BaseItem.cpp
#include "BaseItem.h"
#include "Components/SphereComponent.h"
// Sets default values
ABaseItem::ABaseItem()
{
PrimaryActorTick.bCanEverTick = false;
Scene = CreateDefaultSubobject<USceneComponent>(TEXT("Scene"));
SetRootComponent(Scene);
Collision = CreateDefaultSubobject<USphereComponent>(TEXT("Collision"));
// 콜리전 프리셋 설정
Collision->SetCollisionProfileName(TEXT("OverlapAllDynamic"));
Collision->SetupAttachment(Scene);
StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
StaticMesh->SetupAttachment(Collision);
// 이벤트 바인딩
Collision->OnComponentBeginOverlap.AddDynamic(this, &ABaseItem::OnItemOverlap);
Collision->OnComponentEndOverlap.AddDynamic(this, &ABaseItem::OnItemEndOverlap);
}
콜리전 메시에서 AddDynamic으로 OnComponentBeginOverlap과 OnComponentEndOverlap 델리게이트를 특정 함수와 바인딩한다. 델리게이트는 함수 시그니처가 정확히 일치해야 바인딩할 수 있으므로 매개변수 타입을 맞춰주어야 한다.
또한 AddDynamic 으로 바인딩할 경우 해당 함수를 리플렉션 시스템에 등록해야 엔진이 런타임 때 찾을 수 있으므로 UFUNCTION()매크로는 필수이다.
인터페이스에서 리플렉션에 등록하면 이후 구현하는 클래스에서는 할 필요 없다.
// ItemInterface.h
// 플레이어가 진입했을 때
UFUNCTION()
virtual void OnItemOverlap(
UPrimitiveComponent* OverlappedComp, // 오버랩 발생한 자기 자신 ex) 콜리전 메시
AActor* OtherActor, // 부딪힌 액터
UPrimitiveComponent* OtherComp, // 부딪힌 액터에 붙어있는 충돌을 일으킨 컴포넌트
int32 OtherBodyIndex,
bool bFromSweep,
const FHitResult& SweepResult) = 0;
// 플레이어가 이탈했을 때
UFUNCTION()
virtual void OnItemEndOverlap(
UPrimitiveComponent* OverlappedComp,
AActor* OtherActor,
UPrimitiveComponent* OtherComp,
int32 OtherBodyIndex) = 0;
출처: 스파르타코딩 내일배움캠프