코딩의 신 63

김동관·2025년 12월 31일

오늘 한 일

컷씬(Cutscene) 시스템 작업 요약

1) 컷씬 전용 플레이어 & NPC 분리

기존 실제 플레이어 캐릭터를 그대로 쓰지 않고
-> Cutscene 전용 Player / NPC 프리팹을 별도로 생성

컷씬 중에는:

입력 x

실제 게임 로직 x

애니메이션 연출에만 집중하도록 분리 설계

2) 컷씬 스폰 & 위치 제어

ShrineCutsceneManager에서 컷씬 시작 시:

컷씬 플레이어를 지정된 cutsceneSpawnPoint에 생성

NPC는 기준 위치 + npcOffset로 자연스럽게 배치

컷씬마다 연출 위치만 바꿔서 재사용 가능한 구조

3) Animator 직접 제어 방식 적용

컷씬 플레이어 / NPC 모두:

Animator를 직접 참조해서 상태 전환

이동, 정지, 특정 제스처 등 컷씬 전용 애니메이션 트리거 사용

실제 전투/이동 애니메이션과 완전히 분리

4) UI 전환 처리 (게임 ↔ 컷씬)

컷씬 시작 시:

playerUIRoot - 비활성화

cutsceneUIRoot - 활성화

컷씬 종료 시:

다시 게임 UI 복구

HUD 겹침 문제 해결

5) 레터박스(Letterbox) 연출 구현

상단 / 하단 검은 바 UI(RectTransform) 추가

컷씬 시작 시:

위·아래에서 부드럽게 내려오는 시네마틱 연출

컷씬 종료 시:

다시 화면 밖으로 이동

일반 플레이와 컷씬 분위기 확실히 구분

6) 코루틴 기반 컷씬 흐름 제어

컷씬 전체 흐름을 Coroutine으로 관리

연출 시작

애니메이션 재생

대기

UI 복구

Update 남발 없이 순차적인 연출 구성 가능

7) 컷씬 시스템 구조 안정화

컷씬용 스크립트 / 오브젝트를 명확히 분리해서:

이후 대화 컷씬

보스 등장 컷씬

스토리 연출 컷씬으로 확장하기 쉬운 상태

Cutscene 시스템 개발 기록 & 트러블 슈팅 정리

1) 컷씬에서 중요한 핵심 코드 구조
핵심 역할: ShrineCutsceneManager

컷씬의 시작 ~ 종료까지 전체 흐름을 관리하는 컨트롤 타워

public class ShrineCutsceneManager : MonoBehaviour
{
    [Header("Cutscene Actor")]
    public GameObject cutscenePlayerPrefab;
    public Transform cutsceneSpawnPoint;

    [Header("Cutscene NPC")]
    public GameObject cutsceneNpcPrefab;
    public Transform npcSpawnPoint;
    public Vector3 npcOffset;

    private GameObject cutscenePlayer;
    private GameObject cutsceneNpc;
    private Animator cutsceneAnimator;
    private Animator cutsceneNpcAnimator;

    [Header("UI")]
    public GameObject playerUIRoot;
    public GameObject cutsceneUIRoot;

    [Header("Letterbox")]
    public RectTransform topBar;
    public RectTransform bottomBar;
}

이 코드가 중요한 이유

컷씬 전용 캐릭터 / NPC를 명확히 분리

실제 플레이어, 전투 로직, 입력 시스템과 완전 독립

컷씬마다 프리팹 + 위치만 바꿔 재사용 가능

막혔던 지점 (진짜 문제)

문제 1. 컷씬에서 실제 플레이어를 그대로 사용

처음 시도:

기존 Player 오브젝트를 그대로 사용

입력 차단, 이동 제한, 카메라 분리 등 여러 제약이 겹침

문제점

PlayerController / Input / Camera / Stat / UI 전부 엮임

컷씬 하나 바꾸려다 게임 로직 전체가 흔들림

“이건 컷씬인데 왜 스태미나가 닳지?” 같은 이상 현상 발생

결론:

“플레이어를 잠그는 방식”은 한계가 있다

문제 2. UI가 컷씬 중 겹쳐 보임

HUD (HP, 미니맵 등)가 컷씬 연출 위에 그대로 노출

컷씬 분위기 완전히 깨짐

처음엔:

Canvas Sorting Order 조정

개별 UI 끄기 시도

-> 결과: 관리가 너무 복잡해짐

문제 3. 컷씬 흐름 제어가 꼬임

애니메이션 끝나기 전에 다음 연출 실행

대기 시간 관리가 불안정

Update()에서 타이머로 제어하려다 코드 난잡해짐

시도 1. 기존 플레이어 + 입력 잠금

playerController.enabled = false;

x 실패

입력은 막아도 Animator, Camera, UI 문제 해결 안 됨

시도 2. 카메라만 컷씬용으로 교체

x 부분 성공

카메라는 분리됐지만

Player 로직이 계속 살아있음

시도 3. 컷씬 전용 캐릭터 프리팹 생성

✔ 완전 해결의 시작

CutscenePlayerPrefab

CutsceneNPCPrefab

Animator만 달린 “연출용 배우”

-> 이 시점부터 구조가 단순해짐

최종 해결 방식 (핵심 설계)

  1. 컷씬 전용 Actor 시스템

CutscenePlayer / CutsceneNPC

이동·전투·입력 로직 x

Animator + Transform만 존재

  1. UI Root 단위 스위칭
playerUIRoot.SetActive(false);
cutsceneUIRoot.SetActive(true);

HUD 전체를 한 번에 관리

컷씬 전용 UI (레터박스, 대사창)만 노출

  1. 코루틴 기반 컷씬 플로우
yield return new WaitForSeconds();

컷씬 = “시간 흐름”

Update 제거 → 가독성 + 안정성 ↑

  1. 레터박스로 컷씬/플레이 명확히 구분

플레이 상태와 컷씬 상태를 시각적으로 즉시 인식

연출 완성도 크게 상승

5.오늘 작업의 핵심 교훈

❝ 컷씬은 게임 플레이의 연장이 아니라
**완전히 분리된 ‘연출 시스템’으로 다뤄야 한다 ❞

profile
아이디어 뱅크

0개의 댓글