08/19 FPS 게임 설계, AI 적용 및 씬구성
댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.
오늘 실습 : FPS 게임 제작하기
CharacterController 컴포넌트

CharacterController는 플레이어 캐릭터의 이동과 충돌 처리를 쉽게 구현하기 위한 컴포넌트입니다.
Rigidbody 없이도 벽, 바닥, 경사면, 계단 등의 충돌을 처리할 수 있으며, 주로 FPS·TPS 캐릭터 이동에 사용됩니다.
| 필드 | 현재 값 | 의미 |
|---|---|---|
| Slope Limit | 45 | 캐릭터가 올라갈 수 있는 최대 경사각입니다. 단위는 도(°)이며, 현재는 45°보다 가파른 경사면은 정상적으로 올라가기 어렵습니다. |
| Step Offset | 0.3 | 캐릭터가 별도의 점프 없이 자동으로 넘어갈 수 있는 단차의 최대 높이입니다. 현재는 약 0.3 Unity Unit 높이의 계단이나 턱을 올라갈 수 있습니다. |
| Skin Width | 0.08 | CharacterController의 캡슐 표면에 두는 충돌 여유 폭입니다. 충돌 판정을 너무 빡빡하게 하지 않아 캐릭터가 벽이나 바닥에 걸리거나 떨리는 현상을 줄이는 데 사용됩니다. |
| Min Move Distance | 0.001 | 이 값보다 작은 이동량은 무시합니다. 매우 작은 움직임으로 인한 불필요한 충돌 계산이나 미세한 떨림을 줄이는 용도입니다. |
| Center | (0, 0, 0) | CharacterController의 캡슐 중심 위치입니다. GameObject의 로컬 좌표를 기준으로 합니다. |
| Radius | 0.5000001 | 캡슐 형태 충돌체의 반지름입니다. 캐릭터의 좌우 폭을 결정합니다. 실질적으로 약 0.5라고 보면 됩니다. |
| Height | 2 | 캡슐 형태 CharacterController의 전체 높이입니다. 현재 Radius가 약 0.5이므로 일반적인 사람형 캐릭터 비율에 가까운 설정입니다. |
| Layer Override Priority | 0 | Layer Override 설정이 서로 충돌할 경우 어느 쪽 설정을 우선할지 결정하는 우선순위 값입니다. |
| Include Layers | Nothing | CharacterController가 충돌 상호작용 대상으로 추가로 포함할 Layer를 지정합니다. 현재는 별도로 추가된 Layer가 없습니다. |
| Exclude Layers | Nothing | CharacterController의 충돌 상호작용에서 제외할 Layer를 지정합니다. 현재는 별도로 제외된 Layer가 없습니다. |
미니맵 만들기
Unity에서 미니맵은 미니맵 전용 카메라, Render Texture, UI Canvas를 조합해서 구현할 수 있습니다. 기본 원리는 플레이어 위쪽에 별도의 카메라를 배치해 맵을 내려다보게 하고, 그 카메라가 촬영한 화면을 Render Texture에 출력한 뒤 UI에 표시하는 방식입니다.
먼저 플레이어 위쪽에 미니맵 전용 Camera를 하나 배치합니다. 카메라는 지면을 위에서 내려다보도록 회전시키고, 플레이어를 따라 이동하도록 설정합니다.
미니맵은 원근감이 크게 필요하지 않기 때문에 일반적으로 Camera의 Projection을 Orthographic으로 설정합니다. Orthographic Size를 조절하면 미니맵에 표시되는 범위를 넓히거나 좁힐 수 있습니다.
필요하다면 Culling Mask를 이용해 미니맵에서 필요 없는 오브젝트를 제외하고, 맵 지형이나 플레이어 아이콘 등 필요한 오브젝트만 렌더링할 수도 있습니다.
Render Texture는 카메라가 촬영한 결과를 화면에 바로 출력하지 않고, 하나의 Texture에 저장할 수 있게 해주는 기능입니다.
일반적인 Camera는 촬영 결과를 게임 화면에 바로 출력하지만, 미니맵 카메라는 다음과 같은 흐름으로 동작합니다.
미니맵 Camera ↓ Render Texture ↓ UI의 Raw Image ↓ 게임 화면의 미니맵
즉, Render Texture는 카메라 화면을 UI나 다른 오브젝트에서 사용할 수 있도록 중간에서 받아주는 이미지 공간이라고 이해하면 됩니다. 미니맵뿐만 아니라 CCTV 화면, 거울, 포털 화면, 게임 내 모니터 등을 만들 때도 활용됩니다.
Project 창에서 Create → Render Texture를 통해 Render Texture를 생성합니다.
생성한 Render Texture를 미니맵 전용 Camera의 Target Texture 필드에 넣어줍니다. 그러면 해당 카메라가 촬영하는 화면은 메인 화면이 아니라 지정한 Render Texture에 그려집니다.
Canvas 안에 Raw Image UI를 생성한 후, Raw Image의 Texture 필드에 앞에서 만든 Render Texture를 넣습니다.
Canvas └─ Raw Image └─ Texture : Minimap Render Texture
이제 미니맵 카메라가 보고 있는 장면이 Raw Image를 통해 UI에 실시간으로 표시됩니다. Raw Image의 크기와 위치를 조절해서 화면 우측 상단이나 좌측 상단 등에 배치하면 기본적인 미니맵이 완성됩니다.
전체 구조
최종적인 구조는 다음과 같이 이해하면 간단합니다.
플레이어 ↑ 위에서 플레이어를 바라봄 │ Minimap Camera │ ▼ Render Texture │ ▼ Canvas └─ Raw Image │ ▼ 화면에 미니맵 표시
결국 미니맵 구현의 핵심은 전용 카메라로 월드를 촬영하고 → Render Texture에 그 결과를 저장하고 → Canvas의 Raw Image로 보여주는 것입니다. 이후 플레이어 아이콘, 적 아이콘, 원형 마스크, 카메라 회전 방식 등을 추가하면 일반적인 게임에서 볼 수 있는 형태의 미니맵으로 확장할 수 있습니다.
CharacterController와 RigidBody
Unity에서 캐릭터를 움직일 때 CharacterController와 Rigidbody 중 어떤 것을 사용할지는 프로젝트에서 캐릭터에게 물리 연산이 필요한지 여부를 기준으로 선택할 수 있습니다. CharacterController는 캐릭터 이동에 특화된 컴포넌트로, 경사면 제한(Slope Limit), 계단 오르기(Step Offset) 등 캐릭터를 제어하기 편리한 기능을 제공하며 Rigidbody처럼 물리 엔진의 힘에 의해 움직이지 않습니다. 반면 Rigidbody는 중력, 힘, 충돌 반응, 밀림 등 물리 엔진의 영향을 받는 움직임을 구현할 때 사용합니다. 따라서 정확하고 직접적인 캐릭터 조작이 중요하고 물리적인 움직임이 필요하지 않다면 CharacterController를, 주변 물체와의 물리적 상호작용이나 자연스러운 물리 움직임이 중요하다면 Rigidbody를 사용하는 등 프로젝트의 성격에 맞게 선택하는 것이 중요합니다.
| 구분 | CharacterController | Rigidbody |
|---|---|---|
| 주요 목적 | 캐릭터 이동 및 조작 | 물리 기반 움직임 |
| 물리 연산 | 물리 힘의 영향을 직접 받지 않음 | 물리 엔진의 영향을 받음 |
| 중력 | 직접 구현해야 함 | 기본적으로 적용 가능 |
| 경사면/계단 | 관련 기능 제공 | 직접 설정·처리가 더 필요함 |
| 충돌 | 충돌 감지 가능 | 충돌 + 물리적 반응 가능 |
| 적합한 경우 | FPS, 액션 게임 등 직접적인 조작 | 밀림, 낙하, 힘 등 물리 상호작용이 중요한 경우 |

우리들의 게임 발매 이야기

안녕하세요. 플밍 4기 입니다. 게임 개발을 배우기 전 네트워크 엔지니어 도메인에서 익히고 배웠던 네트워크 이론에 대한 기초 입니다. 학습에 도움이 되길 바라며 공유 드립니다.
XR을 활용한 게임 개발 3기(유니티) 수강생입니다. 곧 수료 하지만 앞으로 이곳에 가끔 저의 개발 경험이 나 지식 기록할까 합니다. 더 나아가 이 사이트가 제 개인위키의 역할을 할 수 있으면 좋겠습니다. 한국 게임 시장을 흔들겠습니다


안녕하세요. 플밍 4기 입니다. 게임 개발을 배우기 전 네트워크 엔지니어 도메인에서 익히고 배웠던 네트워크 이론에 대한 기초 입니다. 학습에 도움이 되길 바라며 공유 드립니다.
XR을 활용한 게임 개발 3기(유니티) 수강생입니다. 곧 수료 하지만 앞으로 이곳에 가끔 저의 개발 경험이 나 지식 기록할까 합니다. 더 나아가 이 사이트가 제 개인위키의 역할을 할 수 있으면 좋겠습니다. 한국 게임 시장을 흔들겠습니다
