目次
はじめに
Unity には Mathf という数学に関する処理を行う便利な定数やメソッドをまとめたクラスがあります。
本記事では 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
の値を min
と max
の範囲内に制限する
入力する値は 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);
start
と end
の範囲でratio
の位置の値を取得
Lerp は入力した割合から値を取得します。ratio
は 0 ~ 1 の範囲で制限されます。
ratio
が 0 なら start
の値を取得し、1 なら end
の値を取得します。0.5 ならstart
と end
の中間値を取得します。
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);
start
と end
の範囲で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 を分かりやすくまとめているブログいくつかがあるので、こちらも参考にしてみて下さい。
- 数学系の処理を扱うMathfの全変数と全関数【Unity】| kanのメモ帳
- 【Unity】知って得するMathfクラス | 藍と淡々