是否可以将函数名称的字符串转换为UnityAction?

时间:2017-11-18 14:59:37

标签: c# unity3d

这个问题的一些背景......

我正在读取数据库中的函数名称,然后使用c#Reflection来调用它们。但是我想要的是能够从字符串中获取UnityAction。

这就是我想要完成的......

UnityEditor.Events.UnityEventTools.AddVoidPersistentListener(UnityEvent, UnityAction);

我所知道UnityAction是一名代表,但我不知道如何才能完成从字符串到UnityAction ...

我有什么......

UnityAction actionTemp;
        UnityEditor.Events.UnityEventTools.AddVoidPersistentListener(quest.questTrigger, actionTemp = new UnityAction(() => Q_UtilityManager.GetFunctionName<Q_OnTrigger>(str)));

GetFunctionName()是......

    public static MethodInfo GetFunctionName<T>(string _func)
{
    Type thisType = typeof(T);
    MethodInfo theMethod = thisType.GetMethod(_func);
    return theMethod;
}

这会导致相当大的错误归结为...

Could not register callback

任何帮助都会很棒。

2 个答案:

答案 0 :(得分:2)

  

是否可以将函数名称的字符串转换为UnityAction?

即可。您可以使用Delegate.CreateDelegate功能执行此操作。您传入委托的类型UnityAction,目标脚本实例(可以是this或任何脚本实例,最后是要调用的函数名称。

这是一个将字符串函数名称转换为UnityAction的简单函数:

UnityAction stringFunctionToUnityAction(object target, string functionName)
{
    UnityAction action = (UnityAction)Delegate.CreateDelegate(typeof(UnityAction), target, functionName);
    return action;
}

用法:

private UnityAction unityAction;

void Start()
{
    unityAction = stringFunctionToUnityAction(this, "hello");
    unityAction.Invoke();
}

//Function to call
void hello()
{
    Debug.Log("Hello");
}

答案 1 :(得分:1)

您拥有MethodInfo所以现在您只需要从中创建一个委托,为此您可以使用CreateDelegate方法。

在此示例中,我使用的是Action而不是UnityAction,因为我没有Unity引用。但是,将类型更改为UnityAction或任何其他委托将是相同的。

在这个例子中,我将方法名称硬编码为Do,但是如果你要从db获取它,它也会有效。然后我使用反射从它创建Action

public class Program
{
    static void Main(string[] args)
    {
        var actionNameFromDb = "Do"; // Get it from db or wherever
        var callback = (Action)GetFunctionName<Program>(actionNameFromDb).CreateDelegate(typeof(Action));
        Action handler = callback;

        callback();
        Console.Read();
    }

    public static void Do()
    {
        Console.Write("Do was called.");
    }
    public static MethodInfo GetFunctionName<T>(string _func)
    {
        Type thisType = typeof(T);
        MethodInfo theMethod = thisType.GetMethod(_func);
        return theMethod;
    }
}

<== Fiddle Me ==>