2012-11-23 41 views
2

我想轉換(和理解)這個簡化的代碼從unityscript到C#:統一C#數組類型的錯誤(從unityscript轉換時)

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"); 
} 

完整的代碼可以在這裏找到:Creating a Drag and Drop Spell Bar

我在這拍在C#(而忽略了keymappings):

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"); 
} 
} 

錯誤我來到這裏是OnGui,使用DrawButton時(的ActionList i)。 錯誤:。不能將「對象」表情輸入「UnityEngine,矩形」

我沒有在任何unityscript或有經驗的程序員C#我搜索谷歌幾個小時,試圖解釋,的ArrayList等,但不能找到解決方案提前thnx!

編輯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 
} 
+1

這不是Java。它可能是Javascript,但它不是Java。 –

+0

當我聽到有人混淆「Java」和「Javascript」時,我很畏縮。有些表面的相似點 - 但在最重要的方面,「Java」和「Javascript」是分開的。我編輯了帖子並將標題更改爲「Javascript」。 – paulsm4

+0

Thnx,編輯Java到JavaScript。 N00b – downdf

回答

1

不同的JavaScript,C#是強類型的,這意味着你不能傳遞一個object到索要​​Rectangle的方法。您必須提供確切類型的方法,或從該類型派生的子項。

所以,與其

private object[][] actionList; 

你應該有

private Rectangle[][] actionList; 

強類型語言進行大量的編譯時間驗證的,看看,如果你不錯誤的變量類型傳遞給錯誤的方法參數。優點有兩點,首先,您不必在運行時執行測試,以確定該變量的類型是否正確。其次,它提供了一種簡單的方法來查找代碼中的錯誤,而無需運行它的每個部分。如果編譯完成,你已經完成了80%。

但是,如果您想在該數組中組合不同類型,則可以有多種選擇。你可以使用一個類像Tuple<>一組對象不具有匹配的類型相結合,也可以像餵養方法之前投你objectRectangle

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

但是,如果中投無效,你會得到一個運行時斷言。

+0

Thnx快速回復!我無法在Unity中找到關於Tuple <>的文檔(不知道如何實現),但是投射到矩形的作品。你會說它不是正確的方法嗎?如果是這樣,你會建議,而不是對象數組? thnx – downdf

+0

@downdf:'Tuple <>'不是一個Unity類,它是一個.NET 4+類,但實質上,它只是圍繞一組對象的通用包裝。比方說,你總是有一個矩形和一個名字的字符串。你可以做'List >'。所以,這是一個總是包含字符串和矩形組合的列表。 http://msdn.microsoft.com/en-us/library/system.tuple(v=vs.100).aspx最好的方法是,如果您可以在沒有投射的情況下進行管理,因爲它涉及一些運行時成本,並且通常會使代碼更容易閱讀,因爲你知道什麼是什麼。但是如果你喜歡它,也可以。 – LightStriker

+0

我編輯我的OP與相關的問題(希望這是事情完成的方式),將不勝感激,如果你可以看看它。乾杯! – downdf