【Unity】便利な数学関数の Mathf クラスまとめ【Clamp, Abs など】

【Unity】便利な数学関数Mathfクラスまとめ

目次

はじめに

Unity には Mathf という数学に関する処理を行う便利な定数やメソッドをまとめたクラスがあります。

Mathf.Max

本記事では Mathf の全定数と全関数を紹介していきます。

参考 UnityEngine.MathfUnity スクリプトリファレンス

この記事でのバージョン情報

Unity 2019.4

Static 定数

Deg2Rad:度からラジアンに変換

度をラジアンに変換する定数

float degree = 60.0f;
float rad = degree * Mathf.Deg2Rad;
Debug.Log(rad);
// -> 1.047198

Rad2Deg:ラジアンから度変換

ラジアンから度に変換する定数

float rad = 1.0f;
float degree = rad * Mathf.Rad2Deg;
Debug.Log(degree);
// -> 57.29578

Epsilon:わずかな浮動小数点

ごくわずかな浮動小数点の値を返す

不動小数点の比較などに利用できます。

Infinity:正の無限大

正の無限大を表す

NegativeInfinity:負の無限大

負の無限大を表す

PI:円周率

円周率を表す

小学校の頃に習った 3.141592… の値です。

Static 関数

Abs:絶対値

public static float Abs (float f);

絶対値を返す

Debug.Log(Mathf.Abs(-7)); // -> 7
Debug.Log(Mathf.Abs(-5.5f)); // -> 5.5

Sin, Cos, Tan:三角関数

public static float Sin (float f);
public static float Cos (float f);
public static float Tan (float f);

三角関数のサイン、コサイン、タンジェントを計算

関数に入力する値はラジアンです。
Sin, Cos は -1 から 1 の範囲の値を返します。

float rad = 30f * Mathf.Deg2Rad;

Debug.Log(Mathf.Sin(rad)); // -> 0.5
Debug.Log(Mathf.Cos(rad)); // -> 0.8660254
Debug.Log(Mathf.Tan(rad)); // -> 0.5773503

Asin, Acos, Atan:逆三角関数

public static float Asin (float f);
public static float Acos (float f);
public static float Atan (float f);

逆三角関数のアークサイン、アークコサイン、アークタンジェントを計算

関数に入力する値はラジアンです。

float rad = 30f * Mathf.Deg2Rad;

Debug.Log(Mathf.Asin(rad)); // -> 0.5510696
Debug.Log(Mathf.Acos(rad)); // -> 1.019727
Debug.Log(Mathf.Atan(rad)); // -> 0.4823479

Atan2:2点間の角度

public static float Atan2 (float y, float x);

2点間の角度を求めたい時に使う

void Start()
{
    var degree = GetAngle(Vector2.zero, Vector2.one);
    Debug.Log(degree); // -> 45
}

// 2点間の角度を取得
float GetAngle(Vector2 start, Vector2 target)
{
    Vector2 dt = target - start;
    float rad = Mathf.Atan2(dt.y, dt.x);
    float degree = rad * Mathf.Rad2Deg;

    return degree;
}

Approximately浮動小数点の比較

public static bool Approximately (float a, float b);

2つの浮動小数点値を比較し、近似していれば true を返す

浮動小数点数同士の比較は、演算時に発生する誤差よって正確な比較ができないことがあるため、そういう場合に Mathf.Approximately が活用できそうです。

if (Mathf.Approximately(a, b))
{
    Debug.Log("aとbはほとんど同じ");
}

Ceil, CeilToInt:少数点以下切り上げ

public static float Ceil (float f);
public static int CeilToInt (float f);

小数点以下を切り上げた整数を返す

Ceil の返り値は float 型です。
CeilToInt の返り値は int 型です。

Debug.Log(Mathf.Ceil(7.8f));
// -> 8
Debug.Log(Mathf.Ceil(7.2f));
// -> 8
Debug.Log(Mathf.Ceil(-6f));
// -> -6
Debug.Log(Mathf.CeilToInt(-6.4f));
// -> -6

Floor, FloorToInt:小数点以下切り捨て

public static float Floor (float f);
public static int FloorToInt (float f);

小数点以下を切り捨てた整数を返す

Floor の返り値は float 型です。
FloorToInt の返り値は int 型です。

Debug.Log(Mathf.Floor(7.8f));
// -> 7
Debug.Log(Mathf.Floor(7.2f));
// -> 7
Debug.Log(Mathf.Floor(-6f));
// -> 6
Debug.Log(Mathf.FloorToInt(-6.4f));
// -> 7

Round, RoundToInt:四捨五入

public static float Round (float f);
public static int RoundToInt (float f);

四捨五入した値を返す

Round の返り値は float 型です。
RoundToInt の返り値は int 型です。

Debug.Log(Mathf.Round(7.4f));
// -> 7
Debug.Log(Mathf.Round(7.5f));
// -> 8
Debug.Log(Mathf.Round(-6.7f));
// -> -7
Debug.Log(Mathf.RoundToInt(-6.5f));
// -> 6

Clamp:値を範囲内に制限

public static float Clamp (float value, float min, float max);

value の値を minmax の範囲内に制限する

入力する値は int 型と float 型どちらでも可能です。

Debug.Log(Mathf.Clamp(7, -10, 10));
// -> 7
Debug.Log(Mathf.Clamp(15, -10, 10));
// -> 10
Debug.Log(Mathf.Clamp(-20, -10, 10));
// -> -10

Clamp01:値を 0 から 1 の間に制限

public static float Clamp01 (float value);

value の値を 0 から 1 の間に制限する

Debug.Log(Mathf.Clamp01(0.2f));
// -> 0.2
Debug.Log(Mathf.Clamp01(2));
// -> 1
Debug.Log(Mathf.Clamp01(-0.4f));
// -> 0

ClosestPowerOfTwo:最も近い 2 のべき乗

public static int ClosestPowerOfTwo (int value);

value の値に最も近い 2 のべき乗の値を返す

Debug.Log(Mathf.ClosestPowerOfTwo(6));
// -> 8
Debug.Log(Mathf.ClosestPowerOfTwo(150));
// -> 128

NextPowerOfTwo:値以上で最も近い 2 のべき乗

public static int NextPowerOfTwo (int value);

value の値以上で最も近い 2 のべき乗を返す

Debug.Log(Mathf.NextPowerOfTwo(6));
// -> 8
Debug.Log(Mathf.NextPowerOfTwo(150));
// -> 256

IsPowerOfTwo:2 のべき乗か判定

public static bool IsPowerOfTwo (int value);

入力した値が 2 のべき乗なら true を返す

Debug.Log(Mathf.IsPowerOfTwo(150));
// -> False
Debug.Log(Mathf.IsPowerOfTwo(256));
// -> True

CorrelatedColorTemperatureToRGB:色温度を RGB カラーに変換

public static Color CorrelatedColorTemperatureToRGB (float kelvin);

ケルビンの色温度を RGB カラーに変換

色温度とは光の色を表すための尺度です。太陽光や自然光、人工的な照明などの色を表す際に使われます。

入力するケルビンの度数は1000 ~ 40000 の間でなければなりません。

Exp:e (ネイピア数)の乗数

public static float Exp (float power);

e (ネイピア数) を指定した乗数で返す

ネイピア数とは e の記号で表される数学定数の一つであり、自然対数の底です。

e  = 2.71828182845904523536……

Debug.Log(Mathf.Exp(3));
// -> 20.08554
Debug.Log(Mathf.Exp(5));
// -> 148.4132

参考 ネイピア数eについて-ネイピア数とは何か、ネイピア数はどんな意味を有しているのか-ニッセイ基礎研究所

Pow:乗数

public static float Pow (float f, float p);

f の p 乗の値を返す

Debug.Log(Mathf.Pow(2, 3));
// -> 8
Debug.Log(Mathf.Pow(3, 3));
// -> 27

GammaToLinearSpace:ガンマからリニアの色空間へ変換

public static float GammaToLinearSpace (float value);

value をガンマ (sRGB) からリニアの色空間へ変換

Debug.Log(Mathf.GammaToLinearSpace(0.8f));
// -> 0.6038274

LinearToGammaSpace:リニアからガンマの色空間へ変換

public static float LinearToGammaSpace (float value);

valueリニアからガンマ (sRGB) の色空間へ変換

Debug.Log(Mathf.LinearToGammaSpace(0.8f));
// -> 0.9063317

Lerp:線形補間

public static float Lerp (float a, float b, float t);

startend の範囲でratioの位置の値を取得

Lerp は入力した割合から値を取得します。
ratioは 0 ~ 1 の範囲で制限されます。

ratioが 0 なら startの値を取得し、1 なら endの値を取得します。0.5 ならstartend の中間値を取得します。

Debug.Log(Mathf.Lerp(10, 20, 0));
// -> 10
Debug.Log(Mathf.Lerp(10, 20, 1));
// -> 20
Debug.Log(Mathf.Lerp(10, 20, 0.5f));
// -> 15

InverseLerp:逆線形補間

public static float InverseLerp (float a, float b, float value);

startend の範囲でvalueの位置の割合(0 ~ 1)を取得

InverseLerp は入力した値から割合を取得します。

Debug.Log(Mathf.InverseLerp(10, 20, 10));
// -> 0
Debug.Log(Mathf.InverseLerp(10, 20, 20));
// -> 1
Debug.Log(Mathf.InverseLerp(10, 20, 15));
// -> 0.5

LerpAngle:角度で使うLerp

public static float LerpAngle (float a, float b, float t);

Lerp と同じ。Lerp を角度で使いたい時に使用

float minAngle = 0.0f;
float maxAngle = 180.0f;

Debug.Log(Mathf.LerpAngle(minAngle, maxAngle, 0));
// -> 0
Debug.Log(Mathf.LerpAngle(minAngle, maxAngle, 1));
// -> 180
Debug.Log(Mathf.LerpAngle(minAngle, maxAngle, 0.5f));
// -> 90

LerpUnclamped:制限なしの Lerp

public static float LerpUnclamped (float a, float b, float t);

Lerp と同じだがratioの範囲に制限がない

Lerp は入力する ratioの比率が 0 ~ 1 に制限されますが、LerpUnclamped は範囲の制限がありません。

float min = 1.0f;
float max = 2.0f;

Debug.Log(Mathf.LerpUnclamped(min, max, 0.5f));
// -> 1.5
Debug.Log(Mathf.LerpUnclamped(min, max, 2));
// -> 3
Debug.Log(Mathf.LerpUnclamped(min, max, -1));
// -> 0

SmoothStep:スムージング補間

public static float SmoothStep (float from, float to, float t);

Lerp と似た機能だが、補間は最初から徐々に速くなり、最後に向かい遅くなる

フェードやトランジション演出を作成するのに役立ちます。

Log, Log10:対数

public static float Log (float f, float p);
public static float Log10 (float f);

Log は p を底とする f の対数を返す
Log10 は 10 を底とするfの対数を返す

Debug.Log(Mathf.Log(8, 2));
// -> 3
Debug.Log(Mathf.Log10(100));
// -> 2

Max:最大値

public static float Max (float a, float b);
public static float Max (params float[] values);

2 つ以上の値から最大値を返す

Debug.Log(Mathf.Max(1.2f, 2.4f));
// -> 2.4
Debug.Log(Mathf.Max(1, 6, 10, 5));
// -> 10

Min:最小値

public static float Min (float a, float b);
public static float Min (params float[] values);

2 つ以上の値から最小値を返す

Debug.Log(Mathf.Min(1.2f, 2.4f));
// -> 1.2
Debug.Log(Mathf.Min(1, 6, 10, 5));
// -> 1

MoveTowards:移動

public static float MoveTowards (float current, float target, float maxDelta);

current から target までをmaxDelta のスピードで移動

オブジェクトを指定スピードで移動させたい時などに使用します。

MoveTowardsAngle:角度で使う MoveTowards

public static float MoveTowardsAngle (float current, float target, float maxDelta);

機能は MoveTowards と同じ。角度で使う際に使用

PerlinNoise:パーリンノイズ

public static float PerlinNoise (float x, float y);

2D のパーリンノイズを生成

Debug.Log(Mathf.PerlinNoise(1f, 1f));
// -> 0.4652731

パーリンノイズの説明は以下の記事が参考になります。

参考 パーリンノイズ(PerlinNoise)とはkanのメモ帳

Pepeat:繰り返し

public static float Repeat (float t, float length);

数値を 0 と lengthの間で繰り返し移動して返す

length が 1 の場合、0 から 1 に向かって移動し、1 になったらまた 0 に戻り 1に向かって移動を繰り返します。

PingPong:行ったり来たりの繰り返し

public static float PingPong (float t, float length);

数値を 0 と lengthの間で行ったり来たりして値を返す

length が 1 の場合、0 → 1 → 0 → 1 のように値を行ったり来たりさせながら繰り返します。

Sign:符号

public static float Sign (float f);

f の符号を返す

f が正の値か 0 の場合は 1 を、負の場合は -1 を返します。

Debug.Log(Mathf.Sign(100));
// -> 1
Debug.Log(Mathf.Sign(-100));
// -> -1
Debug.Log(Mathf.Sign(0));
// -> 1

SmoothDamp:時間をかけて値を変更

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

currentからtarget に向かって時間をかけて値を変更

SmoothDampAngle:時間をかけて角度を変更

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

currentからtarget に向かって時間をかけて角度を変更

Sqrt:平方根

public static float Sqrt (float f);

f の平方根を返す

Debug.Log(Mathf.Sqrt(9));
// -> 3
Debug.Log(Mathf.Sqrt(25));
// -> 5

おわりに

Mathf クラスの全変数と全関数を紹介してきました。

ゲーム開発では数学の処理が必要になる場面が多いため、便利な Mathf クラスが活用できる機会が多々あります。ぜひ活用してみて下さい。

他にも Mathf を分かりやすくまとめているブログいくつかがあるので、こちらも参考にしてみて下さい。