,由于我们无法序列化多维数组(Unity),因此我们仅限于使用一个维数阵列以及数学来从x,y对转换为索引并返回。这是当前的转换算法:
int Width = 3; // Number of cells along the x axis
int Height = 3; // Number of cells along the y axis
GameObject[] Cells = new GameObject[ Width * Height ];
public int CalculateIndex( int x, int y )
{
return y * Width + x;
}
public void CalculateXY(int i, out x, out y)
{
x = i % Width;
y = i / Width;
}
现在,我有一个问题,需要创建一个3维网格,该网格引入深度以及Z轴,但我不知道如何将更改注入上面的方法...我有精神障碍。
我找到了这篇文章,解释了其中的一些内容:
如何弄平或"索引"1D数组中的3D阵列?
但是,我的数组不在高度,宽度,深度(y,x,z)顺序中,而是宽度,高度,深度(x,y,z)顺序。此外,我需要算法将其从索引返回x,y,z值。
谢谢-Jeff
编辑:请检查pijemcolu共享的链接,好的解释在那里。
~~
我正在使用JS代码,以便您/其他人可以直接在下面进行测试。
您要寻找的主要功能是:
function CalculateIndex(x, y, z)
{
return (x * HEIGHT * DEPTH) + (y * DEPTH) + z;
}
function CalculateXYZ(i)
{
var ret = {};
ret.x = Math.floor(i / (DEPTH * HEIGHT));
ret.y = Math.floor(i / DEPTH) % HEIGHT;
ret.z = i % DEPTH;
return ret;
}
注意:当您使用C#中的int
数据类型时,您不需要使用floor
。
$(function(){
$('#process').click(function(){
var WIDTH = +$('#w').val();
var HEIGHT = +$('#h').val();
var DEPTH = +$('#d').val();
var _x = +$('#X').val();
var _y = +$('#Y').val();
var _z = +$('#Z').val();
if(_x >= WIDTH || _y >= HEIGHT || _z >= DEPTH)
{
$('#output').text('Invalid input');
return;
}
function CalculateIndex(x, y, z)
{
return (x * HEIGHT * DEPTH) + (y * DEPTH) + z;
}
function CalculateXYZ(i)
{
var ret = {};
ret.x = Math.floor(i / (DEPTH * HEIGHT));
ret.y = Math.floor(i / DEPTH) % HEIGHT;
ret.z = i % DEPTH;
return ret;
}
var ind = CalculateIndex(_x, _y, _z);
var retXYZ = CalculateXYZ(ind);
$('#output').html('Calculated index is: ' + ind + '<br/>' + 'Calulated X Y Z are: ' + JSON.stringify(retXYZ));
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>Width: <input id='w' type='number' value='4' min=0></p>
<p>Height: <input id='h' type='number' value='3' min=0></p>
<p>Depth: <input id='d' type='number' value='2' min=0></p>
<hr>
<p>x: <input id='X' type='number' value='0' min=0></p>
<p>y: <input id='Y' type='number' value='0' min=0></p>
<p>z: <input id='Z' type='number' value='0' min=0></p>
<p><button id='process'>Process X Y Z</button></p>
<div id='output'></div>