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);