0

我有以下代码。

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

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

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

4

5 回答 5

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 吗?

编译器错误 CS0518

于 2013-06-30T19:45:55.293 回答
0

直接来自文档

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();
于 2013-07-01T12:13:58.313 回答
0

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

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

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

if(script != null)
{
    script.changeState();
}
于 2014-02-20T15:48:40.183 回答
0

我不熟悉 GameObject,但也许你可以这样做:

GameObject target;
var script = target.GetComponent("ScriptName") as GameObject;
if (script != null)
{
    script.changeState();
}
于 2013-06-30T19:56:59.347 回答
-1

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

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

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

于 2013-07-01T07:53:56.813 回答