C#Unity2D是否可以基于字符串调用脚本?

C#Unity2D是否可以基于字符串调用脚本?,c#,unity3d,C#,Unity3d,是否可以在脚本中运行一个方法,其中该方法的名称是从文本变量中找到的 例如: 在上面的示例中,我将变量“MyVariable”分配给“RunMeBaby”(我要调用的方法的名称),然后尝试调用它 以上这些对我来说都不管用,但还有别的办法吗 编辑以在下面添加其他说明 我目前正在创建自己的纸牌游戏。我已经创建了一个脚本对象(CardAsset)来处理我所有填充的卡都需要的一些字段。比如: 卡片名称(字符串) 成本(整数) 图像(图像) 描述文本(字符串) 现在,我的原型的所有其他东西都已经完成了

是否可以在脚本中运行一个方法,其中该方法的名称是从文本变量中找到的

例如:



在上面的示例中,我将变量“MyVariable”分配给“RunMeBaby”(我要调用的方法的名称),然后尝试调用它

以上这些对我来说都不管用,但还有别的办法吗


编辑以在下面添加其他说明

我目前正在创建自己的纸牌游戏。我已经创建了一个脚本对象(CardAsset)来处理我所有填充的卡都需要的一些字段。比如:

卡片名称(字符串)

成本(整数)

图像(图像)

描述文本(字符串)

现在,我的原型的所有其他东西都已经完成了(游戏场地、牌组等),我需要开始为我的牌制作效果。由于每张卡都不同,但某些效果是相同的(例如,抽更多的卡并对角色造成伤害是很常见的),我想我可以修改我的脚本对象CardAsset,以包含一些脚本和变量:

卡片名称(字符串)

成本(整数)

图像(图像)

描述文本(字符串)

效应1(脚本)

效应安装(int)

效应2(脚本)

有效载荷(int)

效应3(脚本)

有效载荷(int)

通过这种方式,我可以创建最多具有3种效果的CardAssets(同样,比如对角色造成伤害或绘制卡),然后在玩家玩该卡时,在游戏中使用一些东西调用这些脚本和相关变量

我的问题是我无法将脚本附加到我的CardAsset,因此我认为一个合适的解决方法是在CardAsset上的Effect1/Effect2/Effect3插槽中键入一个方法的名称(DealDamage,DrawCards)(将它们更改为字符串),然后让某个对象读取它们并在其他位置调用关联的方法


我知道这个解决方案容易出错,维护/更改起来可能会很痛苦,所以有更好的方法吗?

如果您想按名称调用方法。您可以使用反射:

Test type = new Test();
 typeof(Test).GetMethod("Hello").Invoke(type, new[] { "world" }); 
// You need the class name, so I just called it MyClass
public class MyClass 
{
    public void Start()
    {
        string methodName = "RunMeBaby";

        // Invoke the method using reflection
        typeof(MyClass).GetMethod(methodName)?.Invoke(this, null);
    } 
...

你可以通过C#中的反射来实现。但在我们到达之前,我建议 如果可能的话,您可以使用ActionDelegate(),您可以将您的方法分配给它,然后在任何需要的地方调用它。 因此,您的代码如下所示:

public Action MyVariable =RunMeBaby;
MyVariable();
现在反思的方式是:

public string MyVariable = "RunMeBaby";

public void Start()
{
    this.GetType().GetMethod(MyVariable).Invoke(this, null);
}
上面的代码假设要调用的方法(“RunMeBaby”在您的例子中)是公共的


大家好,欢迎来到Stack Overflow

我不知道您的文本类的详细信息,但是从您的问题来看,我假设它是一个字符串容器(可以这么说)。 您可以使用反射完全按照要求执行(基于字符串调用方法):

Test type = new Test();
 typeof(Test).GetMethod("Hello").Invoke(type, new[] { "world" }); 
// You need the class name, so I just called it MyClass
public class MyClass 
{
    public void Start()
    {
        string methodName = "RunMeBaby";

        // Invoke the method using reflection
        typeof(MyClass).GetMethod(methodName)?.Invoke(this, null);
    } 
...
然而,这是一个非常昂贵(而且容易出错)的调用。 我的建议是使用一种不太通用的方法:

public void Start()
{
    // assuming text.Text is your string property
    string methodName = "RunMeBaby";
    
    CallMethod(methodName);
} 

private void CallMethod(string methodName)
{
    switch(methodName)
    {
        case nameof(RunMeBaby):
            RunMeBaby();
            break;
        case nameof(SomeOtherMethod):
            SomeOtherMethod();
            break;           
    }
}

private void RunMeBaby()
{

}

private void SomeOtherMethod()
{

}
注:
我不知道你的方法字符串是从哪里来的,但是如果不是从外部来源(例如用户输入),最好使用nameof关键字,而不是硬编码字符串。如果可能的话,您应该完全去掉这些字符串,并用一个表示可调用方法的枚举来替换它们,例如,但是这个解决方案取决于您的用例。

Action a=RunMeBaby;a()请描述您的用例。。我想不出这有多少意义。。。当然,您可以使用大多数答案中提到的反射。。问题是:这真的是你想要做的吗?按字符串进行操作不仅非常慢,而且非常容易出错,而且可能(并且将)成为**关于可维护性的难题…@derHugo我在这里描述了我的用例: