拡張メソッド
CoddyのUnityジャーニー「Unityにおけるゲームアーキテクチャ」セクションの一部。レッスン 33/50。
Vector3 と Transform は Unity に属しているため、それらにメソッドを追加することはできません。拡張メソッドは、C# であたかもそれらのメソッドであるかのように呼び出せる静的メソッドです。この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();拡張メソッドには、入れ子でもジェネリックでもない静的クラス、静的メソッド、そして最初のパラメーターの前にあるthisの3つが必要です。そのパラメーターはドットの左側にある値なので、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 がそれらを削除するのはフレームの終わりだからです。
チャレンジ
中級高い柱の上のフクロウが庭を見張っています。矢印キーでPlayerを動かせます(準備完了)。プロジェクトに2つの拡張メソッドを追加し、フクロウで使いましょう。
FlatExtensions.csに、静的クラスFlatExtensionsを書きます。FlatDistanceはVector3を拡張します。a.FlatDistance(b)は、高さの差を除いた地面に沿ったaからbまでの距離を返します。(0, 5, 0)から(3, 0, 4)までの距離は5です。FaceFlatはTransformを拡張します。t.FaceFlat(target)は、y軸だけを中心にtを回転させてtargetの方を向かせるため、targetの高さにかかわらず、直立したままになります。Owl.csでは、毎フレーム、フクロウがFaceFlatでプレイヤーの方を向き、地面に沿った距離でプレイヤーがsight(3)より近い間はeyesをオンにし、それ以外の場合はオフにします。フクロウは柱の高い位置にいるため、これはVector3.Distanceではありません。
Playを押し、柱の周りを歩いてフクロウの下をくぐり、それからCheckを押します。
自分で試してみよう
using UnityEngine;
// FlatExtensions: FlatDistance と FaceFlat
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。