Mathf 함수 전부 알기

2022. 7. 17. 17:12유니티 unity

버전은 2022.2 기준입니다.

https://docs.unity3d.com/2022.2/Documentation/ScriptReference/Mathf.html

 

Mathf.Deg2Rad // public static float Deg2Rad;

더보기

(PI * 2) / 360, PI/180. 를 의미합니다. 보통 디그리(60분법)에다가 곱해서 라디안(효도법)을 구할 때 씁니다.

 

Mathf.Epsilon // public static float Epsilon;

더보기

작은 부동 소수점 값을 가져옵니다. 즉 0에 가까운  소수점을 반환합니다.

1.0f == (10.f/10.f) 이 값은 늘 true로 반환하지 않습니다.

두 값을 확인할 때는 Mathf.Epsilon를 활용해서 구할 수 있습니다.

    bool isEqual(float a, float b)
    {
        if (a >= b - Mathf.Epsilon && a <= b + Mathf.Epsilon)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

Mathf.Infinity // public static float Infinity;

더보기

양의 무한대

 

Mathf.NegativeInfinity // public static float NegativeInfinity;

더보기

음의 무한대

 

Mathf.PI // public static float PI;

더보기

파이 PI입니다. 3.14159265358979.......

 

Mathf.Rad2Deg // public static float Rad2Deg;

더보기

라디안을 디그리값으로 변환해주는 함수입니다. 360 / (PI * 2)  입니다.

1라디안은 57.29578도와 같습니다.

 

---------------------

메소드함수

 

Mathf.Abs // public static float Abs(float f);

더보기

절대값을 반환합니다.

Mathf.Abs(-3)이 값은 3 입니다.

 

Mathf.Acos // public static float Acos(float f);

더보기

arc-cosine를 반환합니다. 역코사인으로 라디안을 반환합니다

Acos를 이용하면 두 벡터의 각도를 알 수 있습니다.

 

내적을 구하는 공식은

벡터가 A 와 B가 있다면

Vector3.Dot(A, B) = Vector3.Magnitude(A) * Vector3.Magnitude(B) * Mathf.Cos(θ);

Mathf.Cos(θ) = Vector3.Dot(A, B) / Vector3.Magnitude(A) / Vector3.Magnitude(B);

θ = Mathf.ACos( Vector3.Dot(A, B) / Vector3.Magnitude(A) / Vector3.Magnitude(B) );

 

예시로 플레이어 시야 각안에 들어왔는지 확인하는 함수

float Angle = 70f; //시야각 70도로 설정

Vector3 targetDir = (target.transform.position - player.transform.position).normalized;
//방향을 구하고.

float dot = Vector3.Dot(player.transform.forward, targetDir);
//Dot함수를 이용해 두 벡터의 내적을 구한다.

//float theta = Mathf.Acos(dot/Vector3.Magintude(player.tranform.forward)/Vector3.Magintude(targetDir)) * Mathf.Rad2Deg; 
// 라디안이기때문에 각도를 구할려면 Rad2Deg를 곱해준다

// Vector3.Magintude(player.tranform.forward)/Vector3.Magintude(targetDir) 둘다 노멀벡터이기때문에 | 1 || 1 | = 1 이다 
float theta = Mathf.Acos(dot) * Mathf.Rad2Deg;  // 이렇게 사용

//내적으로 구하기때문에 0~180도 사이의 값이 나온다.

if (Angle<=theta)
{
	Debug.Log("시야각 70도안에 들어왔습니다.");
}

 

Mathf.Approximately // public static bool Approximately(float a, float b);

 

더보기

위에 Mathf.Epsilon를 활용한 함수입니다 bool 값을 반환합니다.

if (Mathf.Approximately(1.0f, 10.0f / 10.0f))
{
    Debug.Log("이 값은 같습니다.");
}

 

Mathf.Asin // public static float Asin(float f);

 

더보기

arc-sin를 반환합니다. 역sin , 라디안을 반환합니다

 

Mathf.Atan // public static float Atan(float f);

 

더보기

acs-tangent를 반환합니다. 역 tan , 라디안을 반환합니다.

각도를 구할 때 사용합니다

예시 Mathf.Atan(y의길이 / x의길이)

 

Mathf.Atan2 // public static float Atan2(float y, float x);

더보기

acs-tangent를 반환합니다. 역 tan , 라디안을 반환합니다.

위에 있는 Atan랑 Atan2가 있는데 둘 다 똑같은데 뭐가 다르냐면

Atan는 y/x 를 하는 과정에서 둘 중 하나가 0이라면 오류가 발생하기 때문에

Atan2에서 인자를 두 개 받아서 계산하기 때문에 오류가 발생을 안 한다.

보통 Atan2를 쓴다.

Mathf.Ceil // public static float Ceil(float f);

더보기

 크거나 같은 가장 작은 정수값을 반환합니다.(올림)

// 결과 10
Debug.Log(Mathf.Ceil(10.0F));
// 결과 11
Debug.Log(Mathf.Ceil(10.2F));
// 결과 11
Debug.Log(Mathf.Ceil(10.7F));
// 결과 -10
Debug.Log(Mathf.Ceil(-10.0F));
// 결과 -10
Debug.Log(Mathf.Ceil(-10.2F));
// 결과 -10
Debug.Log(Mathf.Ceil(-10.7F));

 

Mathf.CeilToInt // public static int CeilToInt(float f);

더보기

크거나 같은 가장 작은 정수값을 Int형으로 반환합니다.(올림)

// 결과 10
Debug.Log(Mathf.CeilToInt(10.0f));
// 결과 11
Debug.Log(Mathf.CeilToInt(10.2f));
// 결과 11
Debug.Log(Mathf.CeilToInt(10.7f));

// 결과 -10
Debug.Log(Mathf.CeilToInt(-10.0f));
// 결과 -10
Debug.Log(Mathf.CeilToInt(-10.2f));
// 결과 -10
Debug.Log(Mathf.CeilToInt(-10.7f));

 

Mathf.Clamp// public static float Clamp(float value, float min, float max);

더보기

value 값을 최솟값~최댓값 사이로 고정합니다.

 

public static float Clamp(float value, float min, float max)
{
  if ((double) value < (double) min)
    value = min;
  else if ((double) value > (double) max)
    value = max;
  return value;
}

 

예시 체력 설정

public float currentHp;
public float HpMax;
void Heal(float value)
{
    currentHp += value;
    currentHp = Mathf.Clamp(currentHp, 0, HpMax);
    //체력은 0~최대체력값 사이로 설정됩니다.
}

Mathf.Clamp01// public static float Clamp01(float value);

더보기

value 0에서 1의 값을 돌려줍니다.

public static float Clamp01(float value)
{
  if ((double) value < 0.0)
    return 0.0f;
  return (double) value > 1.0 ? 1f : value;
}

 

Mathf.ClosestPowerOfTwo// public static int ClosestPowerOfTwo(int value);

더보기

가장 가까운 2의 n 제곱 값을 반환

// 결과 8
Debug.Log(Mathf.ClosestPowerOfTwo(7));

// 결과 16
Debug.Log(Mathf.ClosestPowerOfTwo(19));

Mathf.CorrelatedColorTemperatureToRGB// public static Color CorrelatedColorTemperatureToRGB(float kelvin);

더보기

켈빈(절대온도)을 RGB 색상으로 바꿔줍니다.

켈빈은 1000 ~ 40000도 사이이어야 합니다.

 

 

Mathf.Cos// public static float Cos(float f);

더보기

Cos함수입니다. f값은 라디안을 넣어야 합니다.

허용 가능한 값은 -9223372036854775295 to 9223372036854775295 입니다.

 

public int numberOfSides;
public float polygonRadius;
public Vector2 polygonCenter;

void Update()
{
    DebugDrawPolygon(polygonCenter, polygonRadius, numberOfSides);
}

// 다각형 그리는 함수
void DebugDrawPolygon(Vector3 center, float radius, int numSides)
{
    // 코너 설정
    Vector3 startCorner = new Vector3(radius, 0) + center;

    // 코너를 맨처음으로 설정
    Vector3 previousCorner = startCorner;

    // 그리기 시작
    for (int i = 1; i < numSides; i++)
    {
        // 계산
        float cornerAngle = 2f * Mathf.PI / (float)numSides * i;

        // 코너 설정
        Vector3 currentCorner = new Vector3(Mathf.Cos(cornerAngle) * radius,0, Mathf.Sin(cornerAngle) * radius) + center;

        // 전 코너와 현재 코너를 그려줍니다.
        Debug.DrawLine(currentCorner, previousCorner);

        // 이전 코너를 설정
        previousCorner = currentCorner;
    }

    // 마지막 연결
    Debug.DrawLine(startCorner, previousCorner);
}

 

Mathf.DeltaAngle// public static float DeltaAngle(float current, float target);

더보기

두 각도의 최소 차이를 계산합니다.

 

public static float DeltaAngle(float current, float target)
{
  float num = Mathf.Repeat(target - current, 360f);
  if ((double) num > 180.0)
    num -= 360f;
  return num;
}

 

        // 결과 90
        Debug.Log(Mathf.DeltaAngle(1080, 90));
        // 결과 10
        Debug.Log(Mathf.DeltaAngle(80, 90));
        // 결과 80
        Debug.Log(Mathf.DeltaAngle(370, 90));
        // 0
        Debug.Log(Mathf.DeltaAngle(450, 90));
        // -20
        Debug.Log(Mathf.DeltaAngle(470, 90));
        // 20
        Debug.Log(Mathf.DeltaAngle(430, 90));

Mathf.Exp// public static float Exp(float power);

더보기

지정된 거급제곱으로 거듭제곱한 값을 반환합니다.

Mathf.FloatToHalf// public static ushort FloatToHalf(float val);

더보기

부동 소수점 값을 16비트 표현으로 인코딩합니다.

Mathf.Floor//public static float Floor(float f);

더보기

설정한 값 보다 작거나 같은 가장 큰 정수 값을 반환합니다(내림)

Mathf.FloorToInt// public static int FloorToInt(float f);

더보기

설정한 값 보다 작거나 같은 가장 큰 정수값을 int 형으로 반환합니다(내림)

Mathf.GammaToLinearSpace// public static float GammaToLinearSpace(float value);

더보기

감마에서 선형 색상 공간으로 값을 변환합니다.

Mathf.HalfToFloat// public static float HalfToFloat(ushort val);

더보기

반 정밀도 부동 소수점을 32비트 부동 소수점 값으로 변환합니다.

Mathf.Lerp//public static float Lerp(float a, float b, float t);

더보기

 선형보간입니다

a, b값이 주어졌을 때 그 사이에 위치한 값을 추정하기 위하여 직선거리에 따라 선형적으로 계산하는 방법

t는 0~1 사이의 값을 줘야 합니다

 

예시

Lerp(0,10,0.5) = 5 

Lerp(0,10,0.2) = 2

Lerp(0,10,0.4) = 4 

Lerp(0,10,0.8) = 8

Lerp(0,10,1) = 10  

 

출처 =&nbsp;https://m.blog.naver.com/PostView.nhn?blogId=hana100494&logNo=221636320321&proxyReferer=https:%2F%2Fwww.google.com%2F

 

 

public static float Lerp(float a, float b, float t) => a + (b - a) * Mathf.Clamp01(t);

 

 

Mathf.InverseLerp//public static float InverseLerp(float a, float b, float value);

더보기

Lerp의 역함수입니다 0~1 값을 반환합니다.

Mathf.IsPowerOfTwo// public static bool IsPowerOfTwo(int value);

더보기

bool값을 반환하고 2의 거듭제곱일 때,true를 반환합니다.

// 결과 false
Debug.Log(Mathf.IsPowerOfTwo(7));

// 결과 true
Debug.Log(Mathf.IsPowerOfTwo(32));

 

 

Mathf.LerpAngle// public static float LerpAngle(float a, float b, float t);

더보기

Lerp 와 동일 하지만 각도 버전입니다.

시작 값과 끝 값이 0~360도 사이에 있어야 합니다.

 

보통 부드러운 회전을 구현할 때 씁니다.

 

public static float LerpAngle(float a, float b, float t)
{
  float num = Mathf.Repeat(b - a, 360f);
  if ((double) num > 180.0)
    num -= 360f;
  return a + num * Mathf.Clamp01(t);
}

Mathf.LerpUnclamped// public static float LerpUnclamped(float a, float b, float t);

더보기

Lerp와 동일하지만 t가 1을 넘어가도 그 이상을 값을 줍니다.

 

LerpUnclamped와 Lerp의 차이는 Lerp는 t값이 1이 넘어가면 최대 1로 설정이 되지만

lerpUmclamped는 그렇지 않습니다.

//결과 10
Debug.Log(Mathf.Lerp(0,10,1.5f));
//결과 15
Debug.Log(Mathf.LerpUnclamped(0,10,1.5f));

 

public static float Lerp(float a, float b, float t) 
{
	a + (b - a) * Mathf.Clamp01(t);
}

public static float LerpUnclamped(float a, float b, float t) 
{
	a + (b - a) * t;
}

Mathf.LinearToGammaSpace// public static float LinearToGammaSpace(float value);

더보기

주어진 값을 선형에서 감마(sRGB) 색 공간으로 변환합니다.

Mathf.Log// public static float Log(float f, float p);

더보기

f = 진수

p=base

log밑(base)진수

지정된 밑에서 지정된 숫자의 로그를 반환합니다.

 

// 결과 2.584963
Debug.Log(Mathf.Log(6, 2));
// 결과 2
Debug.Log(Mathf.Log(4, 2));

 

 

 

Mathf.Log10// public static float Log10(float f);

더보기

베이스가 10인 지정된 수의 로그를 반환합니다.

 

// 결과 2
Debug.Log(Mathf.Log10(100));

Mathf.Max// public static float Max(float a, float b);

더보기

a와 b 값 중 최대 값을 반환합니다

 

// 결과 2.4
Debug.Log(Mathf.Max(1.2f, 2.4f));

Mathf.Min// public static float Min(float a, float b);

더보기

 

a 와 b 값중 최소 값을 반환합니다.

// 결과 1.2
Debug.Log(Mathf.Min(1.2f, 2.4f));

Mathf.MoveTowards// public static float MoveTowards(float current, float target, float maxDelta);

더보기

값 current에서 target으로 이동합니다.

Mathf.Lerp 와 동일 하지만 maxDelta 가 음수라면 뒤로 갑니다.

 

 

public static float MoveTowards(float current, float target, float maxDelta) 
{
	(double) Mathf.Abs(target - current) <= (double) maxDelta ? target : current + Mathf.Sign(target - current) * maxDelta;
}

 

예제

 

public float currStrength;
public float maxStrength;
public float recoveryRate;

void Update()
{
    currStrength = Mathf.MoveTowards(currStrength, maxStrength, recoveryRate * Time.deltaTime);
}

 

Mathf.MoveTowardsAngle// public static float MoveTowardsAngle(float current, float target, float maxDelta);

더보기

MoveTowards와 기능은 똑같지만 360도 돌 때, 정확하게 보간 되도록 합니다.

 

public static float MoveTowardsAngle(float current, float target, float maxDelta)
{
  float num = Mathf.DeltaAngle(current, target);
  if (-(double) maxDelta < (double) num && (double) num < (double) maxDelta)
    return target;
  target = current + num;
  return Mathf.MoveTowards(current, target, maxDelta);
}

Mathf.NextPowerOfTwo// public static int NextPowerOfTwo(int value);

더보기

인수와 같거나 더 큰 2의 거듭제곱을 반환합니다. 

 

//결과 8
Debug.Log(Mathf.NextPowerOfTwo(7));

//결과 256
Debug.Log(Mathf.NextPowerOfTwo(139));

//결과 256
Debug.Log(Mathf.NextPowerOfTwo(256));

 

Mathf.PerlinNoise// public static float PerlinNoise(float x, float y);

더보기

2d 평면 노이즈를 제작합니다.

 

반환 값은 0.0 ~ 1.0 사이입니다. 0보다 약간 작거나 1 보다 약간 클 수도 있습니다

 

 

 

Mathf.PingPong// public static float PingPong(float t, float length);

더보기

말 그대로 핑퐁 t값에서 length로 도달하면 다시 t값으로 가고 t값으로 가면 다시 length 값으로 갑니다.

t값은 자체적으로 증가하는 값(Time.time 및 Time.unscaledTime) 이어야 합니다.

 

public static float PingPong(float t, float length)
{
  t = Mathf.Repeat(t, length * 2f);
  return length - Mathf.Abs(t - length);
}

 

예제

게임 오브젝트가 x의 위치를 0~5 사이를 반복적으로 이동합니다.

private float t = 0;
private float speed = 10;
void Update()
{
    t += Time.deltaTime;
    transform.position = new Vector3(Mathf.PingPong(t*speed, 5), transform.position.y, transform.position.z);
}

 

Mathf.Pow// public static float Pow(float f, float p);

더보기

거듭제곱을 반환합니다

f의 p 승

//결과 9
Debug.Log(Mathf.Pow(3,2));
//결과 27
Debug.Log(Mathf.Pow(3,3));
//결과 81
Debug.Log(Mathf.Pow(3,4));

Mathf.Repeat// public static float Repeat(float t, float length);

더보기

0~length 사이의 값을 반환합니다.

 

 

public static float Repeat(float t, float length) 
{
	Mathf.Clamp(t - Mathf.Floor(t / length) * length, 0.0f, length);
}

 

//결과 1
Debug.Log(Mathf.Repeat(11,10));
//결과 5
Debug.Log(Mathf.Repeat(5,10));
//결과 4
Debug.Log(Mathf.Repeat(14,10));

 

예제 

게임오브젝트가 x의 위치를 0~5 사이를 이동합니다 5가 될 때 0으로 돌아갑니다

private float t = 0;
private float speed = 10;
void Update()
{
    t += Time.deltaTime;
    transform.position = new Vector3(Mathf.Repeat(t*speed, 5), transform.position.y, transform.position.z);
}

 

Mathf.Round// public static float Round(float f);

더보기

가장 가까운 정수를 반환합니다 (반올림)

 

// 결과 10
Debug.Log(Mathf.Round(10.0f));

// 결과 10
Debug.Log(Mathf.Round(10.2f));

// 결과 11
Debug.Log(Mathf.Round(10.7f));

// 결과 10
Debug.Log(Mathf.Round(10.5f));

// 결과 12
Debug.Log(Mathf.Round(11.5f));

// 결과 -10
Debug.Log(Mathf.Round(-10.0f));

// 결과 -10
Debug.Log(Mathf.Round(-10.2f));

// 결과 -11
Debug.Log(Mathf.Round(-10.7f));

// 결과 -10
Debug.Log(Mathf.Round(-10.5f));

// 결과 -12
Debug.Log(Mathf.Round(-11.5f));

 

 

Mathf.RoundToInt// public static int RoundToInt(float f);

더보기

Round와 같은데 int형으로 반환합니다.

Mathf.Sign// public static float Sign(float f);

더보기

양수일 때 1

음수일 때 -1 반환합니다.

 

//결과 -1
Debug.Log(Mathf.Sign(-10));
//결과 1
Debug.Log(Mathf.Sign(10));

 

Mathf.Sin// public static float Sin(float f);

더보기

sin 함수입니다. 라디안을 반환합니다.

 

예제는 위의 cos 함수 보시면 됩니다.

 

Mathf.SmoothDamp// public static float SmoothDamp(float current, float target, ref float currentVelocity, float smoothTime, float maxSpeed = Mathf.Infinity, float deltaTime = Time.deltaTime);

더보기

current에서 target으로 부드럽게 값이 변경됩니다.

 

currentVelocity = 현재 속도

smoothTime = 목표에 도달하는 데 걸리는 대략적인 시간, 작으면 작을수록 빠르게 도달합니다.

maxSpeed  = 속도 최대치

 

 

 

 

public static float SmoothDamp(
  float current,
  float target,
  ref float currentVelocity,
  float smoothTime)
{
  float deltaTime = Time.deltaTime;
  float maxSpeed = float.PositiveInfinity;
  return Mathf.SmoothDamp(current, target, ref currentVelocity, smoothTime, maxSpeed, deltaTime);
}

 

 

예제

0.3초 동안 해당타켓의 x값으로  부드럽게 이동하는 예제

public Transform target;
float smoothTime = 0.3f;
float yVelocity = 0f;

void Update()
{
    float newPosition = Mathf.SmoothDamp(transform.position.x, target.position.x, ref yVelocity, smoothTime);
    transform.position = new Vector3(newPosition, transform.position.y, transform.position.z);
}

 

 

Mathf.SmoothDampAngle// public static float SmoothDampAngle(float current, float target, ref float currentVelocity, float smoothTime, float maxSpeed = Mathf.Infinity, float deltaTime = Time.deltaTime);

더보기

SmoothDamp와 똑같지만 각도 변화를 부드럽게 변화시켜주는 것

0도에서 300도로 이동하게 되면 0도에서 300도로 이동하는 게 아니고 0도에서 -60도로 가까운 방향으로 변환된다.

Mathf.SmoothStep// public static float SmoothStep(float from, float to, float t);

더보기

from to 사이의 보간 값을 반환해줍니다.

Lerp와 유사한 방식으로 보간합니다 그러나 

Smooth는 부드럽게 이동하기 때문에 처음부터 점차적으로 속도가 빨라지고 끝으로 갈수록 느려집니다.

Mathf.Sqrt// public static float Sqrt(float f);

더보기

f의 제곱근을 반환합니다.

 

// 결과 2
Debug.Log(Mathf.Sqrt(4));
// 결과 3
Debug.Log(Mathf.Sqrt(9));

Mathf.Tan// public static float Tan(float f);

더보기

탄젠트 함수입니다. 라디안을 반환합니다.