유니티에서 물체를 목적지까지 이동시키고 싶을 때가 있습니다.
그리고 도착 여부를 판별해야 할 때도 있습니다.
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);
}
'Unity' 카테고리의 다른 글
유니티에서 카메라의 시야각을 나타내는 흰색 실선이 거슬릴 때 (0) | 2025.07.01 |
---|---|
유니티에서 Visual Studio 가 열리지 않을 때 (0) | 2025.07.01 |
유니티 메뉴 폰트 크기 조정 (0) | 2025.07.01 |
호출 순서가 문제가 될 때 : SendMessage 또는 Interface 활용 방법 (1) | 2025.06.27 |
Unity 에서 물체를 숨기는 가장 효율적인 방법은? (0) | 2025.06.24 |