캐릭터 이동의 기본
- 유니티에서 캐릭터의 움직임을 구현할 때, 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
속성을 조절하여 구현할 수 있습니다.