유니티/이동

[유니티(Unity)] 좌표이동 - transform.position 이동

RꞮbble 2026. 5. 2. 17:31

 

정의

  • 유니티 물리 엔진(Rigidbody) 없이 오브젝트의 좌표를 직접 수정하여 원하는 위치로 이동
  • 월드 좌표계를 기준으로 이동한다. 

 

사용 이유

  • 오브젝트를 지정된 위치로 정확하게 이동하기 위해
  • 유니티 물리 연산(Rigidbody)을 사용하지 않기 위해서  
  • 순간적인 이동처리를 하기 위해서 
    • ex) 텔레포트, 포탈이동
  • 물리적인 영향을 받지 않는 이동을 처리하기 위해서 
    • ex) 구름 이동

 

언제 사용해야 하는가  

  • 오브젝트를 지정된 위치로 정확하게 이동해야 할 때
  • 순간적인 이동을 해야 할 때
  • 물리적인 영향을 받지 않는 이동을 해야 할 때 

 

사용 방법

  • Update 메서드에서 transform.position을 수정 

 

ex)

using UnityEngine;

public class Example : MonoBehaviour
{
    private void Update()
    {
        transform.position += Vector3.forward * 1.0f * Time.deltaTime;
    }
}

 

 

transform.position 이동 장점

  • 좌표를 직접 설정해 이동하는 것이므로, 정확한 이동이 가능하다. 
  • 유니티 물리엔진(Rigidbody)을 사용하지 않아 연산 비용이 저렴하다. 

 

transform.position 이동 단점

  • 물리 현상을 직접 구현해야 한다. 
    • 직접 구현하지 않으면 오브젝트가 벽을 뚫거나 점프를 할 수 없다. 
    • 캐릭터 오브젝트와 카메라 오브젝트의 이동 타이밍이 어긋나 카메라 오브젝트가 벌벌 떨릴 수 있다. 
      ex) 지터링 현상
  • 로컬 이동을 구현하려면 Quaternion 연산이 필요함.
    • Quaternion 연산 = 벡터와 쿼터니언의 곱 = Vector3 * Quaternion = 방향벡터를 특정 각도만큼 회전시키기.

      ex) transform.position += transform.rotation * Vector3.forward * speed * Time.deltaTime;

 

cf) 물리 현상 = 점프, 충돌, 마찰력, 관성, 밀려나가기

 

cf) 지터링 현상 = 캐릭터 이동이 끝나기 전후 타이밍과 카메라 추적 타이밍이 어긋나 카메라가 벌벌 떨리는 현상

 

cf) Quaternion = 물체가 어느 방향으로 얼마나 회전되어 있는지를 나타낸 4차원 수 

cf) transform.rotation 값은 인스펙터에서는 오일러 각도(x, y, z)처럼 보이지만, 쿼터니언 값이다. 

 

cf) 지터링 현상 예제 코드

public class PlayerMovementController : MonoBehaviour
{
    public float speed;

    private void Update()
    {
        transform.position += Vector3.forward * speed * Time.deltaTime;
    }
}

public class CameraFollower : MonoBehaviour
{
    public Transform targetTransform;

    private void Update()
    {
        transform.position = targetTransform.position + new Vector3(0, 5, -10);
    }
}

 

 

 

지터링 현상은 LateUpdate로 해결할 수 있다. 

public class CameraFollower : MonoBehaviour
{
    public Transform targetTransform;

    private void LateUpdate()
    {
        transform.position = targetTransform.position + new Vector3(0, 5, -10);
    }
}