코딩의 신 70

김동관·2026년 1월 14일

오늘의 트러블 슈팅

문제: 컷씬이 끝나면 캐릭터가 “무거워지는” 현상

컷씬 종료 후에 증상:

이동이 둔해짐

점프나 가속이 이상해짐

입력은 되는데 반응이 늦음

마치 중력이 커진 것처럼 느낌

겉보기엔 “컨트롤 문제” 같지만,
실제 원인은 물리 상태가 완전히 복구되지 않은 것이었음

원인 1 — Rigidbody 상태가 꼬였음

컷씬 중에 플레이어를 숨기기 위해 이런 처리를 했음:

rb.isKinematic = true;
realPlayer.transform.position = new Vector3(0, -1000f, 0);

문제는 컷씬 종료 후에:

isKinematic을 다시 false로 돌렸지만

Velocity / AngularVelocity / FixedUpdate 타이밍이 깨진 상태였음.

즉,

물리는 다시 켜졌는데,
Rigidbody 내부 상태는 “이미 낙하 중”인 상태

그래서 캐릭터가:

계속 아래로 힘을 받거나

이동 계산이 꼬여서
“무거운 캐릭터”처럼 느껴진 것

원인 2 — 위치 이동 타이밍이 잘못됨

처음에는 이런 흐름이었음:

컷씬 시작

플레이어를 -1000 위치로 이동

컷씬 끝

다시 원래 위치로 SetPosition

문제는:

물리가 꺼진 상태 / 켜진 상태가 섞여 있고

FixedUpdate 기준에서 위치 이동이 중간 프레임에 끼어버림

그래서 엔진 입장에서는:

“아, 이 Rigidbody는 방금 엄청난 거리만큼 이동했네?”
→ 낙하 / 가속 / 보정 계산 발생

해결 방식 — 컷씬용 플레이어와 실제 플레이어를 분리

핵심 아이디어

“실제 플레이어를 컷씬에 참여시키지 않는다”

기존 방식 x

실제 플레이어를 직접 이동

Rigidbody 상태를 계속 켜고 끄며 제어

변경한 방식

실제 플레이어

입력 잠금

Rigidbody isKinematic = true

보이지 않는 위치에 대기

컷씬 전용 플레이어 (프리팹)

애니메이션 전용

이동/연출 전담

컷씬 종료 시 Destroy

컷씬 종료 시

실제 플레이어를 EndPoint로 순간 이동

그 상태에서 물리 완전 리셋

rb.isKinematic = true;
realPlayer.transform.SetPositionAndRotation(spawnPos, spawnRot);

rb.velocity = Vector3.zero;
rb.angularVelocity = Vector3.zero;

rb.isKinematic = false;
yield return new WaitForFixedUpdate();

phys.ResetMovementState();
realPlayer.ResetInputState();

왜 이 방식이 문제를 해결했는가

컷씬 동안 실제 플레이어의 물리를 건드리지 않음

낙하, 가속, 중력 누적이 발생하지 않음

컷씬 종료 시점에만:

위치

회전

물리 상태

입력 상태
를 한 번에 초기화

결과적으로:

컷씬 전/후 체감 조작감이 동일

“무거워지는 현상” 완전 제거

결론

컷씬에서 실제 플레이어를 직접 이동·제어하면 Rigidbody 상태가 꼬여
컷씬 종료 후 캐릭터가 무거워지는 문제가 발생했다.
이를 해결하기 위해 컷씬 전용 플레이어를 분리하고,
실제 플레이어는 컷씬 종료 시점에만 위치/물리를 명시적으로 리셋하는 구조로 변경했다.

profile
아이디어 뱅크

0개의 댓글