본문 바로가기

Unity3d

캐릭터 움직임 구현하기: 유니티의 Rigidbody를 이용한 이동

캐릭터 이동의 기본

  • 유니티에서 캐릭터의 움직임을 구현할 때, Rigidbody 컴포넌트는 물리 법칙을 적용하여 리얼리즘 있는 동작을 구현하는 데 핵심적인 역할을 합니다. Rigidbody를 이용한 이동 구현은 캐릭터에 중력, 충돌, 회전 등의 물리적인 효과를 자연스럽게 적용할 수 있게 해줍니다.
public class PlayerMovement : MonoBehaviour
{
    public float moveSpeed = 5f;
    public Rigidbody rb;

    private Vector3 movement;

    void Update()
    {
        movement.x = Input.GetAxisRaw("Horizontal");
        movement.z = Input.GetAxisRaw("Vertical");
    }

    void FixedUpdate()
    {
        rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime);
    }
}
  • 위 코드는 플레이어의 기본적인 이동 로직을 구현합니다. Update 메소드에서는 플레이어의 입력을 받아 움직임 벡터를 계산하고, FixedUpdate에서는 그 움직임 벡터에 따라 Rigidbody의 위치를 업데이트하여 캐릭터를 움직입니다.

중력과 점프 구현

  • 캐릭터의 점프 기능은 게임에서 중요한 동작 중 하나입니다. Rigidbody의 AddForce 메소드를 이용해 캐릭터에게 점프력을 부여할 수 있습니다.
public class PlayerJump : MonoBehaviour
{
    public Rigidbody rb;
    public float jumpForce = 5f;
    private bool isGrounded = true;

    void Update()
    {
        if (Input.GetButtonDown("Jump") && isGrounded)
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.VelocityChange);
            isGrounded = false;
        }
    }

    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            isGrounded = true;
        }
    }
}
  • isGrounded 변수는 플레이어가 땅에 닿아 있는지 여부를 체크합니다. OnCollisionEnter 메소드를 통해 플레이어가 "Ground" 태그를 가진 오브젝트와 충돌했을 때 isGrounded를 true로 설정하여 다시 점프할 수 있게 합니다.

성능 최적화 팁

  • 움직임을 구현할 때, FixedUpdate를 사용하는 것이 중요합니다. FixedUpdate는 물리 업데이트를 위해 일정한 시간 간격으로 호출되며, 이는 게임의 물리 계산이 일관되게 유지되도록 합니다.
  • 입력 감지는 Update에서 수행하고, 물리적 움직임 계산은 FixedUpdate에서 수행하는 것이 일반적인 패턴입니다. 이렇게 분리함으로써 입력과 물리 업데이트 사이의 동기화 문제를 최소화할 수 있습니다.

추가적인 이동 효과 구현

  • 유니티의 Rigidbody를 사용하면 캐릭터에 추가적인 이동 효과를 쉽게 구현할 수 있습니다. 예를 들어, 빙판 위에서 미끄러지는 효과나, 물속에서 느리게 이동하는 효과 등을 Drag 속성을 조절하여 구현할 수 있습니다.