0

使用 MonoDevelop 4.0.1 为 Unity 4.5.2f1 编写代码

下面的代码是我正在使用的代码的一部分,所有变量都已使用检查Debug.Log,它们都(单独)返回正确的值。

当我在 Unity 中刷新脚本资产时,我收到以下错误消息:

内部编译器错误。有关更多信息,请参阅控制台日志。输出为:错误 CS0518:未定义或导入预定义类型“System.Runtime.CompilerServices.CallSite”

错误 CS0518: System.Runtime.CompilerServices.CallSite未定义或导入预定义类型 1'

错误 CS0518:未定义或导入预定义类型“System.Runtime.CompilerServices.CallSite”

错误 CS0518: System.Runtime.CompilerServices.CallSite未定义或导入预定义类型 1'

错误 CS0518:未定义或导入预定义类型“System.Runtime.CompilerServices.CallSite”

错误 CS0518: System.Runtime.CompilerServices.CallSite未定义或导入预定义类型 1'

错误 CS0518:未定义或导入预定义类型“System.Runtime.CompilerServices.CallSite”

错误 CS0518: System.Runtime.CompilerServices.CallSite未定义或导入预定义类型 1'

错误 CS0518:未定义或导入预定义类型“System.Runtime.CompilerServices.CallSite”

错误 CS0518: System.Runtime.CompilerServices.CallSite未定义或导入预定义类型 1'

错误 CS0518:未定义或导入预定义类型“System.Runtime.CompilerServices.CallSite”

错误 CS0518: System.Runtime.CompilerServices.CallSite未定义或导入预定义类型 1'

以下是导致此错误的脚本(简化)部分:

注意:我不能将我的功能分解为多个小功能。我的函数必须保持原样我可以根据需要编辑 return 语句

using UnityEngine;
using System.Collections;
using Random = UnityEngine.Random;

public class myScene : MonoBehaviour
{
    private dynamic someVar;
    private float myFloat = 1.1f;
    private string myString = "string";
    private int myInt = 2;

    void OnGUI()
    {
        someVar = myFunction(myFloat, myString, myInt);
    }

    //First Function
    public dynamic myFunction(float myFloat, string myString, int myInt)
    {
        //Do something
        dynamic myOtherFunction(myFloat, myString, myInt);
        float myFloat = myOtherFunction.myFloat;
        string myString = myOtherFunction.myString;
        int myInt = myOtherFunction.myInt;
        //Do something
        return new {myFloat = myFloat, myString = myString, myInt = myInt};
    }

    //Second function
    public dynamic myOtherFunction(float myFloat, string myString, int myInt)
    {
        //Do something
        return new {myFloat = myFloat, myString = myString, myInt = myInt};
    }
}

我一直无法弄清楚问题是什么,(是的,即使使用谷歌,虽然出现了一些可能的解决方案,但我尝试了它们,它们似乎没有解决我的问题)。

我需要能够将多个变量OnGUI()从另一个函数返回给函数。我使用的方法是在这里return new{varName = value, ...};找到的。我不能使用元组,因为 Unity 4 MonoDevelop 不支持它(根据这篇文章),其中用户发布:

不,Unity 不支持元组。也许当 Unity 升级其 Mono 版本以支持 .NET Framework 4 中的功能时。

最终,我想在OnGUI()函数中实现以下代码:

myFloat = myFunction.myFloat;
myString = myFunction.myString;
myInt = myFunction.myInt

非常感谢您对此的任何帮助,谢谢

4

1 回答 1

3

您遇到了与元组相同的问题。dynamic在 .Net Framework 4.0 中引入,需要动态语言运行时 (DLR),而 Unity 的 Mono 版本中不存在该动态语言运行时 (DLR)。

话虽如此,鉴于您在此处的上下文,您的注释说明“我的函数必须保持原样,我可以根据需要编辑返回语句”表明您根本不需要当前的设置。我真的不明白为什么你不能使用一个对象来保存值(你使用的名称使得很难想出一个例子的逻辑名称):

    public class MyFunctionResult
    {
        public readonly float MyFloat;
        public readonly string MyString;
        public readonly int MyInt;

        public MyFunctionResult(float myFloat, string myString, int myInt)
        {
            MyFloat = myFloat;
            MyString = myString;
            MyInt = myInt;
        }
    }

    void OnGUI()
    {
        float myFloat = 1;
        string myString = "";
        int myInt = 2;
        var finalResult = myFunction(myFloat, myString, myInt);
        Debug.Log(finalResult.MyFloat); //...
    }

    //First Function
    public MyFunctionResult myFunction(float myFloat, string myString, int myInt)
    {
        //Do something
        var myOtherFunctionResult = myOtherFunction(myFloat, myString, myInt);
        float myFloatResult = myOtherFunctionResult.MyFloat;
        string myStringResult = myOtherFunctionResult.MyString;
        int myIntResult = myOtherFunctionResult.MyInt;
        //Do something
        return new MyFunctionResult(myFloat, myString, myInt);
    }

    //Second function
    public MyFunctionResult myOtherFunction(float myFloat, string myString, int myInt)
    {
        //Do something
        return new MyFunctionResult(myFloat, myString, myInt);
    }

非常努力地想出一个甚至勉强有效的理由但不能(但我想知道你的简化是否隐藏了一个隐藏的问题)。话虽如此,您也可以使用out参数,但我肯定会称其为误用:

public dynamic myFunction(float myFloat, string myString, int myInt)
{
    //Do something

    float myFloat;
    string myString;
    int myInt;
    myOtherFunction(out myFloat,out myString,out myInt);
    ...
}
public void myOtherFunction(out float myFloat, out string myString, out int myInt)
{
    myFloat = someVal;
    myString = otherVal;
    myInt = thirdVal;

    return;
}
于 2014-09-27T03:20:51.277 回答