トップ > 【Unity】文字列からメソッドを呼び出す方法を紹介します!
更新日 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("テスト");
}
}
Methods_Call

SendMessageはメソッドを呼び出すというよりオブジェクトにメッセージを送る目的のものです。
ですのでクラス呼び出しであるスタティック関数は呼び出せません。
また、Unity実行時(ランタイム)用のものなのでエディター拡張で使うとエラーが出力されます。

ButtonDrawer_SendMessage

リフレクションを利用する

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);
Methods_PrivateCall

リフレクションは便利な反面、プライベートなものにもアクセスできるようになり非常に危険なので慎重に使いましょう。

ランタイム時はSendMessage関数を使い、
エディター拡張ではリフレクションを使い分けるようにしています。


関連ページ


Copyright ©2022 - 2024 うにぉらぼ