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 等,但找不到解决方案。提前谢谢!

编辑 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

与 Javascript 不同,C# 是强类型的,这意味着您不能将 an 传递object给请求Rectangle. 您必须为该方法提供确切的类型,或从该类型派生的子项。

所以,而不是

private object[][] actionList;

你应该有

private Rectangle[][] actionList;

强类型语言会执行大量编译时验证,以查看您是否没有将错误的变量类型传递给错误的方法参数。优点有两个,首先您不必在运行时执行测试来知道变量是否属于正确的类型。其次,它提供了一种简单的方法来查找代码中的错误,而无需运行代码的每一部分。如果它编译,你已经完成了 80%。

但是,如果要在该数组中组合不同的类型,则有多种选择。您可以使用一个类Tuple<>来组合一组没有匹配类型的对象,或者您可以在将其提供objectRectangle方法之前将其转换为:

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

但是,如果强制转换无效,您将获得运行时断言。

于 2012-11-23T22:37:19.707 回答