문제 상황
초기에는 다음과 같이 AddForce로 플레이어를 움직임:
- Force가 남아있어 이동을 멈춰도 남아있는 포스가 없어질때까지 미끄러지듯이 이동
- 여러행동이 동시에 일어나거나 로직이 충돌할 시 부자연스러운 움직임 발생
시도 방법
- rigidbody의 drag 옵션을 설정해 멈춤
- 조금 더 빠르게 멈추나 적각적인 멈춤을 구현하기에는 부적절
- 강제로 rigid body의 속도를 0으로 설정해 멈춤
- 연속적인 입력이 이루어졌을때 다른 행동의 물리력도 없애버리는 현상 발생
해결 방법
- rigid body의 MovePosition 사용
rigidbody.MovePosition(rigidbody.position + moveDir * moveSpeed * Time.fixedDeltaTime);
- transform의 position 이동과 같이 위치 기반의 직접적인 이동방식
- 물리 엔진과 충돌은 적용되지만, 속도나 힘이 남지 않지 않음
- 입력이 끊기면 즉시 정지 (원하는 조작감 구현 가능)
핵심 비교 요약
| 항목 |
AddForce |
MovePosition |
transform.position |
| 이동 방식 |
Force 적용 |
위치 이동 요청 |
위치 즉시 변경 |
| 관성 존재 여부 |
있음 |
없음 |
없음 |
| 충돌 감지 |
O |
O |
X |
| 즉시 정지 구현 |
어려움 (속도 남음) |
가능 |
가능 (하지만 콜라이더를 무시함) |
정리
- Rigidbody.MovePosition은 transform.position처럼 즉시 위치를 이동시키는 방식이면서도,
물리 충돌을 감지하고 처리해주는 안전한 이동 방식이다.
- 이를 통해 정밀한 조작감과 즉각적인 정지, 그리고 장애물과의 자연스러운 상호작용을 모두 만족시킬 수 있다.
- 결과적으로, 자유로운 캐릭터 이동을 구현하면서도 충돌 안정성을 유지해야 할 때는
단순 AddForce보다 MovePosition이 훨씬 적합한 선택이다.