0

MonoDevelop 4.0.1 を使用して Unity 4.5.2f1 のコードを作成する

以下のコードは私が使用しているコードの一部であり、すべての変数は使用してチェックされてDebug.Logおり、すべて (個別に) 正しい値を返します。

Unity でスクリプト アセットを更新すると、次のエラー メッセージが表示されます。

内部コンパイラ エラー。詳細については、コンソール ログを参照してください。出力は次のとおりです: エラー CS0518: 定義済みの型 `System.Runtime.CompilerServices.CallSite' が定義されていないか、インポートされていません

エラー CS0518: 定義済みの型 System.Runtime.CompilerServices.CallSite1' が定義されていないか、インポートされていません

エラー CS0518: 定義済みの型 `System.Runtime.CompilerServices.CallSite' が定義されていないか、インポートされていません

エラー CS0518: 定義済みの型 System.Runtime.CompilerServices.CallSite1' が定義されていないか、インポートされていません

エラー CS0518: 定義済みの型 `System.Runtime.CompilerServices.CallSite' が定義されていないか、インポートされていません

エラー CS0518: 定義済みの型 System.Runtime.CompilerServices.CallSite1' が定義されていないか、インポートされていません

エラー CS0518: 定義済みの型 `System.Runtime.CompilerServices.CallSite' が定義されていないか、インポートされていません

エラー CS0518: 定義済みの型 System.Runtime.CompilerServices.CallSite1' が定義されていないか、インポートされていません

エラー CS0518: 定義済みの型 `System.Runtime.CompilerServices.CallSite' が定義されていないか、インポートされていません

エラー CS0518: 定義済みの型 System.Runtime.CompilerServices.CallSite1' が定義されていないか、インポートされていません

エラー CS0518: 定義済みの型 `System.Runtime.CompilerServices.CallSite' が定義されていないか、インポートされていません

エラー CS0518: 定義済みの型 System.Runtime.CompilerServices.CallSite1' が定義されていないか、インポートされていません

このエラーの原因となっているスクリプトのセクション (簡略化) は次のとおりです。

注: 関数を複数の小さな関数に分割することはできません。関数はそのままにしておく必要があります。必要に応じて 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};
    }
}

問題が何であるかを理解できませんでした (はい、Google を使用しても、考えられる解決策がいくつか出てきましたが、試してみましたが、私の問題は解決していないようです)。

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

Tuples で行ったのと同じ問題が発生しています。dynamic.Net Framework 4.0 で導入され、Unity のバージョンの Mono には存在しない動的言語ランタイム (DLR) が必要です。

そうは言っても、ここにあるコンテキストを考えると、「私の関数はそのままにしておく必要があります。必要に応じて return ステートメントを編集できます」というメモは、現在の設定がまったく必要ないことを示しています。オブジェクトを使用して値を保持できない理由が本当にわかりません(使用した名前により、例の論理名を思いつくのが非常に難しくなっています):

    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 に答える