C++와 Unreal Engine으로 3D 게임 개발

C++와 Unreal Engine으로 3D 게임 개발 3-2

jh009 2026. 6. 19. 15:04

1. 충돌 이벤트로 획득되는 아이템 구현하기

충돌 (Collision) 이벤트 기반 아이템 획득 방식 이해하기

플레이어가 가까이 다가가기만 해도 자동으로 획득시키고 싶다면 콜리전 (충돌) 이벤트를 사용

 

충돌 영역 (Collision Volume)

  • 아이템 액터 주변에 SphereComponent 나 BoxComponent 같은 충돌 컴포넌트를 붙여둠
  • 플레이어가 이 영역 안에 들어오면 Overlap 이벤트가 발생, 이를 감지해 아이템 획득 로직을 실행

Overlap 이벤트 / Hit 이벤트

 

Overlap 이벤트

  • 물리적으로 부딪히는 것 없이 액터들이 서로 겹치기 시작했을 때 발생
  • 아이템 획득, 트리거 존 감지 같은 경우에 주로 사용

Hit 이벤트

  • 실제 물리 충돌이 일어날 때 발생(예: 탄환이 벽에 부딪히는 장면)
  • 아이템 획득처럼 겹침만 감지하면 되는 경우에는 Overlap 이벤트가 더욱 적합함

아이템 획득 처리

  • 충돌 영역 안에 플레이어가 들어오면 (Overlap 시작 시점), 아이템이 즉시 사라지거나 DestroyItem(), 점수를 올리거나 체력을 회복하는 등 다양한 로직을 실행

기본 아이템 클래스(BaseItem)에 충돌 컴포넌트와 메시 컴포넌트 추가

 

BaseItem 클래스는 모든 아이템(코인, 포션, 무기 등)에 공통으로 필요한 기능을 담는 부모 클래스

 

다음과 같은 컴포넌트와 함수를 포함

 

SceneComponent* Scene;

액터(아이템)의 루트 컴포넌트로 사용

 

USphereComponent* Collision;

플레이어가 범위 안에 들어오면 Overlap 이벤트를 발생시킬 충돌 컴포넌트

 

UStaticMeshComponent* StaticMesh;

아이템이 월드에 표시될 때, 시각적인 모습을 담당

BaseItem.h


CollisionComponent->SetCollisionProfileName(TEXT("OverlapAllDynamic"));

SphereComponent가 다른 액터와 겹칠 때만 Overlap 이벤트를 발생시키도록 설정

물리적인 충돌은 발생 X

 

OnComponentBeginOverlap.AddDynamic(this, &ABaseItem::OnItemOverlap);

플레이어가 범위 안에 들어올 때 자동으로 OnItemOverlap을 호출

BaseItem.cpp


ItemInterface 인터페이스 함수 시그니처 수정

ItemInterface.h


2. 아이템 Blueprint 생성 및 콜리전/메시 설정하기

아이템 Blueprint 생성 및 Static Mesh 설정

 

C++ 클래스 기반 블루프린트 생성

C++로 작성한 클래스 (BigCoinItem, SmallCoinItem, MineItem, HealingItem) Blueprint를 생성

 

Static Mesh 및 머티리얼 설정

Components 패널 StaticMesh (UStaticMeshComponent) 선택 후 에셋 설정

Material 적용하기

 

Components → Scene → Details 패널 → Tranform 에서 머티리얼 크기 조절


콜리전 범위 (Sphere Radius) 조정

Components 패널 → SphereComponent 선택

기본적으로 ABaseItem 클래스 내에서 충돌 컴포넌트가 생성되어 있을 것임 → BP 상속 시 그대로 노출

 

Details 패널에서 크기 조정

Sphere Radius 값을 변경하면 충돌 범위를 직관적으로 조절 가능


아이템 액터의 콜리전 프리셋 설정

주요 프리셋 옵션

  1. NoCollision
    • 충돌을 전혀 감지하지 않으므로, Overlap 또는 Hit 이벤트가 발생 X
    • 단순 배경 오브젝트(하늘, 장식용 액터 등)
  2. BlockAll
    • 모든 객체와 충돌하여 막게 됨. 물리적으로 충돌하지만, Overlap 이벤트는 발생 X
    • 벽, 바닥 같은 고정된 장치 
  3. OverlapAll
    • 모든 객체와 Overlap 이벤트를 발생
    • 트리거 존, 감지 센서, 투명한 오브젝트
  4. BlockAllDynamic
    • 움직이는 (Dynamic) 객체만 충돌을 막음. 고정된 객체와는 충돌 X
    • 움직이는 플레이어나 물리 오브젝트와 상호작용하는 문, 벽. 고정된 환경 요소와는 무관하게 작동.
  5. OverlapAllDynamic
    • 움직이는 (Dynamic) 객체와 Overlap 이벤트를 발생
    • 플레이어가 근처에 있는지 확인하는 아이템, 센서. Overlap 이벤트가 필요하지만, 물리 충돌이 필요 없는 경우.
  6. Pawn
    • 플레이어나 AI처럼 Pawn 타입 객체를 대상으로 충돌을 감지하거나 막음
    • 플레이어 전용 문, AI 전용 센서
  7. Custom
    • 각 채널에 대해 충돌 응답(Overlap, Block, Ignore)을 객체별로 세부적으로 설정 가능

물리 반응 여부 (Collision Enabled)

  • NoCollision: 충돌 비활성화
  • Query Only: Overlap, Hit 등 충돌 이벤트는 감지하지만, 물리적으로 튕기거나 밀리는 반응은 없음
  • Physics Only: 물리 반응만 일어나고, 이벤트 (Overlap/Hit)는 발생하지 않음
  • Query and Physics: 충돌 이벤트 + 물리 반응 모두 활성화

3. 아이템 클래스 충돌 처리 구현하기

CoinItem.h

코인 아이템 공통 부모 클래스 충돌 처리

CoinItem: 코인 아이템이 가져야 할 공통 기능(점수) 정의

실제 점수 획득은 ActivateItem 함수에서 처리

 

CoinItem.cpp

PointValue

Blueprint에서도 값을 바꿀 수 있음

스몰 코인은 10점, 빅 코인은 50점처럼 다양한 코인을 쉽게 파생시킬 수 있음

CoinItem.h / CoinItem.cpp


빅 코인, 스몰 코 아이템 충돌 처리

BigCoinItem.cpp / SmallCoinItem.cpp


힐링 아이템 충돌 처리

HealingItem.h / HealingItem.cpp


지뢰 아이템 충돌 처리

 

MineItem.h

bIsActivated: 이미 지뢰가 발동되었는지 여부를 체크

ActivateItem: 발동 이후 타이머를 설정하고, 폭발 함수를 스케줄링

Explode: 타이머가 만료되었을 때 실제 폭발 처리를 담당

 

MineItem.cpp

ActivateItem

GetWorld()->GetTimerManager().SetTimer 를 사용 → 5초 후 Explode()가 자동 실행되도록 지연 호출 (Delayed Call)

폭발 처리 후 DestroyItem()을 호출해 지뢰 아이템 자체를 제거

MineItem.h / MineItem.cpp


콜리전 비주얼 디버깅

언리얼 에디터 → Alt + C (콜리전 디버그 모드) 

Capsule Component, Sphere, Box 같은 다른 콜리전 영역도 시각적으로 확인 가능함

콜리전이 비정상적으로 설정되어 있을 경우, 빠르게 확인 가능