Input.GetAxis() : 사용자가 키를 누르면 값이 0에서 1로 서서히 증가하며, 키를 떼면 1에서 0으로 서서히 감소합니다.
Input.GetAxisRaw() : 키를 누르는 순간 1이 되고, 키를 떼면 즉시 0으로 돌아갑니다.
✅ 정확한 충돌 감지 (벽 통과 방지)
✅ 중력, 계단 이동, 경사면 처리 가능
✅ Rigidbody 없이도 이동 및 점프 구현 가능
✅ 플레이어 이동을 세밀하게 조정 가능
✅ 물리 연산이 불필요하여 성능 최적화 가능
| 기능 | CharacterController | Rigidbody |
|---|---|---|
| 물리 연산 | ❌ 적용되지 않음 | ✅ 중력, 마찰력, 충돌 반응 |
| 충돌 감지 | ✅ 직접 Raycast로 감지 | ✅ 물리 엔진이 자동 감지 |
| 중력 적용 | ✅ 직접 코드로 조절 | ✅ 자동 적용됨 |
| 점프 구현 | ✅ 쉽게 구현 가능 | ⚠️ velocity 조정 필요 |
| 경사면 이동 | ✅ 자연스럽게 이동 가능 | ⚠️ 미끄러질 가능성 있음 |
| 빠른 이동 | ✅ 터널링 없음 | ⚠️ 빠른 속도에서 벽 통과 가능 |
| 퍼포먼스 | ✅ 최적화됨 (불필요한 물리 계산 없음) | ❌ 불필요한 물리 연산 부담 |
버츄얼 카메라 Follow 하면 이상한 곳 안 가버리도록 : Virtual Camera > Body > Hard Lock To Target
// 월드 좌표계 기준 이동
Vector3 position = rb.position + new Vector3(horizontal, 0, vertical) * moveSpeed * Time.deltaTime;
rb.MovePosition(position);
// 로컬 좌표계 기준 이동
Vector3 moveDirection = transform.forward * vertical + transform.right * horizontal;
Vector3 newPosition = rb.position + moveDirection * moveSpeed * Time.deltaTime;
rb.MovePosition(newPosition);
// 카메라 기준 이동
Transform cameraTransform = Camera.main.transform;
Vector3 moveDirection = cameraTransform.forward * vertical + cameraTransform.right * horizontal;
moveDirection.y = 0;
rb.velocity = moveDirection * moveSpeed;
fps 카메라 & 이동 만들기
모델이 직접 보이게 하려면 손만 띄워놓거나 전체 모델 구현해놓고 작은 원으로 머리를 감싸서 그 궤적을 카메라가 돌게 해야 될 것 같은데 일단 굳이

Rigidbody 기반으로 프로토타이핑 했더니 개수가 많아지면 땅으로 쳐박힘

플레이어 rigidbody를 kinematic으로 만들고 이동 로직은 따로 구현하여 해결
private void Move()
{
velocity.x = Input.GetAxisRaw("Horizontal") * speed;
velocity.y += gravity * Time.deltaTime;
if (isGrounded())
{
velocity.y = 0;
}
if (Input.GetKeyDown(KeyCode.Space))
{
velocity.y += 10 * jumpForce;
}
rb.MovePosition(rb.position + velocity * Time.deltaTime);
}
남은 문제