unity

[Unity - c#]Vector3.Magnitude 활용하여 거리 구하기

ork_ 2022. 7. 11. 16:41

Vector(백터)

백터는 쉽게 말해 크기와 방향을 갖는 물리량이다.

크기와 방향을 갖는다는 것은 시작 지점과 끝 지점이 존재한다는 뜻으로,

백터의 크기는 시작 지점에서 끝 지점 사이의 값이라고 생각하면 된다.

 

Vector2, 3은

2차원(x, y) 3차원(x, y, z)의 차이만 있을 뿐, Magnitude를 활용하는데 크게 다르지 않음을 미리 숙지 해야 한다.

 

 

Magnitude(규모)

시작과 끝이 존재 한다는 것은 그 안에 크기(또는 길이)가 생긴다는 것이고,

그 크기를 가르키는 것이 Magnitude(규모)가 된다.

 

유니티에서 magnitude를 사용할 때 float형으로 변환된다.

 

Magnitude 정의

//인자로 들어온 벡터의 길이를 반환한다.
public float magnitude(Vector3 vector)

//인자로 들어온 벡터의 길이의 제곱한 값을 반환한다.
public float sqrMagnitude(Vector3 vector)

위 정의 중 sqrMagnitude가 더 빠르게 계산하므로 거리 계산 시 sqrMagnitude을 활용하는 편이 유용하다.

 

Magnitude를 사용하여 거리 구하기

private void OnCollisionEnter(Collision collision)
{
    //설명 a코드
    Vector3 head = collision.transform.position - transform.position;
    //설명 b코드
    float dis = head.magnitude;
}

유니티에서 콜라이더가 서로 닿았을 때 이벤트를 처리하는 함수로 닿을 물체와의 거리를 계산한다.

 

코드 설명

a 코드

Vector3 head = collision.transform.position - transform.position;

ㄱ. collision.transform.position은 이 코드가 적용된 오브젝트와 닿은 물체의 위치 값이고

ㄴ. transform.position은 이 코드가 적용된 오브젝트의 위치 값을 말한다.

 

ㄱ에서 ㄴ을 뺐을 때 좌표 값이 head에 저장된다.

 예시)

         ㄱ이 (1, 5, 5)

         ㄴ이 (5, 5, 5)일 경우 head의 값은 (-4, 0, 0)이 된다.

 

b 코드

float dis = head.magnitude;

Vector3인 head에 magnitude를 적용하면 float형으로 바뀌므로 변수 앞에 float을 선언한다.

 

 예시)

        head(x, y, z)를 각각 제곱한 뒤 더하여 제곱근으로 처리한 결과로

        head(-4, 0, 0)를 magnitude로 변환 하면 4로 변환된다.

 

주의 사항

오브젝트의 크기에 따라 거리 값이 달라 질 수 있는데,

크기에 따른 중심점끼리 비교 값이 달라 지기 때문이다.

A와 같이 중심점과 가깝게 부딪힐수록 거리 값은 0에 가까우며,

B와 같이 멀어질수록 거리가 높게 측정된다.