오늘 한 일
오늘은 인트로의 뼈대를 완성하며, 시작하는 맵까지 추가를 해보았습니다.
눈 깜빡임 시스템 구현
검은 화면(눈 감김) 상태에서 시작
천천히 눈을 뜬 뒤, 다시 의식이 가라앉듯 천천히 감기는 연출 추가
Fade 기반으로 속도 조절 가능하도록 구성
카메라 회전 연출
시점이 왼쪽 / 오른쪽으로 이동하는 컷씬 카메라 회전 구현
카메라가 거의 다 회전했을 때 눈이 감기도록 타이밍 조정
과도한 구조 분리 없이 WaitForSeconds와 회전 시간 분할로 간단하게 해결
대사 출력
UI 패널 없이 TextMeshPro 텍스트만 사용
컷 전환 사이에 자연스럽게 독백 대사 출력
스토리 흐름을 기준으로 IntroScene의 역할을 명확히 정의
IntroScene은 “사건의 시작과 분위기 전달”까지만 담당
최종 보스 조우 / 사망 / 마을 치료는 다음 씬(튜토리얼/초반 플레이)로 분리하는 방향으로 결정
플레이어가 조작을 배운 직후 바로 죽는 구조를 피하고,
납득 가능한 스토리 전개와 게임 시작 지점을 분리하기로 함
IntroScene 전용 오브젝트(폭풍, 비, 바람, 오디오 등)는 프리팹화하지 않기로 결정
재사용 목적이 없고, 씬 종속 연출이기 때문
IntroScene 맵은 보이는 영역만 유지
캐릭터가 누워 있고 이동이 없는 연출이므로
뒤쪽/사용되지 않는 지형 및 오브젝트는 제거
성능 부담 감소 + 씬 역할 명확화
IntroScene을 “플레이 공간”이 아닌 연출용 무대로 정의
불필요한 복잡도 없이도 충분히 몰입감 있는 오프닝 연출 구현
이후 씬(튜토리얼/메인 시작부)과의 연결 구조가 명확해짐
주요 기능별 코드 설명
IEnumerator Fade(float from, float to, float time)
void SetAlpha(float a)
기능 설명
UI Image(eyeImage)의 Alpha 값을 조절해
눈 감김 (검은 화면)
눈 뜸 (시야 복구)
연출을 구현
Fade() 코루틴으로 속도 조절 가능
연출용이므로 타이핑/물리 영향 없이 안전
- 첫 연출 전용 “천천히 다시 감기” 기능 추가
IEnumerator SlowClose()
{
yield return Fade(0f, 1f, 2.2f);
yield return new WaitForSeconds(0.3f);
}
일반 깜빡임(Blink)과 분리된 Intro 전용 감김 연출
의식이 가라앉듯 천천히 눈을 다시 감는 연출
첫 장면에서만 사용
컷씬 카메라 회전 제어
IEnumerator RotateCamera(Quaternion from, Quaternion to, float time)
기능 설명
카메라 Transform을 Quaternion.Slerp로 회전
Intro 컷씬에서 시선 이동 연출 담당
Inspector에서 회전값을 직접 지정 가능 (leftRotation, rightRotation)
cameraTransform.rotation = Quaternion.Slerp(from, to, t / time);
“회전 거의 끝난 후 눈 감기” 타이밍 조절
구현 방식
복잡한 로직 추가 없이
회전 시간을 분할 + WaitForSeconds로 해결
yield return RotateCamera(cameraTransform.rotation, leftRotation, 0.8f);
yield return new WaitForSeconds(0.2f);
yield return Fade(0f, 1f, 0.5f);
효과
카메라가 거의 다 돌아간 시점에 눈 감기 시작
컷 전환 느낌 강화
코드 복잡도 최소화