调用动态对象的成员函数

时间:2013-06-30 19:29:40

标签: c# unity3d

我有以下代码。

GameObject target;
dynamic script;
script = target.GetComponent("ScriptName");
script.changeState();

虽然我使用unity3d工具进行游戏开发,但我觉得这更像是一个通用的c#问题。在代码中,我获取了一个对象,该对象是链接到另一个游戏对象的脚本。我的目标是调用属于'target'的脚本的changeState()函数。这会产生错误,因为它无法确定changeState()是否属于动态变量'script'。是否有任何选项可以关闭它(类似于#define pragma strict)?还有其他解决方法吗?

注意:附加到此脚本引用的GameObject的脚本具有changeState()函数的实现。

5 个答案:

答案 0 :(得分:0)

Internal compiler error. See the console log for more information. output was:error CS0518: The predefined type 'System.Runtime.CompilerServices.CallSite' is not defined or imported.

您是在引用System.Core.dll吗?

Compiler Error CS0518

答案 1 :(得分:0)

我不熟悉GameObject,但也许你可以做类似的事情:

GameObject target;
var script = target.GetComponent("ScriptName") as GameObject;
if (script != null)
{
    script.changeState();
}

答案 2 :(得分:0)

直接来自documentation

var script = gameObject.GetComponent(FooTest); //note the lack of quotes
script.FooTestMethod();  //and method unique to FooTest

如果组件不存在,Unity会抱怨。

如果你真的坚持使用基于GetComponent的字符串:

var script = gameObject.GetComponent("FooTest") as FooTest;
script.FooTestMethod();

答案 3 :(得分:0)

你应该在这里使用一个接口,因为你可以换出的所有潜在脚本都包含方法changeState()将它们绑定到一个接口来表达它。

这为您提供了更多的类型安全性和更好的重新分解,而不是使用魔术字符串。当你施放它时,它还为你提供了一个很好的错误检查点。

GameObject target;
InterfaceType script;
script = target.GetComponent("ScriptName") as InterfaceType;

if(script != null)
{
    script.changeState();
}

答案 4 :(得分:-1)

所以这是我自己问题的解决方案。可以使用“对象”类型代替动态类型。这是我的代码:

object script = target.GetComponent("ScriptName");
Type scriptType = script.GetType();
object res = scriptType.InvokeMember("changeState", BindingFlags.InvokeMethod,
  null, script, null);

InvokeMember()在编译期间不解析对象类型的成员函数。不要忘记包含'System.Reflection'。希望这有助于某人。

相关问题