这是我的代码:(我认为函数vector
中的PopulateVoxelMap
与之有关]
public class Chunk
{
public ChunkCoord coord;
GameObject chunkObject;
MeshRenderer meshRenderer;
MeshFilter meshFilter;
int vertexIndex = 0;
List<Vector3> vertices = new List<Vector3>();
List<int> triangles = new List<int>();
List<Vector2> uvs = new List<Vector2>();
byte[,,] voxelMap = new byte[VoxelData.ChunkWidth, VoxelData.ChunkHeight, VoxelData.ChunkWidth];
World world;
public Chunk (ChunkCoord _coord, World _world)
{
coord = _coord;
world = _world;
chunkObject = new GameObject();
meshFilter = chunkObject.AddComponent<MeshFilter>();
meshRenderer = chunkObject.AddComponent<MeshRenderer>();
meshRenderer.material = world.material;
chunkObject.transform.SetParent(world.transform);
chunkObject.transform.position = new Vector3(coord.x * VoxelData.ChunkWidth, 0f, coord.z * VoxelData.ChunkWidth);
chunkObject.transform.name = "Chunk " + coord.x + ", " + coord.z;
PopulateVoxelMap();
CreateMeshData();
CreateMesh();
}
void PopulateVoxelMap()
{
for (int y = 0; y < VoxelData.ChunkHeight; y++)
{
for (int x = 0; x < VoxelData.ChunkWidth; x++)
{
for (int z = 0; z < VoxelData.ChunkWidth; z++)
{
voxelMap[x, y, z] = world.GetVoxel(new Vector3(x, y, z));
}
}
}
}
void CreateMeshData()
{
for (int y = 0; y < VoxelData.ChunkHeight; y++)
{
for (int x = 0; x < VoxelData.ChunkWidth; x++)
{
for (int z = 0; z < VoxelData.ChunkWidth; z++)
{
AddVoxelDataToChunk(new Vector3(x, y, z));
}
}
}
}
public bool isActive
{
get { return chunkObject.activeSelf; }
set { chunkObject.SetActive(value); }
}
public Vector3 position
{
get { return chunkObject.transform.position; }
}
bool IsVoxelInChunk(int x, int y, int z)
{
if (x < 0 || x > VoxelData.ChunkWidth - 1 || y < 0 || y > VoxelData.ChunkHeight - 1 || z < 0 || z > VoxelData.ChunkWidth - 1)
return false;
else
return true;
}
bool CheckVoxel(Vector3 pos)
{
int x = Mathf.FloorToInt(pos.x);
int y = Mathf.FloorToInt(pos.y);
int z = Mathf.FloorToInt(pos.z);
if (!IsVoxelInChunk(x, y, z))
return false;
}
void AddVoxelDataToChunk(Vector3 pos)
{
for (int p = 0; p < 6; p++)
{
if (!CheckVoxel(pos + VoxelData.faceChecks[p]))
{
byte blockID = voxelMap[(int)pos.x, (int)pos.y, (int)pos.z];
vertices.Add(pos + VoxelData.voxelVerts [VoxelData.voxelTris [p, 0]]);
vertices.Add(pos + VoxelData.voxelVerts [VoxelData.voxelTris [p, 1]]);
vertices.Add(pos + VoxelData.voxelVerts [VoxelData.voxelTris [p, 2]]);
vertices.Add(pos + VoxelData.voxelVerts [VoxelData.voxelTris [p, 3]]);
AddTexture(world.blocktypes[blockID].GetTextureID(p));
triangles.Add (vertexIndex);
triangles.Add (vertexIndex + 1);
triangles.Add (vertexIndex + 2);
triangles.Add (vertexIndex + 2);
triangles.Add (vertexIndex + 1);
triangles.Add (vertexIndex + 3);
vertexIndex += 4;
}
}
}
void CreateMesh()
{
Mesh mesh = new Mesh();
mesh.vertices = vertices.ToArray();
mesh.triangles = triangles.ToArray();
mesh.uv = uvs.ToArray();
mesh.RecalculateNormals();
meshFilter.mesh = mesh;
}
void AddTexture(int textureID)
{
float y = textureID / VoxelData.TextureAtlasSizeInBlocks;
float x = textureID - (y * VoxelData.TextureAtlasSizeInBlocks);
x *= VoxelData.NormalizedBlockTextureSize;
y *= VoxelData.NormalizedBlockTextureSize;
y = 1f - y - VoxelData.NormalizedBlockTextureSize;
uvs.Add(new Vector2(x, y));
uvs.Add(new Vector2(x, y + VoxelData.NormalizedBlockTextureSize));
uvs.Add(new Vector2(x + VoxelData.NormalizedBlockTextureSize, y));
uvs.Add(new Vector2(x + VoxelData.NormalizedBlockTextureSize VoxelData.NormalizedBlockTextureSize));
}
CheckVoxel
不在所有代码路径上返回有效的布尔值。返回true
的位置在哪里?该方法的正确版本可能是:布尔CheckVoxel(Vector3 pos){int x = Mathf.FloorToInt(pos.x);int y = Mathf.FloorToInt(pos.y);int z = Mathf.FloorToInt(pos.z);
if (!IsVoxelInChunk(x, y, z))
return false;
return true;
}
但是可以简单地重写为:
bool CheckVoxel(Vector3 pos)
{
int x = Mathf.FloorToInt(pos.x);
int y = Mathf.FloorToInt(pos.y);
int z = Mathf.FloorToInt(pos.z);
return IsVoxelInChunk(Mathf.FloorToInt(pos.x),
Mathf.FloorToInt(pos.y),
Mathf.FloorToInt(pos.z));
}
bool CheckVoxel(Vector3 pos)
{
int x = Mathf.FloorToInt(pos.x);
int y = Mathf.FloorToInt(pos.y);
int z = Mathf.FloorToInt(pos.z);
if (!IsVoxelInChunk(x, y, z))
return false;
}
例如,在此函数中,仅当!IsVoxelInChunk(x,y,z)时才返回。给定该函数是否返回false,该函数返回false,请更改:
if (!IsVoxelInChunk(x, y, z))
return false;
至:
return IsVoxelInChunk(x, y, z);