공부/게임 수학

피타고라스의 정리

밤톨ㅇl 2024. 12. 1. 00:03

피타고라스 정리!!

직각 삼각형 세 변의 길이 a, b, c가 있을 때 빗변 c의 제곱은 a의 제곱과 b의 제곱을 더한 것과 같다

 

이 피타고라스 정리를 유니티로 간단하게 만들어 보려고 한다

public static float GetDistance(float a, float b)
{
    float _Hypotenuse = 0f;

    _Hypotenuse = Mathf.Sqrt(a * a + b * b);

    return _Hypotenuse;
}
public static float GetDistance(Vector2 a, Vector2 b)
{
    float _Hypotenuse = 0f;

    float offsetX = a.x - b.x;
    float offsetY = a.y - b.y;

    _Hypotenuse = Mathf.Sqrt(offsetX * offsetX + offsetY * offsetY);

    return _Hypotenuse;
}

public static float GetDistance(Vector3 a, Vector3 b)
{
    float _Hypotenuse = 0f;

    float offsetX = a.x - b.x;
    float offsetY = a.y - b.y;
    float offsetZ = a.z - b.z;

    _Hypotenuse = Mathf.Sqrt(offsetX * offsetX + offsetY * offsetY + offsetZ * offsetZ);

    return _Hypotenuse;
}

 

결과

 

 

float Vector2 Vector3

 

Vector의 Distance함수와 비교하니 똑같이 나온다!!

아무 생각 없이 사용했던 Distance함수가 어떻게 동작하는지 알게 되니 게임 개발에 더 많이 활용할 수 있을 거 같당

 

유니티에서는 피타고라스의 정리를 어떻게 활용하고 있을까?

지피티한테 물어보니

보통 2D나 3D 공간에서 객체의 거리를 계산하거나 충돌 감지에 쓰이고 나중에 공부해 볼 벡터에도 쓰인다고한다

그래서 나는 객체 간의 거리를 이용하여 간단한 기능을 만들어보려고 한다

 

궁수의 전설이라는 게임을 보면 제일 가까운 적을 공격하는 걸 볼 수 있다

 

Player위치와 타겟들의 거리를 계산해 가장 가까운 적을 찾고 바라보는 간단한 기능을 만들어보겠다

완성~~~

    private void Update()
    {
        GetClosestObject();

        if (closestTarget != null)
        {
            transform.LookAt(closestTarget);
        }
    }

    void GetClosestObject()
    {
        float closestDistance = Mathf.Infinity;
        foreach (Transform target in targets)
        {
            float distance = GetDistance(target.position, transform.position);
            if (distance < closestDistance)
            {
                closestDistance = distance;
                closestTarget = target;
            }
        }
    }

 

 

'공부 > 게임 수학' 카테고리의 다른 글

벡터(내적)  (0) 2024.12.08
삼각함수(tan)  (1) 2024.12.05
삼각함수(Sin, Cos)  (3) 2024.12.04
벡터(Vector)  (0) 2024.12.01