更新日 2022/7/13
【Unity】文字列からメソッドを呼び出す方法を紹介します!
Unityで文字列からメソッドを呼び出す方法を紹介します。
SendMessageを使用する
一番簡単な方法はComponent.SendMessageを使うことです。
MonoBehaviourはComponentを継承していますのでクラス内で呼び出すことができます。
using UnityEngine;
public class TestScript : MonoBehaviour
{
private void Start()
{
SendMessage("Test");
}
public void Test()
{
Debug.Log("テスト");
}
}
SendMessageはメソッドを呼び出すというよりオブジェクトにメッセージを送る目的のものです。
ですのでクラス呼び出しであるスタティック関数は呼び出せません。
また、Unity実行時(ランタイム)用のものなのでエディター拡張で使うとエラーが出力されます。
リフレクションを利用する
System.Reflectionを利用してメソッドを呼び出します。
using System.Reflection;
using UnityEngine;
public class TestScript : MonoBehaviour
{
private void Start()
{
MethodInfo method = GetType().GetMethod("Test", BindingFlags.Public | BindingFlags.Instance);
method.Invoke(this, null);
}
public void Test()
{
Debug.Log("テスト");
}
public static void StaticTest()
{
Debug.Log("スタティックメソッド");
}
}
汎用関数化する
使い勝手が良いように汎用化しましょう。
public void CallMethod
(
Type type,
string methodName,
BindingFlags flags,
object obj,
object[] parameters
)
{
MethodInfo method = type.GetMethod(methodName, flags);
method.Invoke(obj, parameters);
}
スタティックメソッドの呼び出し
スタティックメソッドを呼び出します。
インスタンスではなくTypeから呼び出すようにします。
public void CallStaticMethod
(
Type type,
string methodName,
object[] parameters = null
)
=> CallMethod(type, methodName, BindingFlags.Public | BindingFlags.Static, null, parameters);
CallStaticMethod(typeof(TestScript), "StaticTest");
インスタンスのメソッドの呼び出し
インスタンスからの呼び出しです。
public void CallInstanceMethod
(
object obj,
string methodName,
object[] parameters = null
)
=> CallMethod(obj.GetType(), methodName, BindingFlags.Public | BindingFlags.Instance, obj, parameters);
CallInstanceMethod(this, "Test");
禁断のprivate呼び出し
リフレクションを使うとprivateなメソッドも呼び出せてしまいます。
PrivateClass obj = new PrivateClass();
// obj.DoNotCall(); コンパイルエラー
CallMethod(obj.GetType(), "DoNotCall", BindingFlags.NonPublic | BindingFlags.Instance, obj, null);
リフレクションは便利な反面、プライベートなものにもアクセスできるようになり非常に危険なので慎重に使いましょう。
ランタイム時はSendMessage関数を使い、
エディター拡張ではリフレクションを使い分けるようにしています。
関連ページ
こちらのページも合わせてご覧下さい。
【Unity】MonoBehaviourの初期化イベントについて考察します!2024/2/12
【Unity】ゲームオブジェクトを常駐化させるための方法を紹介します!2024/3/1
【Unity】シングルトンパターンを実装する方法を紹介します!2024/3/1
【Unity】スクリプトからテクスチャーなどのリソースを読み込む様々な方法を紹介します!2024/2/9
【Unity】ゲームビューのスクリーンショットを撮る方法を紹介します!2024/2/26