gpt4 book ai didi

c# - Unity C# 数组类型错误(从 unityscript 转换时)

转载 作者:太空宇宙 更新时间:2023-11-03 13:51:41 25 4
gpt4 key购买 nike

我正在尝试将这段简化的代码从 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");
}

完整代码可以在这里找到:Creating a Drag and Drop Spell Bar

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

我在这里遇到的错误是在 OnGui 中,当使用 DrawButton(actionList i ) 时。错误:无法将“object”表达式转换为类型“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
}

最佳答案

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

所以,而不是

private object[][] actionList;

你应该有

private Rectangle[][] actionList;

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

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

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

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

关于c# - Unity C# 数组类型错误(从 unityscript 转换时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13536233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com