2

この単純化されたコードを unityscript から C# に変換 (および理解) しようとしています。

private var actionList = new Array();                                                           

function Start()
{
actionList = new Array(12);

for(i=0; i<actionList.length; i++) 
    actionList[i] = new Array(4);
for(i=0; i<actionList.length; i++)
{
    actionList[i][1] = Rect(50+(i*55),50, 50, 50);        
    actionList[i][2] = new Array("action");     
}
actionList[0][3] = KeyCode.Alpha1;
actionList[1][3] = KeyCode.Alpha2;
actionList[2][3] = KeyCode.Alpha3;
actionList[3][3] = KeyCode.Alpha4;
actionList[4][3] = KeyCode.Alpha5;
actionList[5][3] = KeyCode.Alpha6;
actionList[6][3] = KeyCode.Alpha7;
actionList[7][3] = KeyCode.Alpha8;
actionList[8][3] = KeyCode.Alpha9;
actionList[9][3] = KeyCode.Alpha0;
actionList[10][3] = KeyCode.Minus;
actionList[11][3] = KeyCode.Equals;
}

function OnGUI()
{
for(i=0; i<actionList.length; i++)
    {
    if(actionList[i][1] != null)
        drawButton(actionList[i][1]);
    }
}

function drawButton(rect)
{
    GUI.Button(rect, "Hello");
}

完全なコードはここにあります:ドラッグ アンド ドロップ スペル バーの作成

C#でこれを試してみました(キーマッピングは省略しています):

using UnityEngine;
using System.Collections.Generic;

public class SpellBar : MonoBehaviour
{
private object[][] actionList;

void Start()
{
actionList = new object[12][];

for (int i=0; i<actionList.Length; i++)
    actionList[i] = new object[4];
for (int i=0; i<actionList.Length; i++)
{
    actionList[i][1] = new Rect(50+(i*55), 50, 50, 50);
}

//Keymappings
}

void OnGUI() 
{
for(int i=0; i<actionList.Length; i++)
    {
    if(actionList[i][1] != null)
        DrawButton(actionList[i][1]);
    }
}

void DrawButton(Rect rect)
{
    GUI.Button(rect,"Hello");
}
}

ここで得られるエラーは、DrawButton(actionList i ) を使用するときに OnGui にあります。エラー: 「オブジェクト」式を「UnityEngine,Rect」型に変換できません。

私は unityscript または C# の経験豊富なプログラマーではありません。Lists、ArrayListsなどを試して、Googleを何時間も検索しましたが、解決策が見つかりません。事前にt​​hnx!

EDIT 27-11-2012
それで、私は新しい関連する問題に遭遇しました。ここでこれを編集する必要があるかどうかわかりませんが、返信で適切にフォーマットできませんでした。
変換しようとしている JavaScript コードでは、次のコードを使用してクラスを配列に格納します。

var openSlot = getNextSlot(actionList);    
if(openSlot != -1)
    actionList[openSlot][0] = new classEvilSmile();

これはまさに私が望む方法ではありませんが、メソッドを配列に格納できるようにしたいのですが、C# でそれを行う方法が見つかりません。それは単に不可能ですか?
(例) 私はこのようなことをしようとしています:

//In addition to what I posted above
void Start()
{
actionList[i][0] = void FireBall();
}

void FireBall()
{
Texture2D icon = Resources.Load("icon_fireball") as Texture2D;
String description = new String("Shoot a ball of fire");

//etc
}
4

1 に答える 1

1

objectJavascriptとは異なり、C#は強い型であるため、を要求するメソッドにを渡すことはできませんRectangle。その正確なタイプ、またはそのタイプから派生した子をメソッドに指定する必要があります。

だから、代わりに

private object[][] actionList;

あなたが持っている必要があります

private Rectangle[][] actionList;

強い型の言語は、多くのコンパイル時の検証を実行して、間違った変数型を間違ったメソッドパラメーターに渡していないかどうかを確認します。利点は2つあります。まず、変数が正しいタイプであるかどうかを知るために実行時にテストを実行する必要がありません。次に、コードのすべての部分を実行しなくても、コード内のエラーを簡単に見つけることができます。コンパイルすれば、すでに80%完了しています。

ただし、その配列内で異なるタイプを組み合わせる場合は、複数の選択肢があります。のようなクラスを使用しTuple<>て、一致するタイプを持たないオブジェクトのセットを結合するか、次のようなメソッドにフィードobjectする前ににキャストすることができます。Rectangle

DrawButton((Rectangle)actionList[i][1]);

ただし、キャストが無効な場合は、ランタイムアサーションを取得します。

于 2012-11-23T22:37:19.707 に答える