Vector3.Distance가 아닌 두 벡터 사이의 SqrMagnitude를 사용하는 이유
특정 위치에서 가장 가까운 객체들을 찾을 때 거리를 비교하는 경우가 많이 있다. 이때, Vector3.Distance나 Vector2.Distance로 두 좌표 사이의 거리를 가져올 수 있는데, 코드를 보다 보면 SqrMagnitude값을 사용하여 비교하는 코드들이 많이 있다. 그 이유를 알아보자.
Vector3.Distance와 SqrMagnitude 차이
// Vector3.Distance 내부 동작
public static float Distance(Vector3 a, Vector3 b)
{
Vector3 vector = new Vector3(a.x - b.x, a.y - b.y, a.z - b.z);
return Mathf.Sqrt(vector.x * vector.x + vector.y * vector.y + vector.z * vector.z);
// ^^^^^^^^^ 제곱근 계산 = 비싼 연산!
}
// sqrMagnitude 내부 동작
public float sqrMagnitude
{
get { return x * x + y * y + z * z; } // 제곱근 없음 = 빠름!
}
내부적으로 Distance와 sqrMagnitude의 가장 큰 차이점은 제곱근(Mathf.Sqrt)를 했냐 하지 않았냐이다. sqrMagnitude에 Mathf.Sqrt를 한 값이 Distance인 것이다.
즉, Distance는 두 지점 사이의 거리를 정확한 값으로 도출한 것이고, sqrMagnitude는 거리가 제곱되어 있는 상태이다.
그렇다면, sqrMagnitude는 정확한 거리값이 아닌 제곱되어 있는 값이라는 것인데 왜 이 값을 사용하는 것일까?
SqrMagnitude를 사용하는 이유
위 코드의 주석에서도 볼 수 있듯이 제곱근 연산이 오버헤드가 큰 함수이다. 때문에 적들이 굉장히 많이 나오는 뱀서류 게임을 모바일 환경에서 구동할 때 성능적 이슈가 발생할 수 있다.
예를 들어, 적의 숫자가 500마리가 있는데 특정 스킬이 가장 가까운 적에게 발사된다고 해보자. 그러면 이 스킬은 필드에 있는 적 500마리를 모두 순차탐색해서 가장 가까운 적을 찾게 된다. 이때 Mathf.Sqrt를 500번 하고 하지 않고의 차이가 발생하게 되는 것이다.
SqrMagnitude 사용 시 주의할 점
성능상의 이유로 Distance를 완전히 대체할 수 있으면 좋겠지만, 그렇지 않은 경우도 많기 때문에 사용에 주의를 해야 한다.
SqrMagnitude는 제곱근이 되어 있는 상태이기 때문에 두 좌표간의 정확한 거리가 아니라는 것을 알고 있어야 한다. 만약 스킬의 사정거리가 5라고 정해놓고 5 unit 미만에 있는 적을 찾는데 sqrMagnitude를 사용하면 제곱된 값인 25 범위 안에 있는 유닛을 찾을 수도 있다. 이는 공격 범위가 제곱이 되는 심각한 버그가 될 수 있다.
[Unity] UI 뒷 배경 뿌옇게(Blur, 블러) 처리하기
UI 창이 오픈되면 뒷 배경을 잘 보이지 않게 하기 위해 흐리게 하는 경우가 많다. 이를 블러(Blur)처리라고 하는데 유저가 조금 더 UI 화면에 집중할 수 있도록 도와준다. 다양한 방법을 사용해서
kwonriver.tistory.com
[Unity] 유니티 2D 레이캐스트로 충돌 판정 처리하기
유니티 내에는 충돌과 관련해 상태를 변경할 수 있는 방법이 많이 있지만 Raycast를 이용하여 충돌을 체크하는 방법을 사용해본다. Raycast에서 Ray란 특정 좌표에서 방향과 길이를 가진 광선을 의미
kwonriver.tistory.com
'[Unity] > 기능' 카테고리의 다른 글
[Unity] UI 뒷 배경 뿌옇게(Blur, 블러) 처리하기 (1) | 2023.02.05 |
---|---|
[Unity] 가중치 있는 랜덤 뽑기 기능 추가하기 (1) | 2023.01.31 |
[Unity] 유니티 허브에서 프로젝트 열기 (0) | 2023.01.31 |
[Unity] 애니메이션 진행 중인지 확인하기 (1) | 2023.01.11 |
[유니티] 2D 중력 조절 (unity Gravity Scale) (0) | 2023.01.10 |