공부블로그

[공부 블로그] 유니티 오브젝트 거리 측정하기 & 원리

bimtaeur30 2025. 9. 4. 10:54

안녕하세요. 

오늘은 유니티에서 오브젝트 간의 거리를 측정하는 법에 대해 알아보겠습니다.

가장 대표적으로 사용하는방법은 다음과 같습니다.

float 거리 = Vector3.Distance(object_01.position, object_02.position);

이렇게 Vector3.Distance를 사용해 두 오브젝트의 위치를 입력하면 자동으로 거리 변수에 값을 넣어줍니다

또는 magnitue를 이용하여 거리를 구할 수도 있습니다.

float 거리 = (object_02.position - object_01.position).magnitude;

 

그럼 여기서 궁금증이 생길 수 있습니다.

왜 유니티는 거리를 구할 수 있는 기능을 2개나 제공하고 있을까요?

이 궁금증을 해결하기 위해 Vector3.Distance와 magnitude를 비교한 내용을 표로 정리하였습니다.

항목 Distance magnitude
목적 두 벡터간 거리 구함 벡터의 길이(크기) 구함
내부 연산 return (a-b).magnitude 백터 연산 수동
사용 편의성 간단, 직관 유연하지만 명시
성능차이 없음(magnitude와 같은 연산) 없음

 

이처럼 Distance와 magnitude는 내부적으로 동일하게 작동하기 때문에 자신에게 편한 걸 선택하여 사용하면 될 것 같습니다.

저는 개인적으로 Distance가 더 직관적이라고 생각하여 Distance를 애용하게 될 것 같습니다.

그럼, Distance가 결국 magnitude의 연산과 같다는걸 알았으니 magnitude의 벡터 연산 원리를 알아봅시다.

 

magnitude는 벡터의 길이(크기)를 구한다고 했었습니다.

벡터의 길이는 피타고라스의 정리를 이용하여 구할 수 있습니다.

public float magnitude {
    get {
        return Mathf.Sqrt(x * x + y * y + z * z); // 빗변 = sqrt(밑변² + 높이²)
    }
}

여기서 Sqrt는 제곱근을 의미합니다.  각 좌표의 제곱을 더한 값의 제곱근을 구하는 것 이죠.

magnitude는 이러한 원리로 작동합니다.

 

그런데, 연산량이 많아질때는 루트 연산 때문에 성능에 부담이 될 수 있습니다. 이럴 때 사용하는 것이 sqrMagnitude입니다.

sqrMagnitude는 제곱근 연산이 없는 magnitude입니다. 따라서 연산량이 적기 때문에 위에서 든 예시로는 이러한 sqrMagnitude가 더 효과적일 수 있습니다. 그럼 언제 magnitude를 쓰고, sqrMagnitude를 사용하는지 이해를 돕기 위해 여러 예시를 들어보겠습니다.

 

magnitude의 예시

- 이동 속도 계산

- 힘 크기 계산

- UI에 거리 표시

- 거리에 따른 사운드 볼륨 감

sqrMagnitude의 예시

- 적 탐지 범위 체크

- 근처 아이템 줍기 범위 확인

- 폭발 대미지 범위 판정

 

오늘의 내용은 여기까지입니다.

이번 블로그를 작성하며 magnitude는 속도, 힘, 거리 등에 다양하게 응용할 수 있었다는 것을 알게 되었습니다. 또한 sqrMagnitude의 원리도 알게 되었습니다.

언제 한번 magnitude만을 따로 다루는 블로그도 올려보면 좋을 것 같다는 생각을 하게 되었습니다.

감사합니다. 👍