Unity

Unity

記事一覧

.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;
}

コメント