[Unity]이동 함수 MovePosition, AddForce, velocity, Translate 비교 및 적합한 사용 상황

지즈·2024년 12월 26일
0

Unity

목록 보기
3/17

Unity에서 플레이어의 입력을 받아 이동을 처리해야 할 때 여러 방법이 존재한다. 각 방법의 장단점을 요약하고, 언제 어떤 방법으로 플레이어의 이동을 처리해야 할 지에 대해 정리해봤다.

1. Rigidbody.MovePosition

매 프레임마다 Rigidbody의 위치를 직접 설정하는 방식이다. 물리적 충돌이 필요하면서도 부드러운 이동이 필요한 경우 사용된다.

void Move()
{
    // 입력 값 가져오기
    float moveDirX = Input.GetAxisRaw("Horizontal");
    float moveDirZ = Input.GetAxisRaw("Vertical");

    // 이동 벡터 계산
    Vector3 moveDirection = (transform.right * moveDirX + transform.forward * moveDirZ).normalized;

    // 속도에 따라 이동
    Vector3 velocity = moveDirection * walkSpeed;

    // Rigidbody 이동
    myRigid.MovePosition(transform.position + velocity * Time.deltaTime);
}

Rigidbody.MovePosition 장단점

장점 : 물리적 충돌 계산이 유지되고, 부드러운 이동과 충돌 반응이 가능하다.

단점 : Force 기반 물리 효과를 제대로 활용할 수 없다. Unity의 물리 엔진이 제공하는 관성, 가속, 마찰과 같은 동적인 물리적 특성을 충분히 반영할 수 없게 된다. Rigidbody.MovePosition은 Rigidbody의 현재 위치를 새로운 위치로 강제 이동시키는 방식이다. 물리 엔진이 이 이동을 계산하는 과정에서 Force, Mass, Drag 같은 물리 효과무시하기 때문에 Transform의 위치를 업데이트 하는 것과 비슷하게 작동한다. 하지만 충돌 처리는 가능하다.


Rigidbody.MovePosition 적합한 사용 환경

사용해야 할 때 : 플랫폼 게임이나 1인칭/3인칭 캐릭터 컨트롤에 적합하다. 과도한 물리 효과가 필요하지 않고 캐릭터의 이동 방향과 속도를 쉽게 제어할 수 있기 때문이다.

사용하지 말아야 할 때

가속/감속 효과가 필요한 경우 : 매 프레임 동일한 속도로 움직이기 때문에, 가속/감속 효과를 구현할 수 없다.

마찰, 저항을 반영해야 하는 경우

충돌 후 반동이 필요한 경우 : 충돌은 처리하지만 충돌에 대한 반동(튕김)은 구현할 수 없다.



2 Rigidbody.AddForce

Rigidbody에 힘을 가해 물리적으로 이동한다. 따라서, 물리 기반 캐릭터나 자동차 시뮬레이션 등 현실감이 중요한 경우에 사용된다.

void Move()
{
    float moveDirX = Input.GetAxisRaw("Horizontal");
    float moveDirZ = Input.GetAxisRaw("Vertical");

    Vector3 moveDirection = (transform.right * moveDirX + transform.forward * moveDirZ).normalized;

    // 물리적 힘 적용
    myRigid.AddForce(moveDirection * moveForce, ForceMode.Acceleration);
}

Rigidbody.AddForce의 장단점

장점 : 물리 엔진을 활용해 가속, 관성, 마찰 같은 효과를 자연스럽게 구현할 수 있으므로 현실감 있는 움직임을 표현한다.

단점 : Force 기반 이동은 “현재 위치”를 직접 변경하지 않고 힘을 적용하여 이동 방향과 속도를 간접적으로 조절하므로 플레이어의 입력에 대해 즉각적인 반응이 어렵다. 마찬가지로, 캐릭터를 특정 위치로 정확히 옮기기가 어려워 움직임의 정밀도 관리가 복잡해진다.


Rigidbody.AddForce 적합한 사용 환경

사용해야 할 때 : 물리 계산이 필수적인 물리 기반의 게임에 사용해야 한다.

사용하지 말아야 할 때 : 플레이어의 입력을 즉각적으로 처리해야 하거나, 플레이어의 이동이 정확해야 할 경우 비추천 된다.



3 transform.position

Transform 컴포넌트의 위치를 직접 설정한다.

void Move()
{
    float moveDirX = Input.GetAxisRaw("Horizontal");
    float moveDirZ = Input.GetAxisRaw("Vertical");

    Vector3 moveDirection = (transform.right * moveDirX + transform.forward * moveDirZ).normalized;

    // 위치를 직접 변경
    transform.position += moveDirection * moveSpeed * Time.deltaTime;
}

transform.position 의 장단점

장점 : 매우 간단하고 성능 측면에서 가볍게 동작한다. 입력에 즉각 반응하며, 이동 방향이나 속도를 정밀하게 조정하여 완전한 제어가 가능하다.

단점 : 물리 엔진과 충돌 효과를 무시한다. 물체 간 충돌이 제대로 동작하지 않아 벽을 통과하거나 비현실적인 움직임이 발생할 가능성이 높다. 충돌을 처리하기 위해선 별도의 코드를 작성해야 한다.

transform.position 적합한 사용 환경

사용해야 할 때 : 충돌이 필요하지 않거나, UI 요소 이동처럼 물리 연산이 필요하지 않은 경우에 사용된다.

사용하지 말아야 할 때 : 물리적 효과 처리가 필요한 경우에는 적합하지 않다.



4 transform.Translate

지정한 이동 벡터만큼 현재 위치를 기준으로 이동한다. 월드 좌표계를 기준으로 이동하며, 로컬 좌표계로 전환할 수 있다.

void Move()
{
    float moveDirX = Input.GetAxisRaw("Horizontal");
    float moveDirZ = Input.GetAxisRaw("Vertical");

    Vector3 moveDirection = (transform.right * moveDirX + transform.forward * moveDirZ).normalized;

    // Translate로 이동
    transform.Translate(moveDirection * moveSpeed * Time.deltaTime, Space.World);
}

장단점과 적합한 사용 환경은 transform.position과 비슷하다. Translate은 이동 벡터를 입력할 수 있어 코드가 간단해진다는 장점이 있다.

5 Rigidbody.velocity

Rigidbody의 현재 속도를 즉시 설정하거나 읽어오는 속성이다. 바로 지정한 속도가 대입되므로 감속이나 가속 효과를 구현할 수는 없다. 즉각적인 위치 설정보다는 속도 기반의 움직임에 적합하다.

void Move()
{
    float moveDirX = Input.GetAxisRaw("Horizontal");
    float moveDirZ = Input.GetAxisRaw("Vertical");

    Vector3 moveDirection = (transform.right * moveDirX + transform.forward * moveDirZ).normalized;

    // 위치를 직접 변경
    rigidbody.velocity = moveDirection * moveSpeed * Time.deltaTime;
}

transform.position 의 특징

velocity를 직접 설정하면 게임 프레임 속도에 영향을 받지 않게 된다. FixedUpdate()는 프레임 단위가 아닌 일정 속도마다 업데이트 되기 때문이다.

profile
클라이언트 개발자가 되는 그 날까지 킵 고잉

0개의 댓글