基本上,我正在创建一个基于体素的游戏。我有一个对象Chunk
,其中包含对象Voxel
的三维数组。在Voxels
数组中,Voxel目前有一个isAir bool,表示没有体素在那里。
我正在尝试向Chunk
添加一个属性,该属性返回一个位于块表面的Voxel
的二维数组。目前,此数组在Y值较低时始终为Voxel.isAir == false
,在较高Y值中始终为Voxel.isAir == true
,在数组的“Y”轴上从未有明确的运行,这些都是“空气” “s或全部Voxel
,并且数组中的Voxel
下面永远不会有”空气“。
要仅获取“Surface”Voxel
,我已将此代码添加到Chunk
:
public Voxel[,,] Voxels { get; set; }
private Voxel[,] _surfaceVoxels = null;
public Voxel[,] SurfaceVoxels
{
get
{
if (_surfaceVoxels == null)
{
_surfaceVoxels = new Voxel[this.Voxels.GetLength(0), this.Voxels.GetLength(2)];
for (var x = 0; x < this.Voxels.GetLength(0); x++)
{
for (var z = 0; z < this.Voxels.GetLength(2); z++)
{
for (var y = 0; y < this.Voxels.GetLength(1); y++)
{
Voxel v = this.Voxels[x, y, z];
var solidAbove = false;
var solidBelow = false;
if (y - 1 >= 0)
{
Voxel vBelow = this.Voxels[x, y - 1, z];
solidBelow = !vBelow.isAir;
}
if (y + 1 < this.Voxels.GetLength(1))
{
Voxel vAbove = this.Voxels[x, y + 1, z];
solidAbove = !vAbove.isAir;
}
if (!v.isAir && !solidAbove && solidBelow)
{
_surfaceVoxels[x, z] = v;
}
}
}
}
}
return _surfaceVoxels;
}
}
以这种方式计算表面体素在计算上是昂贵的,我无法看到更快的方法。因此我有效地“缓存”表面阵列,这一点很好,直到底层三维阵列发生变化,因为表面体素显然需要重新计算。
在get
的{{1}}上是否有某种方式它只返回数组的克隆而不是数组本身,并在public Voxel[,,]
上设置整个数组并设置{{ 1}}到set
,或者更好的是,当数组中的值发生变化时,有一些廉价的方法来执行代码吗?
有没有更有效的方法来完成我在这里解释的我忽略的内容?