충돌 채널과 프로파일 설정
오브젝트·트레이스 채널과 충돌 프로파일의 Block·Overlap·Ignore 응답을 설계하고 적용합니다.
캐릭터는 벽을 뚫고 지나가면 안 되지만, 바닥에 떨어진 아이템 위로는 지나가면서 "주웠다"는 사실을 알려야 합니다. 총알은 적에게 맞아야 하지만 총을 쏜 무기 자신에게 맞아서는 안 됩니다. 이처럼 물체마다 무엇과 부딪히고, 무엇과 겹치기만 하고, 무엇을 무시할지가 다릅니다. 이 관계를 물체 하나하나에 따로 설정하면 실수가 생기기 쉽고, 규칙이 바뀔 때 고칠 곳도 많아집니다.
언리얼 엔진은 이 관계를 충돌 채널(collision channel)과 충돌 프로파일(collision profile)로 정리합니다. 이 글에서는 충돌의 두 가지 반응인 Block과 Overlap을 구분하고, 채널과 프로파일을 만들고 적용하는 방법을 살펴본 뒤, C++에서 오버랩 이벤트를 받는 트리거 볼륨을 만듭니다. 마지막으로 두 컴포넌트의 응답이 어떻게 조합되는지와, 이벤트가 실제로 오려면 무엇이 더 필요한지를 정리합니다.
막을 것인가, 겹침만 알릴 것인가
3D 게임에서 충돌은 둘 이상의 물체(액터나 컴포넌트)가 서로의 공간에 들어왔을 때 생기는 접촉이나 겹침을 감지하는 일입니다. 언리얼 엔진은 이를 감지하고, 결과에 따라 여러 반응을 일으킬 수 있도록 설계되어 있습니다.
충돌의 반응은 크게 두 가지입니다. 블록(Block)은 충돌을 검사하는 이동이나 스윕(sweep), 물리 접촉에서 통과를 막는 응답으로, 캐릭터가 벽에 부딪혀 멈추는 경우가 여기에 해당합니다. 오버랩(Overlap)은 두 물체가 서로의 공간에 들어왔지만 물리적으로 막지는 않고, 겹쳤다는 사실만 감지하는 응답입니다. 플레이어가 아이템을 주우려고 아이템 위에 서는 경우가 그 예입니다. 여기에 아무 반응도 하지 않는 무시(Ignore)가 더해져 세 가지 응답이 됩니다.
충돌 채널: 물체를 종류별로 나누기
언리얼 엔진은 게임 속 물체를 충돌 채널이라는 논리적인 묶음으로 나눕니다. 채널마다 특정 종류의 물체를 나타내고, 이 채널을 기준으로 어떤 물체가 어떤 물체와 어떻게 반응할지를 정합니다.
엔진이 기본으로 제공하는 오브젝트 채널(object channel)은 다음과 같습니다.
| 채널 | 쓰임 |
|---|---|
WorldStatic | 벽, 바닥, 천장처럼 움직이지 않는 월드 지오메트리 |
WorldDynamic | 문, 엘리베이터처럼 움직이는 월드 물체 |
Pawn | 플레이어 캐릭터나 AI 폰 |
PhysicsBody | 부서지는 상자처럼 물리 시뮬레이션되는 물체 |
Vehicle | 차량 |
Destructible | 디스트럭터블 메시가 기본으로 받는 채널 |
이와 비슷한 이름이 몇 가지 더 보이는데 종류가 다릅니다. CharacterMesh는 오브젝트 채널이 아니라 캐릭터 메시에 쓰는 충돌 프로파일의 이름입니다. Visibility와 Camera는 트레이스(trace)가 쓰는 트레이스 채널로, 물체를 분류하는 오브젝트 채널과 구별합니다. 트레이스는 라인 트레이스 (Trace) 시스템에서 다룹니다.
커스텀 채널 만들기
게임에 필요한 종류가 따로 있다면 커스텀 충돌 채널을 만들 수 있습니다. 예를 들어 총알, 폭발 범위, 상호작용 물체 같은 채널입니다.
에디터 메뉴의 Edit > Project Settings를 열고, 왼쪽 목록의 Engine 아래에서 Collision을 고릅니다. 물체를 분류할 채널이 필요하면 New Object Channel을, 트레이스 용도의 채널이 필요하면 New Trace Channel을 누릅니다. 새 채널의 이름(예: Bullet, ExplosionArea)을 입력하고 기본 응답(Default Response)을 정한 뒤 Accept를 누르면 채널이 만들어집니다. 기본 응답을 Ignore로 두면 다른 물체들이 기본적으로 이 채널을 무시하고, Overlap이면 기본적으로 겹침을 감지하며, Block이면 기본적으로 막습니다. 이렇게 만든 채널은 프로젝트의 모든 충돌 설정에서 쓸 수 있습니다.
충돌 프로파일: 응답을 묶어 두기
충돌 프로파일은 한 물체가 각 충돌 채널에 대해 Ignore, Overlap, Block 가운데 어떤 응답을 할지를 미리 정해 둔 규칙 묶음입니다. 프로젝트 설정에서는 충돌 프리셋(Collision Presets)이라고 부릅니다. 컴포넌트마다 응답을 하나하나 설정하는 대신 미리 정의한 프로파일을 적용하면, 같은 종류의 물체가 모두 같은 규칙을 따르게 되고 규칙을 바꿀 때도 한곳만 고치면 됩니다.
Project Settings의 Collision 항목에서 Collision Presets를 펼치면 BlockAll, OverlapAll, Pawn, PhysicsActor 같은 기본 프로파일이 보입니다. New 버튼으로 새 프로파일을 만들고, 이름(예: PlayerWeapon, EnemyHitBox)과 함께 충돌 활성화 방식(Collision Enabled), 이 프로파일을 쓰는 물체의 채널(Object Type), 그리고 채널별 응답을 정합니다.
가장 중요한 부분은 채널별 응답을 정하는 Collision Responses입니다. 예를 들어 EnemyHitBox와 Bullet을 오브젝트 채널로 먼저 만든 뒤 PlayerWeapon 프로파일을 정한다면, Pawn에는 Ignore, WorldStatic에는 벽에 막히도록 Block, EnemyHitBox에는 적의 히트박스와 겹칠 때 피해를 처리하도록 Overlap, Bullet에는 무기가 총알에 맞지 않도록 Ignore를 줄 수 있습니다. 여기서 Pawn의 Ignore는 모든 폰을 무시한다는 뜻이며, 자기 자신만 빼는 설정이 아닙니다. 이런 식으로 게임의 규칙에 맞게 각 채널의 응답을 정합니다.
컴포넌트에 프로파일 적용하기
충돌은 액터가 아니라 컴포넌트 단위로 감지됩니다. 그래서 충돌을 감지하려면 UCapsuleComponent, UBoxComponent, USphereComponent, UStaticMeshComponent, USkeletalMeshComponent 같은 충돌 형상을 가진 컴포넌트가 있어야 하고, 프로파일도 그 컴포넌트에 적용합니다.
C++에서 적용하기
C++에서는 SetCollisionProfileName()으로 미리 정의한 프로파일을 적용합니다. 다음은 캐릭터의 캡슐과 메시에 프로파일을 적용하는 생성자 발췌입니다.
#include "MyCharacter.h"
#include "Components/CapsuleComponent.h" // UCapsuleComponent를 위해
#include "Components/SkeletalMeshComponent.h"
AMyCharacter::AMyCharacter()
{
// ACharacter의 기본 루트 컴포넌트는 UCapsuleComponent입니다.
UCapsuleComponent* CapsuleComp = GetCapsuleComponent();
if (CapsuleComp)
{
// "Pawn" 충돌 프로파일 적용
// 이 프로파일은 Project Settings -> Collision Preset에서 정의되어야 합니다.
CapsuleComp->SetCollisionProfileName(TEXT("Pawn"));
// 또는 직접 충돌 반응 설정 (프로파일 적용 대신)
// CapsuleComp->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); // 쿼리 및 물리 충돌 활성화
// CapsuleComp->SetCollisionObjectType(ECollisionChannel::ECC_Pawn); // 이 컴포넌트의 오브젝트 타입 설정
// 특정 채널에 대한 반응 설정 (예: Bullet 채널은 Block)
// CapsuleComp->SetCollisionResponseToChannel(ECollisionChannel::ECC_GameTraceChannel1, ECollisionResponse::ECR_Block);
// ECC_GameTraceChannel1은 Project Settings에서 정의한 커스텀 채널 (예: Bullet)
}
// 캐릭터의 메시 컴포넌트 (USkeletalMeshComponent)
USkeletalMeshComponent* MeshComp = GetMesh();
if (MeshComp)
{
// "CharacterMesh" 충돌 프로파일 적용
MeshComp->SetCollisionProfileName(TEXT("CharacterMesh"));
// MeshComp->SetCollisionEnabled(ECollisionEnabled::QueryOnly); // 트레이스·스윕·오버랩 쿼리 참여, 강체 시뮬레이션 제외
}
}SetCollisionProfileName(TEXT("ProfileName"))은 프로젝트 설정에서 정의한 프로파일을 적용하는 함수로, 가장 권장되는 방법입니다. 주석으로 남겨 둔 함수들은 프로파일 대신 값을 직접 정할 때 씁니다. SetCollisionObjectType()은 이 컴포넌트가 어느 채널에 속하는지 정하고, SetCollisionResponseToChannel()은 특정 채널에 대한 응답만 따로 바꿉니다. 코드의 ECC_GameTraceChannel1은 프로젝트 설정에서 만든 첫 번째 커스텀 채널을 가리키는 이름입니다.
SetCollisionEnabled()는 충돌에 어떤 경로로 참여할지 정합니다. 이 글에서 쓰는 기본 값은 네 가지입니다.
| 값 | 뜻 |
|---|---|
NoCollision | 충돌에 참여하지 않습니다. |
QueryOnly | 트레이스, 스윕, 오버랩 같은 쿼리에만 참여하고 강체 시뮬레이션에는 참여하지 않습니다. 스윕 이동의 Block 판정은 할 수 있습니다. |
PhysicsOnly | 강체 시뮬레이션에만 참여하고 공간 쿼리에서는 빠집니다. |
QueryAndPhysics | 쿼리와 물리 시뮬레이션에 모두 참여합니다. |
블루프린트에서 적용하기
블루프린트에서는 충돌 컴포넌트(예: CapsuleComponent, Mesh)를 선택하고 디테일 패널의 Collision 항목에서 Collision Presets 드롭다운으로 원하는 프로파일을 고릅니다. 여기서 Custom을 고르면 채널별 응답을 직접 조절할 수도 있습니다.
겹침과 부딪힘 이벤트 받기
충돌이 일어났을 때 로직을 실행하려면, 충돌 컴포넌트에서 이벤트를 켜고 그 이벤트에 함수를 바인딩해야 합니다. 다음은 폰이 들어오고 나갈 때 로그를 남기는 트리거 볼륨 액터입니다.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyTriggerVolume.generated.h"
class UBoxComponent; // UBoxComponent를 미리 선언
UCLASS()
class MYPROJECT_API AMyTriggerVolume : public AActor
{
GENERATED_BODY()
public:
AMyTriggerVolume();
protected:
virtual void BeginPlay() override;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Collision")
UBoxComponent* TriggerBox; // 트리거 볼륨 컴포넌트
// 오버랩 시작 이벤트 함수
UFUNCTION()
void OnOverlapBegin(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
// 오버랩 종료 이벤트 함수
UFUNCTION()
void OnOverlapEnd(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
};헤더에서 이벤트를 받을 두 함수 OnOverlapBegin, OnOverlapEnd에 UFUNCTION()을 붙였습니다. 뒤에서 쓰는 AddDynamic은 리플렉션으로 함수를 찾기 때문에, 바인딩할 함수는 반드시 UFUNCTION()으로 선언해야 합니다. 함수의 매개변수 목록도 델리게이트가 요구하는 형식과 정확히 같아야 합니다.
#include "MyTriggerVolume.h"
#include "Components/BoxComponent.h" // UBoxComponent를 위해
#include "GameFramework/Pawn.h"
AMyTriggerVolume::AMyTriggerVolume()
{
PrimaryActorTick.bCanEverTick = false;
TriggerBox = CreateDefaultSubobject<UBoxComponent>(TEXT("TriggerBox"));
RootComponent = TriggerBox; // 루트 컴포넌트로 설정
// 충돌 프로파일 설정 (예: "OverlapAllDynamic" 또는 커스텀 프로파일)
TriggerBox->SetCollisionProfileName(TEXT("OverlapAllDynamic"));
// 오버랩 이벤트 활성화
TriggerBox->SetGenerateOverlapEvents(true);
// BeginPlay에서 이벤트 바인딩
// TriggerBox->OnComponentBeginOverlap.AddDynamic(this, &AMyTriggerVolume::OnOverlapBegin);
// TriggerBox->OnComponentEndOverlap.AddDynamic(this, &AMyTriggerVolume::OnOverlapEnd);
}
void AMyTriggerVolume::BeginPlay()
{
Super::BeginPlay();
// 이 예제는 BeginPlay 이후의 이벤트를 구독합니다.
// 바인딩 전에 이미 성립한 겹침을 이 코드가 다시 통지하지는 않습니다.
TriggerBox->OnComponentBeginOverlap.AddDynamic(this, &AMyTriggerVolume::OnOverlapBegin);
TriggerBox->OnComponentEndOverlap.AddDynamic(this, &AMyTriggerVolume::OnOverlapEnd);
}
void AMyTriggerVolume::OnOverlapBegin(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
// 자신과 겹친 액터가 Pawn인지 확인 (플레이어 및 AI 포함)
if (OtherActor && OtherActor != this && OtherActor->IsA(APawn::StaticClass()))
{
UE_LOG(LogTemp, Warning, TEXT("Pawn entered trigger volume!"));
// 여기에 게임플레이 로직 구현 (예: 아이템 획득, 문 열기 등)
}
}
void AMyTriggerVolume::OnOverlapEnd(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)
{
if (OtherActor && OtherActor != this && OtherActor->IsA(APawn::StaticClass()))
{
UE_LOG(LogTemp, Warning, TEXT("Pawn exited trigger volume!"));
}
}생성자에서는 UBoxComponent를 루트로 만들고 OverlapAllDynamic 프로파일을 적용한 뒤, SetGenerateOverlapEvents(true)로 이 컴포넌트가 오버랩 이벤트를 만들도록 합니다. BeginPlay에서는 OnComponentBeginOverlap과 OnComponentEndOverlap에 AddDynamic()으로 두 함수를 바인딩합니다. 이 두 이름은 언리얼의 델리게이트(delegate)로, 함수를 바인딩해 두면 이벤트가 일어날 때 그 함수가 불립니다. 주석에 적힌 것처럼 이 예제는 BeginPlay 이후의 이벤트를 구독하므로, 바인딩하기 전에 이미 겹쳐 있던 상태를 다시 알려 주지는 않습니다.
콜백 안에서는 겹친 액터가 자기 자신이 아닌 폰인지 확인한 뒤 로그를 남깁니다. 물리적으로 막히는 부딪힘을 받고 싶다면 OnComponentHit 델리게이트를 같은 방식으로 바인딩합니다.
이 글의 MyCharacter 생성자 발췌는 ACharacter의 기본 캡슐과 메시가 있는 클래스를 기준으로 읽습니다. MyTriggerVolume의 헤더와 .cpp는 그와 별개인 액터 클래스 한 쌍이며, 프로젝트 이름과 API 매크로는 실제 클래스에 맞춥니다. 확인하려면 트리거를 부모로 만든 블루프린트를 맵에 배치하고, 플레이를 시작한 뒤 폰을 박스 안팎으로 움직여 바인딩 이후의 로그를 봅니다. 채널 응답을 고칠 때는 액터 이름이 아니라 실제로 겹치는 컴포넌트에 적용합니다.
두 컴포넌트의 응답이 만나면
UNREAL C++ · CH5-1
충돌 응답과 이벤트 알림의 조건을 함께 확인합니다
두 컴포넌트가 서로의 Object Type에 어떻게 응답하는지 먼저 봅니다. 응답 조합과 Overlap·Hit 콜백을 받기 위한 조건은 별도입니다.
응답 조합은 세 대안 중 하나입니다. 표의 활성 경로와 이벤트 수신 조건을 함께 확인하며, Overlap→Block으로 다음 단계가 진행한다는 연결은 없습니다.
| 상호 응답 | 결과 | 이벤트를 위한 추가 조건 |
|---|---|---|
| 한쪽이라도 Ignore | 이 쌍의 상호작용 무시 | Overlap·Hit 콜백 대상으로 삼지 않음 |
| Overlap + Overlap 또는 Block | 겹침으로 처리 | 쿼리 활성화와 양쪽 GenerateOverlapEvents, 올바른 콜백 연결 |
| Block + Block | 막힘으로 처리 | 실제 스윕 이동 또는 물리 접촉이 필요. 물리 시뮬레이션 Hit 알림은 보고할 컴포넌트의 설정도 필요 |
- 한쪽이라도 Ignore
- 결과: 이 쌍의 상호작용 무시이벤트를 위한 추가 조건: Overlap·Hit 콜백 대상으로 삼지 않음
- Overlap + Overlap 또는 Block
- 결과: 겹침으로 처리이벤트를 위한 추가 조건: 쿼리 활성화와 양쪽 GenerateOverlapEvents, 올바른 콜백 연결
- Block + Block
- 결과: 막힘으로 처리이벤트를 위한 추가 조건: 실제 스윕 이동 또는 물리 접촉이 필요. 물리 시뮬레이션 Hit 알림은 보고할 컴포넌트의 설정도 필요
기본 응답 조합을 비교한 표입니다. 프리셋 이름만 보지 말고 런타임의 쿼리·물리 참여와 두 컴포넌트의 실제 설정을 확인합니다. 구독 전 사건을 콜백이 다시 통지하지는 않습니다.
위 그림은 두 컴포넌트의 응답이 어떻게 조합되는지, 그리고 이벤트를 받으려면 무엇이 더 필요한지를 보여 줍니다. 컴포넌트 A는 B의 Object Type에 대해, B는 A의 Object Type에 대해 각자 응답을 가지고 있고, 쿼리나 물리 경로가 활성화되어 있을 때 두 응답이 조합되어 결과가 정해집니다. 결과는 세 가지 가운데 하나입니다. 한쪽이라도 Ignore이면 이 쌍은 무시되고, 한쪽이 Overlap이고 다른 쪽이 Overlap이나 Block이면 겹침으로 처리되며, 양쪽이 모두 Block일 때만 막힘으로 처리됩니다. 세 출력은 응답에 따른 대안일 뿐, Overlap 다음에 Block으로 진행하는 순서가 아닙니다.
그림의 표는 각 결과에서 이벤트를 받기 위한 추가 조건을 정리합니다. Ignore인 쌍은 Overlap이나 Hit 콜백의 대상이 되지 않습니다. 겹침으로 처리되는 쌍에서 콜백을 받으려면 쿼리가 활성화되어 있어야 하고, 양쪽 컴포넌트의 GenerateOverlapEvents가 켜져 있어야 하며, 콜백이 올바르게 연결되어 있어야 합니다. 막힘으로 처리되는 쌍은 실제로 스윕 이동이나 물리 접촉이 일어나야 Hit가 생기고, 물리 시뮬레이션의 Hit 알림은 알림을 보고할 컴포넌트의 설정도 필요합니다. 그림 아래의 설명처럼 프리셋 이름만 보지 말고 런타임의 쿼리, 물리 참여와 두 컴포넌트의 실제 설정을 확인하며, 구독하기 전에 일어난 사건은 콜백이 다시 알려 주지 않습니다.
예를 들어 플레이어 캡슐을 Pawn, 문 앞의 감지 박스를 WorldDynamic으로 분류했다고 합시다. 박스는 Pawn에 Overlap으로, 캡슐은 WorldDynamic에 Block으로 응답하더라도, 한쪽이 Overlap이므로 이 쌍은 겹침으로 처리됩니다. 하지만 이 설정만으로 진입 로그가 나오는 것은 아닙니다. 두 컴포넌트가 쿼리에 참여하는지, 양쪽이 오버랩 이벤트를 만드는지, 받을 함수가 연결되었는지도 확인해야 합니다. 문짝처럼 실제로 이동을 막아야 하는 물체는 양쪽이 모두 Block이 되도록 따로 설계합니다.
정리
- 충돌 응답은 막는 Block, 겹침만 감지하는 Overlap, 아무 반응도 하지 않는 Ignore의 세 가지입니다.
- 오브젝트 채널은 물체의 종류를, 트레이스 채널은 트레이스의 용도를 나타내며, 프로젝트 설정의
Collision에서 커스텀 채널을 만듭니다. - 충돌 프로파일은 채널별 응답을 묶은 규칙이며, C++에서는
SetCollisionProfileName(), 블루프린트에서는Collision Presets로 컴포넌트에 적용합니다. SetCollisionEnabled()는 쿼리와 물리 가운데 어느 경로에 참여할지 정합니다.- 두 컴포넌트의 응답은 한쪽이라도 Ignore면 무시, 한쪽이 Overlap이면 겹침, 둘 다 Block일 때만 막힘이 됩니다.
- 오버랩 이벤트를 받으려면 양쪽의
GenerateOverlapEvents, 쿼리 참여,UFUNCTION()으로 선언한 함수의AddDynamic바인딩이 모두 필요하며, 바인딩 전에 일어난 사건은 다시 알려 주지 않습니다.
연습 문제
1. 로그가 나오지 않는 트리거
박스와 캡슐의 응답을 서로 Overlap으로 맞췄지만, 캡슐의 GenerateOverlapEvents는 꺼져 있습니다. BeginPlay 이후 박스에 들어갔는데 로그가 나오지 않습니다. 박스 쪽 응답을 Block으로 바꾸면 해결될까요?
해설 보기
해결되지 않습니다. 박스의 응답을 Block으로 바꿔도 캡슐은 여전히 Overlap이므로 이 쌍은 겹침으로 처리되고, 캡슐의 이벤트 생성 조건도 그대로 꺼져 있습니다. 응답을 바꾸는 것과 이벤트를 만드는 조건은 별개입니다.
실제로 겹치는 양쪽 컴포넌트에서 쿼리 참여, 응답, GenerateOverlapEvents를 모두 맞추고, 함수를 바인딩한 시점과 연결이 올바른지 확인해야 합니다.
2. 메시만 바꿨을 때
트리거가 반응하지 않아 캐릭터 메시의 충돌 설정만 Overlap과 이벤트 생성으로 바꿨습니다. 실제로 박스와 겹치는 것은 캐릭터의 캡슐입니다. 이 선택으로 문제가 풀릴까요?
해설 보기
풀리지 않을 가능성이 큽니다. 메시와 캡슐은 서로 다른 컴포넌트이고, 충돌은 컴포넌트 단위로 판정됩니다. 메시의 설정을 바꿔도 캡슐의 응답과 이벤트 생성 설정은 그대로입니다.
박스와 실제로 겹치는 캡슐의 설정을 확인하고 고쳐야 합니다. 응답을 고칠 때는 액터 이름이 아니라 겹치는 컴포넌트를 기준으로 봅니다.
3. 응답 조합 계산하기
컴포넌트 A는 B의 채널에 Block, B는 A의 채널에 Ignore로 응답합니다. 이 두 컴포넌트가 만나면 어떻게 처리될까요? B의 응답을 Overlap으로 바꾸면 어떻게 될까요?
해설 보기
한쪽이라도 Ignore이면 그 쌍은 무시되므로, 처음 설정에서는 A가 Block이어도 서로 통과하고 아무 이벤트도 생기지 않습니다.
B를 Overlap으로 바꾸면 한쪽이 Overlap이므로 이 쌍은 겹침으로 처리됩니다. 이때도 A가 막히지는 않으며, 오버랩 이벤트를 받으려면 양쪽의 이벤트 생성 설정과 콜백 연결이 필요합니다. 막히게 하려면 양쪽이 모두 Block이어야 합니다.
충돌 응답의 조합 규칙과 채널, 프리셋 설정은 Epic의 Collision Overview 문서에서 확인할 수 있습니다.
다음 글 트리거 박스와 오버랩 이벤트에서는 오버랩 이벤트로 아이템 습득처럼 플레이어가 영역에 들어왔을 때의 동작을 만들어 봅니다.