본문 바로가기
Unity

유니티에서 물체를 목적지까지 이동시키는 방법

by Oz Driver 2025. 7. 1.

유니티에서 물체를 목적지까지 이동시키고 싶을 때가 있습니다.

그리고 도착 여부를 판별해야 할 때도 있습니다. 

gameObject 자체에는 이런 기능이 없기 때문에, transform의 위치값을 직접 이동시켜야 합니다.

이럴 때 사용하는 함수가 바로 Vector3.MoveTowards()입니다.

 

함수 원형

Vector3 MoveTowards(Vector3 current, Vector3 target, float maxDistanceDelta)

 

•  current : 현재 위치

•  target : 목표 위치

•  maxDistanceDelta : 이번 프레임에서 이동할 최대 거리

 

예시 코드 

transform.position = 
    Vector3.MoveTowards(transform.position, targetPos, speed * Time.deltaTime);

 

이 함수는 내부적으로 maxDistanceDelta 만큼 목표 방향으로 이동한 새로운 위치를 반환합니다.
단, 목적지까지의 거리가 maxDistanceDelta 보다 작으면 목표 지점에 도착 시킵니다.

 

MoveTowards() 의 내부 동작

public static Vector3 MyMoveTowards(Vector3 current, 
                                    Vector3 target, 
                                    float maxDistanceDelta)
{
    // 1. 목표까지 가야 할 방향 벡터
    Vector3 toVector = target - current;

    // 2. 목표까지의 거리 계산
    float distance = toVector.magnitude;

    // 3. 만약 목표까지의 거리가 
    //    maxDistanceDelta 보다 작거나 같다면, 
    //    바로 도착하고 target 을 반환
    if (distance <= maxDistanceDelta || distance == 0f)
    {
        return target;
    }

    // 4. 도착 전이라면, 
    //    방향을 정규화(길이를 1로 만듦) 한 후,
    //    그 방향으로 maxDistanceDelta 만큼 이동
    Vector3 direction = toVector.normalized;
    Vector3 move = direction * maxDistanceDelta;

    // 5. 현재 위치에 move를 더해서 새로운 위치 반환
    return current + move;
}

 

현재 frame 에서 이동할 거리보다 목표까지의 거리가 짧다면 도착한 것으로 간주합니다. 

즉, target 을 반환합니다. 

따라서, frame 드랍 여부와 상관없이 무조건 도착지에 도착하며, 목표 위치를 절대 지나칠 수 없게 됩니다.

 

도착 여부 판별하기

float 타입은 오차가 있기 때문에 == 연산은 위험할 수 있습니다.

하지만 Vector3 구조체는 == 연산자가 오버로딩되어 있어 오차를 감안한 비교가 가능합니다

if ( current == target )
{
    // 도착
}

 

그럼에도 불구하고, 직접 오차 범위를 지정하는 방식이 더 안전합니다

if (Vector3.Distance(transform.position, targetPos) < 0.01f)
{
    Destroy(gameObject);
}