코딩의 신 64

김동관·2026년 1월 2일

오늘 한 일

중간 점검이 있었습니다.
제가 한 일을 정리해서 알려드리겠습니다.
애니메이션 연출에 대해서 알려드리겠습니다.

애니메이션 연출

연출방식

실제 플레이어를 잠깐 숨기고(Disable) → 컷씬 전용 가짜 배우(프리팹)들을 스폰해서 연출 → 끝나면 실제 플레이어를 결과 위치로 복구

실제 플레이어(Real Player)는 조작/카메라/충돌/상태가 복잡하니 컷씬 동안 잠깐 비활성화하고,
컷씬 전용 가짜 Player/NPC를 프리팹으로 생성해서 연출만 담당하게 만든 뒤,
컷씬 끝나면 실제 플레이어를 컷씬 결과 위치로 텔레포트해서 자연스럽게 이어준다.

이 방식의 장점:

게임 플레이 로직(입력, 전투, 스탯, 인벤토리 등)과 컷씬 로직이 섞이지 않음

컷씬 도중 “F 연타 / 상호작용 / 공격 / UI 겹침” 같은 사고를 깔끔하게 차단 가능

컷씬 배우 애니메이션/이동/카메라를 “연출용”으로만 단순하게 다룰 수 있음

컷씬 배우 프리팹 2개

cutscenePlayerPrefab

실제 플레이어와 외형/애니메이션은 같거나 유사

하지만 “입력/전투/상호작용” 같은 게임 로직은 없음 (또는 꺼져있음)

컷씬에서 걷기 애니 + Transform 이동만 담당

cutsceneNpcPrefab

NPC 외형/애니메이션 컨트롤러 포함

컷씬에서 같이 걷고 대사 타이밍에 연출의 대상이 됨

스폰 포인트 오브젝트 2개

cutsceneSpawnPoint : 컷씬 플레이어 시작 위치

npcSpawnPoint : 컷씬 NPC 시작 위치

컷씬 메인 매니저 스크립트

ShrineCutsceneManager

이 컷씬의 “감독” 역할

컷씬 시작/진행/종료 전 과정을 한 코루틴(Co_PlayCutscene)으로 통제

담당하는 기능:

실제 플레이어/플레이 카메라/UI 비활성화

컷씬 UI(레터박스 + 대사텍스트) 활성화

컷씬 카메라 활성화 + 모드 전환(3가지 연출)

컷씬 배우들(가짜 플레이어 + NPC) 생성

이동 로직(각자 속도 분리)

대사 타임라인(하드코딩)

“이동 종료 + 대사 종료” 둘 다 끝나면 컷씬 종료

컷씬 종료 시 실제 플레이어를 컷씬 마지막 위치로 복구

컷씬 트리거

ShrineCutsceneTrigger

트리거 들어오면 cutscene.PlayCutscene();

한 번만 재생되도록 trigger 오브젝트를 꺼버림 gameObject.SetActive(false);

이게 컷씬 재진입(=F연타/재트리거) 같은 문제를 예방해줌.

UI 요소 (레터박스/대사)

BottomBar가 검은색으로 올라오는 “레터박스” 연출

TMP_Text dialogueText를 BottomBar 위에 배치해서 대사 표시

Co_OpenLetterbox() / Co_CloseLetterbox()에서 바 높이를 Lerp로 조절

코드 흐름 (컷씬 시작 → 종료)

0) 트리거 진입

ShrineCutsceneTrigger.OnTriggerEnter
→ ShrineCutsceneManager.PlayCutscene()

1) 컷씬 시작 준비

realPlayer 비활성화

playerCamera 비활성화

playerUIRoot 비활성화

cutsceneUIRoot 활성화

cutsceneCamera 활성화

2) 레터박스 오픈

yield return Co_OpenLetterbox();

3) 컷씬 배우 생성

Instantiate(cutscenePlayerPrefab, cutsceneSpawnPoint...)

Instantiate(cutsceneNpcPrefab, npcSpawnPoint...)

4) 애니 재생

Animator.Play("CS_WalkToShrine")

Animator.Play("CS_Walk")
(우리가 Animator state name 불일치 때문에 State could not be found도 겪었지 → 컨트롤러/State 이름 맞춰 해결)

5) 이동 루프

목표점 walkEndPoint까지

Player는 playerWalkSpeed, NPC는 npcWalkSpeed

이동은 Transform 기반 (NavMesh 없이 연출용으로 단순)

6) 동시에 대사 타임라인 실행

StartCoroutine(Co_PlayDialogue())

대사 진행 중 특정 문장에서 cameraMode를 바꾸며 카메라 연출 전환

7) 컷씬 종료 조건

movementFinished && dialogueFinished
둘 다 true가 될 때 종료

8) 컷씬 종료 처리

컷씬 배우 Destroy

실제 플레이어를 컷씬 배우 최종 위치/회전으로 복구

UI 복구, 카메라 복구

레터박스 닫기

profile
아이디어 뱅크

0개의 댓글