2026-06-23 TIL (82일차)
[UE5] 게임플레이 카메라 시스템 (Gameplay Camera System)
Gameplay 메뉴 항목
- Camera Asset (카메라 에셋)
- 의미: 새로운 카메라 시스템의 핵심이자 최상위 본체입니다.
- 역할: 어떤 카메라 세팅(Rig)을 사용할지, 어떤 조건(Director)에서 카메라를 스위칭할지, 화면 전환(Transition)은 어떻게 처리할지에 대한 모든 정보가 이 에셋 안에 담깁니다.
- Camera Rig Prefab (카메라 리그 프리팹)
- 의미: 잘 만들어둔 특정 카메라 세팅(노드 조립본)을 독립적인 파일로 따로 저장해 둔 것입니다.
- 역할: 다른 카메라 에셋을 만들 때마다 똑같은 노드를 처음부터 다시 짤 필요 없이, 이 프리팹을 쏙 불러와서 레고 블록처럼 재사용할 수 있게 해줍니다. (유지보수와 작업 속도 향상에 필수)
- Camera Rig Proxy (카메라 리그 프록시)
- 의미: 실제 카메라 리그(Rig) 자체가 아니라, 그것을 가리키는 ‘대리자(포인터)’ 역할을 하는 에셋입니다.
- 역할: 외부나 다른 곳에 존재하는 카메라 리그를 간접적으로 연결해야 할 때 사용합니다. State Tree 등에서 하드코딩 없이 동적으로 카메라 장비를 매핑하고 호출할 때 유용합니다.
- Camera Variable Collection (카메라 변수 컬렉션)
- 의미: 카메라 로직에서 읽고 쓸 수 있는 여러 변수(플로트, 벡터 등)들을 한곳에 모아두는 ‘데이터 보관함’입니다.
- 역할: 블루프린트 로직과 카메라 시스템 사이의 통로 역할을 합니다. 캐릭터 블루프린트에서 이 컬렉션의 수치를 변경(예: 마우스 휠로 줌 수치 변경)하면 카메라 리그 노드들에 반영됩니다.
- Light Weight Instance (경량 인스턴스)
- 의미: (카메라 전용은 아니지만 Gameplay 범주에 포함됨) 무거운 일반 액터(Actor) 대신 렌더링 및 메모리 비용이 적은 형태로 오브젝트를 관리하는 최적화 시스템 에셋입니다.
- 역할: 거대한 오픈월드 등에서 수많은 객체를 성능 저하 없이 뿌리고 관리해야 할 때 사용합니다.
- StateTree (스테이트 트리)
- 의미: 언리얼 엔진 5의 강력한 범용 상태 머신(State Machine) 에셋입니다.
- 역할: 카메라 시스템에서는 ‘State Tree Camera Director’의 진짜 뇌 역할을 합니다. 캐릭터의 명확한 상태(대기, 전투, 조준 등)의 흐름을 짜두고, 각 상태에 진입할 때마다 알맞은 카메라 리그를 켜도록 지시하는 논리 구조를 만듭니다.
PART 1. 개념
1. 카메라 에셋 (Camera Asset)이란?
카메라 에셋은 새로운 카메라 시스템의 “본체”이자 가장 최상위 컨테이너입니다. 기존에는 캐릭터 블루프린트 안에 : SpringArm Component과 Follow Camera를 달아두었지만, 이제는 독립적인 ‘카메라 에셋’ 파일을 만들어 캐릭터의 Gameplay Camera Component에 장착합니다. 이 에셋 안에는 카메라가 어떻게 움직일지(Rig), 어떤 상황에 어떤 카메라를 쓸지(Director), 전환은 어떻게 할지(Transition)에 대한 모든 정보가 담겨 있습니다.
카메라 에셋을 처음 생성하려고 하면, 엔진은 가장 먼저 “어떤 카메라 디렉터(Camera Director) 유형을 사용할 것인지”를 묻습니다.
2. 카메라 리그 (Camera Rig)란?
카메라 리그는 특정한 카메라 연출 세팅 값들입니다.
- 구성: 노드 기반(Node-based)으로 이루어져 있습니다.
- 역할: 예를 들어 ‘3인칭 달리기용 리그’, ‘1인칭 조준용 리그’, ‘컷신용 리그’ 등을 각각 만듭니다. 이 리그 안에는 붐 암(Boom Arm)의 길이, 입력에 따른 피치(Pitch) 제한, FOV(시야각), 포스트 프로세스, 카메라의 떨림(Damping) 등의 물리적/시각적 설정이 포함됩니다.
- Camera Rig Prefab (카메라 리그 프리팹): 특정 카메라 리그를 독립적인 파일로 빼서 저장해 둡니다. 다른 카메라 에셋을 만들 때 복붙할 필요 없이 이 프리팹을 그대로 가져다 재사용할 수 있습니다.
- Camera Rig Proxy (카메라 리그 프록시): 현재 시스템 외부나 다른 곳에 존재하는 카메라 리그를 동적으로 참조하거나 연결해야 할 때 사용하는 대리자(Proxy) 에셋입니다.
3. 카메라 디렉터 (Camera Director)란?
카메라 디렉터는 여러 종류의 카메라 리그들 중에서 “어떤 카메라 화면을 켜야 하는지 결정하는 역할을 합니다.
캐릭터의 현재 상태(달리기, 스나이퍼 조준, 사망 등)나 외부 변수들을 실시간으로 평가(Evaluate)하여, 상황에 맞는 가장 적절한 카메라 리그를 활성화하도록 지시하는 핵심 시스템입니다.
4. 디렉터 유형 선택 (Pick Camera Director Type)
구현하려는 카메라의 복잡도에 따라, 처음 에셋을 만들 때 다음 4가지 중 하나의 ‘뇌(디렉터)’ 작동 방식을 선택하게 됩니다.
- Single Camera Director (싱글 카메라 디렉터):
- 의미: 가장 단순한 형태입니다. 상황 판단 없이 오직 단 하나의 ‘카메라 리그’만 주구장창 출력합니다.
- 사용처: 상태 변화 없이 고정된 시점만 사용하는 단순한 NPC 카메라, 혹은 로비 화면 카메라 등에 사용합니다.
- Blueprint Camera Director (블루프린트 카메라 디렉터):
- 의미: 블루프린트 노드(Event Graph 등)를 사용하여 개발자가 직접 “어떤 상황에 어떤 리그를 틀어라”라고 로직을 프로그래밍할 수 있는 디렉터입니다.
- 사용처: 커스텀 로직이 많이 들어가거나, Enum(열거형) 변수를 통해 1인칭/3인칭 시점을 스위칭할 때 주로 사용합니다.
- State Tree Camera Director (스테이트 트리 카메라 디렉터):
- 의미: 언리얼의 상태 머신 시스템인 ‘스테이트 트리(StateTree)’를 기반으로 카메라를 제어합니다. (복잡한 카메라 전환 흐름을 가장 깔끔하고 체계적으로 관리할 수 있습니다.)
- Priority Queue Camera Director (우선순위 대기열 카메라 디렉터):
- 의미: (검색 목록 하단에 존재하는 항목) 우선순위 스택을 기반으로, 현재 목록 중 가장 우선순위가 높은 카메라 리그를 자동으로 활성화하는 고급 디렉터입니다.
5. Camera 전용 스테이트 트리 (State Tree Camera Director)
스테이트 트리 카메라 디렉터는 복잡해지는 카메라 로직을 스파게티 블루프린트 노드 대신, 깔끔한 상태(State) 기반으로 제어하게 해주는 강력한 기능입니다.
- 원리: ‘대기 상태(Idle)’, ‘전투 상태(Combat)’, ‘스나이퍼 조준(Aim)’ 등 명확한 상태(State)를 노드로 정의합니다. 그리고 “우클릭을 누르면 Aim 상태로 넘어간다”는 조건(Transition)을 달아줍니다.
- 장점: 카메라의 전환 흐름을 한눈에 볼 수 있어 유지보수가 압도적으로 편해집니다. 각 상태에 진입할 때 특정 ‘카메라 리그’를 활성화하는 Task를 부여하여 모듈식으로 완벽하게 카메라를 관리할 수 있습니다.
6. State Tree Camera Director에 들어가서 나오는 항목들
디렉터를 State Tree로 설정하면 디테일 패널에 가장 중요한 두 가지 슬롯이 나타납니다.
Camera Rig Proxy Table (카메라 리그 프록시 테이블)
- 의미: StateTree가 카메라를 호출할 때 실명(진짜 장비 이름) 대신 ‘별명(Proxy)’으로 부를 수 있게 해주는 연결표(매핑 테이블)입니다 (인터페이스 역할).
카메라 에셋 상단 탭
- Director
- 역할: “언제, 어떤 카메라로 바꿀 것인가?”를 결정합니다. (방금 꽂아 넣은 StateTree가 이 안에서 돌아갑니다.)
- Rigs
- 역할: “카메라 화면을 어떻게 찍을 것인가?”를 물리적으로 세팅합니다. (붐대 길이, FOV 등)
- 연결점: StateTree 내부의 Task 노드에서
Activate Camera Rig명령을 내리면, 바로 이 Rigs 탭에 만들어둔 장비 중 하나가 탁! 하고 켜집니다.
- Transitions & Shared Transitions (화면 전환)
- 역할: “A 카메라에서 B 카메라로 넘어갈 때 어떻게 블렌딩할 것인가?”를 결정합니다.
- 연결점: StateTree가 “지금 3인칭에서 1인칭으로 당장 바꿔!”라고 지시하면, 그 명령을 받아 실제로 부드럽게 스르륵 화면을 줌인 시켜주는 연출은 StateTree가 아니라, 바로 이 Transitions 탭에서 설정해 둔 규칙에 따라 작동합니다.
7. Rig Toolbox
1. 기본 뼈대 및 연결 (Foundation)
가장 기본적으로 노드들을 엮고, 캐릭터에 붙이는 역할을 합니다.
- Sequence (시퀀스): 언리얼 블루프린트의 Sequence와 같습니다. 여러 개의 카메라 설정 노드들을 하나로 묶어서 순서대로 실행하게 해주는 최상위 뼈대 노드입니다.
- Attach to Player Pawn: 카메라를 “누구에게” 붙일 것인지 결정합니다. 기본적으로 플레이어의 캐릭터(Pawn) 위치에 카메라의 기준점을 고정시킵니다.
- Camera Rig Prefab: 잘 만들어둔 다른 카메라 리그를 ‘프리팹(재사용 모듈)’처럼 그대로 불러와서 꽂아 넣을 때 사용합니다.
- Blueprint: 엔진에서 기본으로 제공하는 노드로 부족할 때, 프로그래머가 직접 커스텀 블루프린트 로직을 짜서 카메라 행동을 제어할 수 있게 해주는 자유도 높은 노드입니다.
2. 위치 및 물리적 움직임 (Position & Movement)
기존 SpringArm 컴포넌트가 하던 역할을 세분화한 노드들입니다. 발표 때 가장 강조하기 좋은 부분입니다.
- Boom Arm (붐 암): 기존 시스템의 셀카봉(SpringArm)입니다. 캐릭터로부터 카메라를 X, Y, Z축으로 얼마나 떨어뜨려 놓을지(거리와 각도)를 결정합니다.
- Offset (오프셋): 붐 암과 별개로, 카메라의 최종 위치를 단순히 상하좌우로 살짝 더 옮기고 싶을 때(예: 오버더숄더 뷰를 위해 우측으로 살짝 이동) 사용합니다.
- Dampen Position (댐픈 포지션): 카메라가 캐릭터를 너무 뻣뻣하게 따라다니지 않도록, 묵직하게 뒤따라오는 ‘카메라 랙(Camera Lag)’ 효과를 줍니다.
- Collision Push (콜리전 푸시): 등 뒤에 벽이 있을 때 카메라가 벽을 뚫고 나가지 않도록, 충돌을 감지해 카메라를 캐릭터 쪽으로 훅 당겨주는(밀어주는) 기능입니다.
3. 입력 및 회전 (Input & Rotation)
플레이어의 마우스나 패드 조작을 카메라에 어떻게 반영할지 결정합니다.
- Input Axis Binding 2D: 플레이어의 마우스 움직임(Yaw, Pitch)을 카메라 회전에 직접 연결합니다. 여기서 카메라가 위아래로 움직이는 각도(Pitch 제한)를 걸어둘 수 있습니다.
- Auto Rotate Input 2D: 플레이어가 컨트롤러를 조작하지 않고 앞으로 걸어가기만 해도, 카메라가 알아서 캐릭터의 등 뒤로 스르륵 돌아와 정렬되도록(Auto Align) 돕는 노드입니다.
4. 시각 및 렌더링 효과 (Visuals & Optics)
기존 Camera Component에서 설정하던 시각적 효과들입니다.
- Field Of View (FOV): 시야각입니다. 줌인을 위해 좁히거나(예: 30도), 광각을 위해 넓힙니다(예: 90도).
- Filmback (필름백): 가상의 카메라 센서 크기(예: 16:9 DSLR, 35mm 영화용 센서 등)를 설정하여 화면비와 심도를 현실 카메라처럼 맞춥니다.
- Lens Parameters: 피사계 심도(아웃포커싱), 초점 거리(Focal Length) 등 렌즈의 광학적 특성을 세팅합니다.
- Clipping Planes: 너무 가까이 있거나 너무 멀리 있는 물체를 렌더링하지 않고 잘라내는(Clip) 거리를 설정합니다.
- Post Process (포스트 프로세스): 색감 보정, 비네팅, 화면 노이즈, 모션 블러 등 화면 후보정 효과를 덮어씌웁니다.
5. 고급 타겟팅 및 특수 기능 (Advanced Framing)
- Occlusion Material (오클루전 머티리얼): 벽이 카메라와 캐릭터 사이를 가렸을 때(카메라를 당기는 대신), 벽을 반투명하게 만들어 캐릭터가 계속 보이게 해주는 기능입니다. (디아블로 같은 탑다운 뷰에서 자주 씁니다.)
- Panning Framing / Dolly Framing: 타겟 락온(Target Lock-on) 시스템을 만들 때 씁니다. 적 캐릭터를 화면의 특정 위치(예: 중앙에서 약간 오른쪽)에 계속 유지시키기 위해 카메라를 자동으로 회전시키거나(Panning) 이동시킵니다(Dolly).
- Target Ray Cast: 카메라에서 특정 방향으로 레이캐스트(Raycast, 광선)를 쏴서 충돌하는 대상을 찾아내는 기능입니다. 타겟팅 대상을 찾거나 복잡한 충돌 연출에 사용합니다.
8. State Tree Trigger 종류 및 의미
스테이트 트리(State Tree)에서 다른 상태로 전환(Transition)될 때, “언제(When) 방아쇠를 당길 것인가?”를 결정하는 트리거 설정입니다.
- ✅ On State Completed (상태 완료 시)
- 의미: 현재 상태에 할당된 작업(Task)이 끝났을 때 무조건 발동합니다.
- 특징: 작업의 결과가 ‘성공’인지 ‘실패’인지 따지지 않습니다. 일단 현재 상태의 볼일이 끝나면 무조건 다음으로 넘어갈 때 사용합니다.
- ⭕ On State Succeeded (상태 성공 시)
- 의미: 현재 상태의 작업이 ‘성공(Success)’ 판정으로 온전히 끝났을 때만 발동합니다.
- 활용 예시: NPC가 ‘A 지점까지 이동’이라는 태스크를 무사히 성공했을 때만 다음 대기 상태로 넘어가게 할 때 씁니다.
- ❌ On State Failed (상태 실패 시)
- 의미: 현재 상태의 작업이 ‘실패(Failure)’ 판정으로 끝났을 때만 발동합니다.
- 활용 예시: 타겟을 쫓아가는 태스크를 수행 중 ‘타겟을 완전히 놓침’ 또는 ‘길 찾기 실패’로 에러가 났을 때, 당황하는 애니메이션 상태로 전환시킬 때 씁니다.
- ⏱️ On Tick (매 틱마다)
- 의미: 상태가 완전히 끝나기를 기다리지 않고, 실행 중인 동안 매 프레임(Tick)마다 실시간으로 지속 검사하여 발동합니다.
- 특징: 즉각적인 반응이 필요할 때 하단의 Conditions(조건)와 반드시 함께 쓰입니다.
- 활용 예시: 평화롭게 걷는 상태라도, 매 프레임마다 ‘적과의 거리가 5m 이내인가?’를 감지하다가 조건이 충족되면 하던 일을 즉시 멈추고 공격 상태로 넘어가야 할 때 사용합니다.
- ⚡ On Event (이벤트 발생 시) ⭐
- 의미: 블루프린트나 다른 시스템에서 특정 이벤트 신호(주로 Gameplay Tag)를 State Tree로 쏴주었을 때 즉시 발동합니다.
- 활용 예시: 지금 만들고 계신 카메라 시스템처럼, 유저가 “단축키를 누르거나 트리거 박스에 닿았을 때 즉시 카메라를 변경해라!”라는 외부 명령을 State Tree 내부로 전달할 때 가장 핵심적으로 쓰이는 트리거입니다.
9. Transitions vs Shared Transitions (전환 규칙과 우선순위)
- Transitions (개별 전환): * 의미: ‘이 특정 카메라 리그’가 켜지거나 꺼질 때만 작동하는 개별적이고 구체적인 전환 규칙입니다. (예: “스나이퍼 줌 카메라에서 빠져나올 때는 무조건 즉시 화면을 팍! 전환해라”)
- Shared Transitions (공유 전환): * 의미: 여러 카메라 장비(Rig)들이 공통으로 가져다 쓸 수 있는 ‘전환 규칙 모음집(기본값, 프레셋)’입니다.
- 왜 필요한가?: 카메라가 10개(달리기, 조준, 앉기, 수영 등)가 있을 때, 일일이 “부드럽게 0.5초”라고 설정하려면 엄청난 노가다가 필요합니다. 여기에 “기본 전환은 무조건 부드럽게 0.5초로 한다”라고 하나만 만들어두면 유지보수가 편해집니다.
만약 Shared와 일반 Transition 둘 다 설정되어 있다면 누가 먼저일까?
“구체적인 개별 설정(Transitions)이 공유 설정(Shared Transitions)을 이기고 덮어씁니다(Override).” 시스템은 항상 가장 좁고 구체적인 규칙을 먼저 찾습니다. 따라서 기본적으로는 Shared Transitions의 ‘부드러운 전환’ 규칙을 따르다가도, 특정 카메라에 Transitions가 따로 설정되어 있다면 그 순간만큼은 Shared 규칙을 무시하고 해당 카메라만의 특별한 전환 연출을 보여주게 됩니다.
2. 전환 툴박스(Toolbox) 노드 설명
이 노드들은 크게 [기본 뼈대], [전환 조건], [블렌딩(화면 섞기) 방식] 3가지로 나눌 수 있습니다. 발표 시 이렇게 3파트로 묶어서 설명하시면 청중이 아주 쉽게 이해할 수 있습니다.
[기본 뼈대 노드]
- Camera Rig Transition: 전환을 조립하는 가장 기본적인 뼈대(바탕) 노드입니다. 이 노드를 도화지처럼 깔아두고, “어떤 조건(Condition)일 때”, “어떤 방식(Blend)으로 넘길지”를 이 노드 아래에 연결해서 하나의 규칙을 완성합니다.
[조건 노드: 언제 이 전환 효과를 쓸 것인가?]
- Gameplay Tag (게임플레이 태그): 캐릭터가 특정 상태(태그)일 때만 이 전환을 사용하라는 조건입니다. (예:
Player.Status.Stunned태그가 뜰 때만 화면을 팍! 흔들면서 전환해라) - Is Camera Rig: 출발하는 카메라나 도착하는 카메라가 특정 리그(Rig)일 때만 작동하라는 조건입니다. (예: 출발지가 ‘스나이퍼 줌 카메라’일 때만 특별한 전환 효과를 줘라)
[블렌딩 노드: 화면을 시각적으로 어떻게 넘길 것인가?]
실제 화면에 보이는 연출 방식(카메라 워킹)을 결정합니다.
- Pop Blend (팝 블렌드): 섞는 과정(블렌딩) 없이 즉각적으로 화면을 팍! 전환합니다. 영화에서 장면이 확 바뀌는 ‘하드 컷(Cut)’과 같습니다. (전환 시간 0초)
- Linear Blend (리니어 블렌드): A 카메라에서 B 카메라로 일정한 속도로 기계처럼 딱딱하게 직선 이동합니다. 움직임이 다소 인위적일 수 있습니다.
- Smooth Blend (스무스 블렌드): 가장 많이 쓰는 방식입니다. 출발할 때는 부드럽게 가속하고, 도착할 때는 부드럽게 감속(Ease-in, Ease-out)하여 아주 자연스럽게 화면이 스르륵 넘어갑니다.
- Orbit Blend (오빗 블렌드): 직선으로 이동하지 않고, 캐릭터를 중심으로 원을 그리며(공전하며) 전환합니다.
- 🎙️ 발표 어필 포인트: “3인칭 게임에서 카메라가 앞(정면)에서 뒤(후면)로 바뀔 때, 직선으로 이동하면 카메라가 캐릭터의 머리를 뚫고 지나가는 어색한 상황이 발생합니다.
Orbit Blend를 쓰면 캐릭터 주위를 빙글 둥글게 돌면서 전환되기 때문에 화면이 모델링을 뚫는 클리핑(Clipping) 현상을 완벽하게 방지할 수 있습니다.”
- 🎙️ 발표 어필 포인트: “3인칭 게임에서 카메라가 앞(정면)에서 뒤(후면)로 바뀔 때, 직선으로 이동하면 카메라가 캐릭터의 머리를 뚫고 지나가는 어색한 상황이 발생합니다.