C#の拡張メソッドでUnity開発を効率よくする小ネタ
https://gyazo.com/e9a94dfc7aeac065bbb00ead3c79a0b3
1.拡張メソッドとは
拡張メソッドとは、静的メソッドをインスタンスメソッドと同じ書式で呼び出せるようにすることで、 あたかもクラスに新しいメソッドを追加したかのように見せかける仕組みです。
拡張メソッドを書くためには以下のルールがあります。
publicな静的クラスを作る
作ったクラスの中にpublicな静的メソッドを作る
作ったメソッドの中の第1引数に this (拡張したいクラス名) (引数名) と記述する
code:Extends.cs
public class Test : MonoBehaviour
{
List<int> m_list;
public void Start()
{
m_list = new List<int>()
{
1,2,3,4,5,6,7,8,9,
};
//通常はGetRandom()というメソッドというものはないが、
//拡張メソッドを作ると呼び出すことが出来る。
int value = m_list.GetRandom();
Debug.Log($"value = {value}");
}
}
//拡張メソッドを作るために静的クラスを作る
public static class Extends
{
//listの中身をランダムで抽出する拡張メソッド
public static T GetRandom<T>(this List<T> self)
{
}
}
参考サイト
拡張メソッド - C# によるプログラミング入門 | ++C++; // 未確認飛行 C
2.Unityのコンポーネントで拡張メソッドを使う
拡張メソッドを作ることで、Unity開発を楽に進めることが出来ます。
Transformの拡張メソッドで2D用のLookAtメソッドを作る
通常のLookAtメソッドを2Dゲームで使用すると、Z軸回転だけ適用出来ればいい所を
X軸とY軸まで回転してしまいます。
そこで拡張メソッドを使い、2D用のLookAt関数を作ってみましょう。
code:Extends.cs
public class Test : MonoBehaviour
{
public void Update()
{
//↓これだとX軸回転とY軸回転もしてしまう
//transform.LookAt(m_target);
//拡張メソッドで指定した標的の方向を向く
transform.LookAt2D(m_target);
}
}
//拡張メソッドを作るために静的クラスを作る
public static class Extends
{
public static void LookAt2D(this Transform self, Transform target)
{
self.LookAt2D(target.position);
}
public static void LookAt2D(this Transform self,Vector3 target)
{
var diff = (target - self.position).normalized;
diff.z = 0;
self.rotation = Quaternion.FromToRotation(Vector3.up, diff);
}
}
Transformの拡張メソッドで子オブジェクトを指定するSetChildrenメソッドを作る
自分の親オブジェクトを指定するSetParentメソッドはあるのに、なぜ自分の子オブジェクトを指定するメソッドがないのか...そんなことが出来るようになる拡張メソッドを作って見みましょう
code:Extends.cs
public class Test : MonoBehaviour
{
public void Start()
{
//拡張メソッドで指定したオブジェクトを自分の子オブジェクトにする
transform.SetChildren(m_target);
//複数指定も可能にしてみる
transform.SetChildren(m_targets);
}
}
//拡張メソッドを作るために静的クラスを作る
public static class Extends
{
public static void SetChildren(this Transform self, params Transform[] children)
{
foreach(var child in children)
{
child.SetParent(self);
}
}
}
頻繁にいろんな場所で使う処理は、拡張スクリプトでまとめておくときれいなコードを書くことが出来ます。
執筆 :Villagevillage.icon
最終更新:2019/05/11