수집 아이템은 가장 기본적인 상호작용이다
게임에서 상호작용은 "플레이어가 어떤 대상에 영향을 주고, 그 대상이 반응하는 것"입니다. 문을 열고, 버튼을 누르고, 아이템을 줍고, 함정에 닿아 피해를 입는 일이 모두 상호작용입니다.
이번 장에서는 가장 많이 쓰이는 패턴인 수집 아이템을 만듭니다. 플레이어가 동전에 닿으면 점수가 올라가고, 동전은 사라집니다. 구조는 단순하지만 거의 모든 장르에 응용됩니다.
예를 들어 다음과 같이 바꿀 수 있습니다.
어드벤처 게임: 열쇠를 먹으면 문을 열 수 있음
액션 게임: 회복 아이템을 먹으면 체력이 회복됨
플랫포머 게임: 코인을 먹으면 점수가 오름
퍼즐 게임: 특정 조각을 모으면 장치가 작동함
이 장에서 만들 흐름은 다음과 같습니다.
동전 Actor가 회전한다.
플레이어가 동전에 닿는다.
Overlap 이벤트가 실행된다.
플레이어의 점수가 올라간다.
동전이 사라진다.
중요한 점은 총점은 아이템이 아니라 플레이어 쪽에서 관리한다는 것입니다. 아이템은 자신이 몇 점짜리인지, 즉 ScoreValue만 알고 있으면 됩니다. 실제로 현재 점수가 몇 점인지는 플레이어가 들고 있는 구조가 좋습니다. 그래야 아이템 수가 늘어나도 블루프린트가 복잡해지지 않습니다.
AI 생성 이미지
Collision과 Overlap 이해하기
아이템 수집을 만들려면 먼저 Collision을 이해해야 합니다. Collision은 오브젝트끼리 서로 닿거나 막히는 방식을 정하는 설정입니다. 한국어로는 보통 "충돌"이라고 부릅니다.
언리얼에서 충돌 반응은 크게 두 가지로 생각하면 쉽습니다.
Block: 서로 막는다. 벽, 바닥, 장애물에 사용한다.
Overlap: 서로 통과하지만 닿았다는 사실은 감지한다. 아이템, 트리거 영역에 사용한다.
동전은 플레이어를 막으면 안 됩니다. 플레이어가 동전 앞에서 멈춰 버리면 어색합니다. 대신 플레이어가 동전을 통과하면서 "닿았다"는 사실만 알아내면 됩니다. 그래서 수집 아이템에는 보통 Overlap을 사용합니다.
정리하면 다음과 같습니다.
| 상황 | 추천 반응 |
|---|---|
| 바닥 위를 걸어야 함 | Block |
| 벽을 통과하면 안 됨 | Block |
| 동전에 닿으면 획득 | Overlap |
| 목표 지점에 들어가면 클리어 | Overlap |
| 위험 구역에 들어가면 피해 | Overlap |
이번 장의 핵심은 "동전은 플레이어를 막지 않고, 닿았다는 이벤트만 발생시킨다"입니다.
Coin Blueprint 준비하기
6장에서 BP_PickupCoin을 만들었다면 그대로 사용합니다. 아직 없다면 새로 만들어도 됩니다.
Content Browser에서 다음 순서로 진행합니다.
Blueprints폴더를 엽니다.마우스 오른쪽 버튼을 누릅니다.
Blueprint Class를 선택합니다.
부모 클래스로 Actor를 선택합니다.
이름을
BP_PickupCoin으로 지정합니다.
이제 BP_PickupCoin을 더블 클릭해 블루프린트 에디터를 엽니다.
왼쪽 Components 패널에서 다음 컴포넌트를 구성합니다.
DefaultSceneRoot: 기본 기준점CoinMesh: 화면에 보일 동전 모양 Static MeshCollision: 플레이어가 닿았는지 감지할 영역
구성 방법은 다음과 같습니다.
Add 버튼을 누르고
Static Mesh를 추가합니다.이름을
CoinMesh로 바꿉니다.Details 패널의 Static Mesh에서 적당한 메시를 선택합니다. 지금은
Sphere,Cylinder같은 기본 메시를 써도 됩니다.CoinMesh의 Collision Presets는NoCollision으로 바꿉니다.다시 Add 버튼을 누르고
Sphere Collision을 추가합니다.이름을
Collision으로 바꿉니다.Collision이 동전을 충분히 감싸도록 크기를 조절합니다.
동전 모양이 꼭 완벽할 필요는 없습니다. 처음에는 작은 구체나 납작한 원기둥이어도 충분합니다. 중요한 것은 "보이는 부분"과 "닿음을 감지하는 부분"을 나누어 생각하는 습관입니다.
CoinMesh는 플레이어에게 보이는 외형입니다. 그래서 충돌을 꺼 두어도 됩니다. 반대로 Collision은 실제로 플레이어가 닿았는지 확인하는 감지 범위입니다. 만약 CoinMesh에도 충돌이 켜져 있으면, 동전은 Overlap으로 만들었는데도 보이는 메시가 플레이어를 막는 일이 생길 수 있습니다.
회전하는 동전 만들기
수집 아이템은 가만히 놓여 있어도 작동합니다. 하지만 살짝 회전하면 플레이어가 "저건 먹을 수 있는 아이템이구나"라고 쉽게 알아봅니다.
가장 간단한 방법은 Rotating Movement Component를 사용하는 것입니다. 이 컴포넌트는 Actor를 계속 회전시켜 주는 부품입니다. 직접 Event Tick에 회전 로직을 만들 수도 있지만, 회전처럼 반복되는 기본 동작은 준비된 컴포넌트를 쓰면 블루프린트가 깔끔해집니다.
BP_PickupCoin에서 다음을 진행합니다.
Components 패널에서 Add를 누릅니다.
Rotating Movement를 검색해 추가합니다.Details 패널에서 Rotation Rate를 찾습니다.
Z 값을
120정도로 입력합니다.
Z축 회전은 위에서 내려다봤을 때 빙글빙글 도는 회전입니다. 플레이해 보고 너무 빠르면 60, 너무 느리면 180처럼 조절합니다.
여기서 중요한 습관이 있습니다. 값은 한 번에 많이 바꾸지 말고 하나씩 바꾼 뒤 Play로 확인하세요. 회전 속도, 크기, 위치를 동시에 바꾸면 무엇 때문에 느낌이 달라졌는지 알기 어렵습니다.
플레이어 점수 변수 만들기
이제 점수를 저장할 곳이 필요합니다. 이번 책에서는 간단하게 BP_ThirdPersonCharacter에 점수를 저장하겠습니다. 나중에 게임이 커지면 GameMode, PlayerState 같은 클래스로 옮길 수 있지만, 지금은 플레이어가 아이템을 먹는 구조를 이해하는 것이 먼저입니다.
BP_ThirdPersonCharacter를 엽니다.
왼쪽 My Blueprint 패널에서 Variables 옆의
+버튼을 누릅니다.변수 이름을
Score로 지정합니다.변수 타입을
Integer로 설정합니다.기본값은
0으로 둡니다.
Integer는 정수입니다. 0, 1, 2, 10처럼 소수점이 없는 숫자를 저장할 때 사용합니다. 점수나 아이템 개수처럼 딱 떨어지는 값에 잘 맞습니다.
이제 점수를 올리는 Custom Event를 만듭니다.
Event Graph의 빈 곳에서 마우스 오른쪽 버튼을 누릅니다.
Custom Event를 검색해 추가합니다.이름을
AddScore로 바꿉니다.Details 패널에서 Inputs의
+를 눌러 입력값을 추가합니다.입력 이름을
Amount, 타입을Integer로 지정합니다.
블루프린트 흐름은 다음과 같이 연결합니다.
AddScore실행ScoreGetAmount더하기결과를
ScoreSetPrint String으로 현재 점수 출력
Print String에는 새로 저장된 Score를 문자열로 바꿔 연결해도 되고, 간단히 Score Added 같은 문장을 출력해도 됩니다. 아직 HUD를 만들지 않았기 때문에, 지금은 화면 왼쪽 위에 디버그 메시지로 점수가 오르는지 확인하면 충분합니다.
다음 장에서 UMG로 HUD를 만들면 이 Score 값을 화면 UI에 표시할 수 있습니다.
동전에 점수 값 넣기
모든 아이템이 1점일 수도 있지만, 나중에는 5점짜리 보석, 10점짜리 별, 체력 회복 아이템도 만들 수 있습니다. 그래서 동전 블루프린트 안에 점수 값을 변수로 만들어 둡니다.
BP_PickupCoin을 엽니다.
My Blueprint 패널에서 변수
+버튼을 누릅니다.이름을
ScoreValue로 지정합니다.타입을
Integer로 설정합니다.기본값을
1로 둡니다.Details 패널에서 Instance Editable을 켭니다.
Instance Editable은 레벨에 배치한 각각의 동전마다 값을 따로 바꿀 수 있게 해 주는 설정입니다. 예를 들어 같은 BP_PickupCoin을 사용하더라도 어떤 동전은 1점, 어떤 동전은 5점으로 만들 수 있습니다.
이 습관이 유지보수에 중요합니다. 아이템마다 새 블루프린트를 계속 만들기보다, 하나의 블루프린트에 변수만 다르게 주면 관리가 쉬워집니다.
Overlap 이벤트로 획득 만들기
이제 동전에 닿았을 때 실행될 이벤트를 만듭니다.
BP_PickupCoin의 Components 패널에서 Collision을 선택합니다. Details 패널에서 Collision 설정을 확인합니다.
다음처럼 맞춥니다.
Generate Overlap Events: 켜기
Collision Presets:
OverlapOnlyPawn또는 CustomPawn에 대한 반응: Overlap
Pawn은 플레이어 캐릭터처럼 조종 가능한 대상을 뜻합니다. Third Person 템플릿의 캐릭터도 Pawn 계열입니다.
여기서 다시 한 번 구분해 보겠습니다. CoinMesh는 보이기만 하는 부분이므로 NoCollision으로 두고, Collision 컴포넌트가 Overlap을 담당하게 합니다. 이렇게 역할을 나누면 나중에 메시 모양을 바꾸더라도 상호작용 범위는 따로 조절할 수 있습니다.
이제 이벤트를 추가합니다.
Collision컴포넌트를 선택한 상태에서 Details 패널 아래쪽으로 이동합니다.Events 항목에서 On Component Begin Overlap 옆의
+버튼을 누릅니다.Event Graph에 이벤트 노드가 생성됩니다.
노드 흐름은 다음처럼 만듭니다.
OnComponentBeginOverlap실행Other Actor에서Cast To BP_ThirdPersonCharacterCast 성공 시
AddScore호출AddScore의 Target에는 Cast 결과인As BP_ThirdPersonCharacter연결Amount에ScoreValue연결Destroy Actor실행
여기서 Cast To BP_ThirdPersonCharacter는 "겹친 대상이 우리가 아는 플레이어 캐릭터가 맞는지 확인하는 과정"입니다. 다른 물체가 동전에 닿았을 때 점수가 오르면 안 되기 때문에 확인이 필요합니다.
Destroy Actor는 현재 동전 Actor를 레벨에서 제거합니다. 그래서 플레이어가 같은 동전을 여러 번 먹을 수 없습니다. 이 노드는 점수를 올린 뒤 마지막에 실행하는 흐름으로 두면 이해하기 쉽습니다.
전체 흐름을 말로 읽으면 이렇습니다.
"Collision 영역에 무언가 들어왔다. 그 대상이 플레이어 캐릭터라면, 플레이어의 AddScore를 실행한다. 동전의 ScoreValue만큼 점수를 올린다. 그리고 이 동전은 사라진다."
블루프린트는 노드가 많아 보일 수 있지만, 문장으로 바꾸면 단순합니다. 막힐 때는 항상 노드를 문장으로 읽어 보세요.
레벨에 동전 배치하고 테스트하기
이제 BP_PickupCoin을 레벨에 배치합니다.
Content Browser에서
BP_PickupCoin을 찾습니다.Viewport의 바닥 위로 드래그합니다.
위치를 조절해 플레이어가 지나갈 길에 놓습니다.
Alt를 누른 채 이동하거나 Ctrl+C, Ctrl+V로 여러 개 복제합니다.저장한 뒤 Play를 누릅니다.
플레이어가 동전에 닿았을 때 다음을 확인합니다.
동전이 회전하는가?
동전에 닿으면 화면에 점수 메시지가 나오는가?
동전이 사라지는가?
다른 동전을 먹으면 점수가 계속 증가하는가?
플레이어가 동전에 막히지 않고 자연스럽게 지나가는가?
여러 개를 배치한 뒤 일부 동전의 ScoreValue를 바꿔 봅니다.
레벨에 배치된 동전 하나를 선택하고 Details 패널에서 ScoreValue를 5로 바꿉니다. Play 후 그 동전을 먹었을 때 점수가 5만큼 오르면 제대로 만든 것입니다.
키를 눌러 줍는 방식으로 바꾸고 싶다면
이번 기본 예제는 닿으면 바로 획득하는 방식입니다. 하지만 게임에 따라서는 가까이 간 뒤 E 키를 눌러 줍고 싶을 수 있습니다.
이 경우 구조가 조금 달라집니다.
동전 근처에 들어오면 "주울 수 있는 상태"로 표시한다.
플레이어가
E키를 누르면 현재 가까운 아이템을 획득한다.아이템은 그때 점수를 올리고 사라진다.
8장에서 배운 Enhanced Input을 사용하면 IA_Interact 같은 Input Action을 만들고, E 키를 매핑할 수 있습니다. 다만 처음부터 이 방식으로 가면 변수와 참조가 조금 늘어납니다. 그래서 지금은 자동 수집을 먼저 완성하고, 이후 문 열기나 NPC 대화 같은 상호작용에서 "키를 눌러 실행"하는 방식을 확장하는 편이 안전합니다.
실전에서도 두 방식은 자주 함께 쓰입니다.
코인, 회복 구슬: 닿으면 자동 획득
문, 상자, 대화: 가까이 가서 키 입력
아이템의 성격에 맞게 선택하면 됩니다.
아이템이 반응하지 않을 때 확인할 것
수집 아이템이 작동하지 않을 때 대부분은 Collision 설정 문제입니다. 아래 순서대로 확인하세요.
1. Generate Overlap Events가 켜져 있는가
BP_PickupCoin의 Collision 컴포넌트를 선택하고 Generate Overlap Events가 켜져 있는지 확인합니다. 이 옵션이 꺼져 있으면 Overlap 이벤트가 발생하지 않습니다.
플레이어 캐릭터의 Capsule Component 쪽에서도 Overlap을 받을 수 있어야 합니다. Third Person 템플릿은 기본적으로 큰 문제가 없지만, 설정을 많이 바꿨다면 캐릭터 Capsule도 확인합니다.
2. Collision Preset이 Block으로 되어 있지 않은가
동전의 Collision 컴포넌트가 BlockAll처럼 되어 있으면 플레이어를 막을 수 있습니다. 수집 아이템은 보통 OverlapOnlyPawn이 적합합니다.
Custom으로 설정했다면 Pawn 항목이 Overlap인지 확인하세요.
3. CoinMesh의 충돌이 켜져 있지 않은가
감지용 Collision은 Overlap으로 잘 설정했는데도 플레이어가 동전에 걸리는 경우가 있습니다. 이때는 CoinMesh의 충돌이 켜져 있는지 확인해야 합니다.
CoinMesh는 보이는 외형만 담당하게 두고, Collision Presets를 NoCollision으로 설정하는 편이 가장 단순합니다. 실제 획득 판정은 Sphere Collision이나 Box Collision 같은 감지용 컴포넌트에서 처리합니다.
4. 이벤트를 CoinMesh에 만들었는가, Collision에 만들었는가
Overlap 이벤트는 감지용 컴포넌트에 만드는 것이 좋습니다. CoinMesh의 충돌이 꺼져 있는데 CoinMesh에 이벤트를 만들면 반응하지 않을 수 있습니다.
처음에는 Sphere Collision이나 Box Collision을 따로 두고, 그 컴포넌트의 OnComponentBeginOverlap을 사용하는 습관을 들이세요.
5. Cast 대상이 맞는가
Third Person 템플릿의 캐릭터 이름이 프로젝트에 따라 다를 수 있습니다. Cast To BP_ThirdPersonCharacter가 실패하면 AddScore가 실행되지 않습니다.
확인 방법은 간단합니다. Cast 실패 핀에 Print String을 연결해 Not Player 같은 메시지를 출력해 보세요. 메시지가 나온다면 실제 플레이어 캐릭터 클래스 이름을 다시 확인해야 합니다.
6. Destroy Actor가 너무 먼저 실행되지 않는가
Destroy Actor를 AddScore보다 먼저 실행하면 이후 흐름이 의도대로 보이지 않을 수 있습니다. 기본 흐름은 점수를 올린 뒤 동전을 제거하는 순서가 좋습니다.
아이템이 많아져도 관리하기 쉬운 구조
수집 아이템은 금방 많아집니다. 그래서 처음부터 조금만 정리해 두면 나중에 편합니다.
첫째, 점수는 플레이어가 관리합니다. 동전마다 따로 총점을 들고 있으면 어떤 값이 진짜 점수인지 헷갈립니다.
둘째, 아이템은 자기 값만 가집니다. ScoreValue처럼 "이 아이템을 먹으면 몇 점인가"만 들고 있으면 충분합니다.
셋째, 레벨에 배치한 인스턴스에서 값을 바꿀 수 있게 합니다. Instance Editable을 켜 두면 같은 블루프린트로 다양한 아이템을 만들 수 있습니다.
넷째, 이름을 분명하게 붙입니다.
BP_PickupCoinBP_PickupGemScoreValueAddScoreCollisionCoinMesh
이름이 분명하면 블루프린트를 다시 열었을 때 흐름을 빠르게 파악할 수 있습니다.
나중에 아이템 종류가 더 많아지면 BP_PickupBase라는 부모 블루프린트를 만들고, 코인과 보석이 그 기능을 물려받게 만들 수도 있습니다. 하지만 지금 당장 부모 구조까지 만들 필요는 없습니다. 초보 단계에서는 하나의 아이템을 제대로 완성하고, 복제와 변수 변경으로 확장하는 편이 더 이해하기 쉽습니다.
이번 장에서 만든 흐름 정리
이번 장에서는 플레이어가 동전을 수집하고 점수가 올라가는 기본 상호작용을 만들었습니다.
핵심은 세 가지입니다.
수집 아이템은 플레이어를 막지 않고 Overlap으로 닿음을 감지한다.
점수는 플레이어가 관리하고, 아이템은 자신이 몇 점짜리인지 값만 가진다.
Overlap 이벤트에서 플레이어 확인, 점수 증가, 아이템 제거를 순서대로 실행한다.
이 구조를 이해하면 많은 기능을 만들 수 있습니다. 동전을 체력 아이템으로 바꾸면 회복 시스템이 되고, 목표 지점으로 바꾸면 스테이지 클리어 조건이 됩니다. 위험 구역으로 바꾸면 피해 판정도 만들 수 있습니다.
다음 장에서는 지금 Print String으로 확인한 점수를 실제 화면 UI로 표시합니다. 플레이어가 아이템을 먹을 때 점수가 HUD에 올라가면, 게임이 훨씬 완성된 느낌을 주기 시작합니다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.