Menu
CoddyTech

拡張メソッド

CoddyのUnityジャーニー「Unityのゲームアーキテクチャ」セクションの一部。レッスン 42/64。

Vector3 と Transform は Unity に属しているため、これらにメソッドを追加することはできません。拡張メソッドは、あたかもそれら自身のメソッドであるかのように呼び出せる静的メソッドです。この2つがあれば、どのプロジェクトでもよく書く行数を減らせます。

public static class UnityExtensions
{
    public static Vector3 WithY(this Vector3 v, float y)
    {
        return new Vector3(v.x, y, v.z);
    }

    public static void DestroyChildren(this Transform parent)
    {
        foreach (Transform child in parent)
        {
            Object.Destroy(child.gameObject);
        }
    }
}
// どのスクリプトでも
transform.position = transform.position.WithY(0.5f);
inventoryPanel.DestroyChildren();

拡張メソッドには3つの要素があります。入れ子でもジェネリックでもない静的クラス、静的メソッド、そして最初の引数の前に置くthisです。その引数はドットの左側にある値なので、transform.position.WithY(0.5f)はUnityExtensions.WithY(transform.position, 0.5f)にコンパイルされます。Vector3 は構造体なので、vはコピーです。WithY は呼び出し元のベクトルを変更できず、代わりに新しいベクトルを返します。また、これによりコンパイルできないtransform.position.y = 0.5f;を回避できます。

静的クラスは MonoBehaviour ではありません。独自の .cs ファイルに記述し、ファイル名は何でもかまいません。また、オブジェクトにアタッチすることはありません。Destroy など、MonoBehaviour から継承されるメソッドを使う場合は、ここではクラス名を指定する必要があります。Object.Destroyのようにします。foreach の中で子オブジェクトを破棄しても安全です。Unity がそれらを削除するのはフレームの最後だからです。

challenge icon

チャレンジ

中級

フクロウに2つの拡張メソッドを追加しましょう。

  1. FlatExtensionsに、public static FlatDistance(this Vector3 a, Vector3 b)を追加します。これは高さを考慮しない距離で、(0, 5, 0)から(3, 0, 4)までの距離は5です。
  2. 同様に、FaceFlat(this Transform t, Vector3 target)は、tをy軸だけを基準に向けます。
  3. Owlで、FaceFlatを使ってプレイヤーの方を向かせます。FlatDistanceがsightより小さい間、eyesをオンにします。

「プレイ」を押してフクロウの下を歩いてみましょう。目が光ります。その後、「確認」を押してください。

自分で試してみよう

using UnityEngine;

public static class FlatExtensions
{
    // FlatDistance (Vector3) と FaceFlat (Transform) をここに記述する
}

Unityのゲームアーキテクチャのすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド