【问题标题】:Convert this multidimensional array definition in c# line to UnityScript for Unity将 c# 行中的这个多维数组定义转换为 UnityScript for Unity
【发布时间】:2014-07-05 06:20:16
【问题描述】:

我正在关注this unity tutorial,但我正在将脚本转换为 UnityScript。

大部分情况都很好,但是这条线让我很困惑。

Color[][] tiles = new Color[numTilesPerRow*numRows][];

我认为我应该做这样的事情,但它不起作用。

var tiles = new Color[numTilesPerRow*numRows][];

我收到一个错误:

';' expected. Insert a semicolon at the end.

编辑:

这是我要完整转换的函数:

Color[][] function ChopUpTiles() {
    int numTilesPerRow = terrainTiles.width / tileResolution;
    int numRows = terrainTiles.height / tileResolution;

    Color[][] tiles = new Color[numTilesPerRow*numRows][];

    for (int y=0; y<numRows; y++) {
        for (int x=0; x<numTilesPerRow; x++) {
            tiles[y*numTilesPerRow + x] = terrainTiles.GetPixels(x*tileResolution, y*tileResolution, tileResolution, tileResolution);
        }
    }

    return tiles;
}

编辑 2:

我已经想出了如何让它工作,但我收到了一个沮丧的警告:

var tiles = new Array();

工作,但问题是我不知道暗示这是一个颜色数组的数组,我收到了一个向下警告。

【问题讨论】:

  • 嗯,根据我回答中链接中的信息,现在可以声明多维数组了,但是锯齿状的数组还是不见了。所以你坚持用 C# 编写它们,或者根本不使用它们。为什么你仍然使用Javascript? C# 得到了更好的支持,你可以使用 Visual Studio,这很棒:P 另外,我还不确定,但似乎 Unity 无论如何都会将 JS 编译成 .NET,所以主要是关于语法。
  • 只是出于好奇,关于锯齿状数组的讨论从何而来?数组大小将始终为tiles[numTilesPerRow*numRows][tileResolution*tileResolution]

标签: c# unity3d unityscript


【解决方案1】:

锯齿状数组在 Javascript 中不能这样工作。

看看这个解决方案:http://answers.unity3d.com/questions/54695/how-to-declare-and-initialize-multidimensional-arr.html

基本上,获取一个数组,然后将每个索引初始化为一个新数组。

当然,如果是静态初始化的,可以这样使用:

[[1, 3, 4], [1, 5, 5], ... ]

您使用交错数组而不是简单的多维数组有什么原因吗?

【讨论】:

  • 您链接的示例与我正在做的相反。无论我尝试什么,我总是会收到错误或沮丧的警告。数组不是静态初始化的,数据是从图像纹理中剥离出来的。我在问题的编辑中包含了完整的 c# 代码。
  • @SystemicPlural 在这种情况下,您可能不得不作弊 - wiki.unity3d.com/index.php?title=JavascriptMultiDimArrays。 Unity Javascript 显然做不到。即使这样也不允许你 return 数组,所以你还是搞砸了。对于这个小sn-p,我只是使用C#,你应该没问题。
  • Luaan,出于性能原因,Microsoft 建议使用锯齿状数组而不是多维数组。例如这个'warning' 和这个question
  • @DaanTimmer:是的,我知道这一点。但我不知道 Javascript 在 Unity 中是如何工作的,所以它可能相关也可能不相关。我并不质疑在 C# 中将锯齿状数组用于纹理数据。我说的是 Javascript 版本,它很可能有一个完全不同的内存管理器。当然,仍然存在一些性能原因,但这完全取决于 Unity 的 JS 引擎。
  • @Luaan Oke,我的错,我以为你在质疑他在 C# 中使用锯齿状数组。
【解决方案2】:

我设法通过首先将颜色数组分配给一个变量来防止向下转换警告。不知道为什么在不直接分配的情况下这是可以接受的。

function ChopUpTiles() {
    var numTilesPerRow = terrainTiles.width / tileResolution;
    var numRows = terrainTiles.height / tileResolution;

    var tiles = new Array();

    for(var y : int = 0; y < numRows; y++) {
        for(var x : int = 0; x < numTilesPerRow; x++) {
            var tileColors = terrainTiles.GetPixels(
                x*tileResolution, 
                y*tileResolution, 
                tileResolution, 
                tileResolution
            );
            tiles[y*numTilesPerRow + x] = tileColors;
        }
    }
    return tiles;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-23
    • 2012-11-12
    • 2021-05-11
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多