안녕하세요.
오늘은 유니티에서 오브젝트 간의 거리를 측정하는 법에 대해 알아보겠습니다.
가장 대표적으로 사용하는방법은 다음과 같습니다.
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만을 따로 다루는 블로그도 올려보면 좋을 것 같다는 생각을 하게 되었습니다.
감사합니다. 👍
'공부블로그' 카테고리의 다른 글
| [공부 블로그] 유니티 FSM에 대하여 - 2 (0) | 2025.09.13 |
|---|---|
| [공부블로그] 유니티 FSM에 대하여 - 1 (0) | 2025.09.13 |
| [공부 블로그] ref와 out의 차이 (2) | 2025.09.01 |
| [공부 블로그] SOLID 원칙에 대하여 (0) | 2025.08.21 |
| [C#] 여러가지 반복문 (0) | 2025.03.29 |