記事一覧
.Lerp(min, max, ratio)
Vector3.Lerp, Color.Lerpなど、数値を使う場合に使えます。
Min-Max間を直線で結び、取り出したい位置をratioで指定します。
.Lerp(5, 10, 0.2)であれば6を取り出します。
Vector3のような座標のみならず、こんな感じで指定色へ色を変化させる場合にも利用できます。
while (percent < 1)
{
percent += Time.deltaTime * fadeSpeed;
material.color = Color.Lerp(initialColor, Color.clear, percent);
yield return null;
}
Mathf.PingPong(value, length)
PingPongの名前の通り、一定の範囲で行ったり来たりする値を返す。
具体的には0~lengthの値で往復する。
Mathf.PingPong(0, 10)であれば0
Mathf.PingPong(3, 10)であれば3
Mathf.PingPong(10, 10)であれば10
Mathf.PingPong(12, 10)であれば8
Mathf.PingPong(20, 10)であれば0
GameObjectを往復させたり、色を点滅させたりもできる。
material.color = Color.Lerp(initialColor, flashColor, Mathf.PingPong(Time.deltaTime, 1));
Mathf.Clamp(value, min, max)
valueをmin、maxの範囲内に丸めてくれる。
Mathf.Clamp(5, 10, 20)なら10が返る。
Vector3.sqrMagnitude
距離の比較を行う場合によく用いる。
sqrMagnitudeはVector3.Distanceの2乗に当たる。
これを用いる理由。
直接距離を求める場合は三平方の定理を用いて計算します。
a^2+b^2=c^2
具体的にCを求める場合、ルート計算しなければいけません。
しかし具体的な距離そのものを用いるよりもどちらが近いか、というような相対的な評価をする場合には不要なルート計算を省くことができます。例えば当たり判定の距離の中にいるかどうか、というような計算です。
これは2点間の距離(D)が判定する距離(E) 以上かどうかを知りたいわけですが、直接Dを求めなくてもD^2 > E^2であれば判断ができます。
乗算は負荷が低いですがルートの計算は負荷が高いため、実際の距離を求めずに2乗した値で判定した方が処理が軽くなります。
リスト要素をシャッフルする
UnityというよりはC#の話になっちゃいますが、要素をシャッフルするケースってゲームとか特殊な用途な気がします。
list = list.OrderBy(a => Guid.NewGuid()).ToList();
ダステンフェルドのアルゴリズムを用いるとこんな感じ。
正確にはWikiによると配列の末尾から埋めていくみたいだけど、先頭から埋めても本質的には同じかと思います。
public static T[] ShuffleArray<T>(T[] array, int seed)
{
System.Random prng = new System.Random(seed);
for (int i = 0; i < array.Length - 1; i++)
{
int randomIndex = prng.Next(i, array.Length);
T tempItem = array[randomIndex];
array[randomIndex] = array[i];
array[i] = tempItem;
}
return array;
}
コメント