【问题标题】:Is it possible to call a c# function form a string? [closed]是否可以从字符串调用 c# 函数? [关闭]
【发布时间】:2021-07-19 20:13:42
【问题描述】:

我有一个 inv 系统,您可以在其中创建项目并为它们提供脚本以在满足某些条件时执行。问题是我尝试使用 UnityEvents,但我对项目使用了 Scriptable 对象,所以我不能只调用运行时函数。然后,我尝试使用一个空的游戏对象来保存所有项目脚本,基本上,如果你给出项目脚本的名称,inv 系统将调用项目脚本上的一个函数。但问题是我不能只将字符串转换为可以调用函数的类。

所以很久以后我想出了这个

try
{
  // scriptHolder = the gameobject where all the item scripts are
  Type type = scriptHolder.GetComponent(ondrop[i]).GetType();
  object instance = Activator.CreateInstance(type);
  type.GetMethod("onDropInv").Invoke(instance, null);
}
catch { }

但问题是我需要在统一使用的脚本的当前实例上调用该函数。所以我尝试了最后 24 小时,现在我放弃了。我只是想不出任何解决方案或替代方案。

【问题讨论】:

  • 你已经这样做了:type.GetMethod("onDropInv")
  • 如果您希望函数使用现有实例,请传递现有实例并停止使用Activator 创建新实例。
  • 例如instance = scriptHolder.GetComponent(ondrop[i]); type = instance.GetType();

标签: c# unity3d


【解决方案1】:

不停!

您使用Activator 创建一个新实例只是为了从中调用一个方法?

在使用GetComponent后,您已经拥有一个组件实例!

此外,使用newActivator 创建MonoBehaviour/Component 的新实例是“不允许的”(您仍然可以这样做,但会收到警告和意外行为)!


我不完全理解你的用例,或者你为什么不能使用UnityEvent,如果这是你想做的。

但是您的看起来(至少)有以下两个选项:

使用GameObject.SendMessage

在此游戏对象中的每个 MonoBehaviour 上调用名为 methodName 的方法。

例如

// scriptHolder = the gameobject where all the item scripts are
scriptHolder.SendMessage("onDropInv");

但是,这只有在方法名称实际上是动态的并且您事先不知道时才有意义。

接口或基类

在您的情况下,您似乎无论如何都对方法名称进行了硬编码,因此只需确保所有相应的组件都实现接口,例如

public interface IOnDropInv
{
    public void onDropInv();
}

例如

public ExampleDropInv : MonoBehaviour, IOnDropInv
{
    public void onDropInv ()
    {
        Debug.Log("Hello there!");
    }
}

然后简单地做

scriptHolder.GetComponent<IOnDropInv>().onDropInv();

或者它们都继承自某个基类,例如

public abstract class BaseDropInv : MonoBehaviour
{
    public abstract void onDropInv ();
}

喜欢

public class ExampleDropInv : BaseDropInv
{
    public override void onDropInv ()
    {
        Debug.Log("Hello there!");
    }
}

然后做

scriptHolder.GetComponent<BaseDropInv>().onDropInv();

【讨论】:

    猜你喜欢
    • 2020-01-16
    • 2021-01-05
    • 2019-01-02
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多