오늘의 트러블 슈팅
이동이 둔해짐
점프나 가속이 이상해짐
입력은 되는데 반응이 늦음
마치 중력이 커진 것처럼 느낌
겉보기엔 “컨트롤 문제” 같지만,
실제 원인은 물리 상태가 완전히 복구되지 않은 것이었음
컷씬 중에 플레이어를 숨기기 위해 이런 처리를 했음:
rb.isKinematic = true;
realPlayer.transform.position = new Vector3(0, -1000f, 0);
문제는 컷씬 종료 후에:
isKinematic을 다시 false로 돌렸지만
Velocity / AngularVelocity / FixedUpdate 타이밍이 깨진 상태였음.
즉,
물리는 다시 켜졌는데,
Rigidbody 내부 상태는 “이미 낙하 중”인 상태
그래서 캐릭터가:
계속 아래로 힘을 받거나
이동 계산이 꼬여서
“무거운 캐릭터”처럼 느껴진 것
처음에는 이런 흐름이었음:
컷씬 시작
플레이어를 -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 상태가 꼬여
컷씬 종료 후 캐릭터가 무거워지는 문제가 발생했다.
이를 해결하기 위해 컷씬 전용 플레이어를 분리하고,
실제 플레이어는 컷씬 종료 시점에만 위치/물리를 명시적으로 리셋하는 구조로 변경했다.