Unity

[TIL] Unity Rigidbody를 활용한 물리 엔진

unihee1 2025. 3. 24. 21:02

1. Rigidbody란?

Rigidbody  GameObject 가 물리 제어로 동작하게 하여오브젝트가 사실적으로 움직이도록 해준다. 

 

2. Rigidbody에서 사용하는 이동 방식 

이동 방식 설명 특징
Velocity 즉시 속도를 변경한다. 물리 연산을 무시하고 즉각적으로 속도를 적용한다
AddFore() 힘을 가해 이동 자연스러운 가속과 감속이 적용됨
MovePosition() 특정 위치로 이동 충돌 감지를 유지하면서 이동 가능

 

3. velocity를 이용한 이동

using UnityEngine;

public class VelocityExample : MonoBehaviour
{
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        if (Input.GetKey(KeyCode.W)) 
        {
            rb.velocity = new Vector3(0, 0, 5); 
        }
    }
}

- 특징

  • 즉각적인 속도 변경 (물리적인 가속이 없다)
  • 벽에 부딪혀도 멈추지 않고 계속 이동할 수 있다

- 주의점

  • 물리 엔진의 힘(Force)와 충돌 감지를 무시할 수도 있다.
  • 현실적인 물리 움직임을 원한다면 AddForce()를 사용하는 게 더 적절한다.

 

4. MovePosition()을 이용한 이동

using UnityEngine;

public class MovePositionExample : MonoBehaviour
{
    private Rigidbody rb;
    public float speed = 5f;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        if (Input.GetKey(KeyCode.W))
        {
            rb.MovePosition(transform.position + Vector3.forward * speed * Time.deltaTime);
        }
    }
}

- 특징

  • 충돌 감지를 유지하면서 부드럽게 이동할 수 있다.
  • CharacterController처럼 플레이어 이동에 사용 가능하다.

- 주의점

  • 직접 힘을 가하는 게 아니라서 중력 등의 영향을 받지 않는다.
  • FixedUpdate()에서 호출해야 물리적으로 자연스럽다.

 

5.  ForceMode

AddForce()를 사용할 때 ForceMode 옵션을 활용하면 힘을 주는 방식을 변경할 수 있다.

Force 질량을 고려한 일반적인 힘 (기본값) 서서히 가속됨
Impulse 순간적인 힘 점프 같은 동작에 유용
VelocityChange 질량 무시하고 즉시 속도 변경 velocity와 비슷
Acceleration 질량을 고려하지 않고 힘을 가함 가속만 적용
rb.AddForce(Vector3.up * 5, ForceMode.Impulse);  
rb.AddForce(Vector3.forward * 2, ForceMode.Force);