因此,我试图掌握c#的统一开发,对于我的第一个挑战,我决定制作一个我的世界克隆,以更好地理解顶点和网格。我已经成功创建了一个块系统,并且运行良好,但是我的问题是随机的平滑地形。
我的解决方案是创建一个整个世界大小的perlin噪音表,然后我将获得噪音表的特定部分放在每个块上。我已经尝试过了,但是出现错误
IndexOutOfRangeException: Array index is out of range
当我尝试访问表以获取块生成器中的高度时。
这是有问题的两个脚本:
脚本1:地形管理器
该脚本应该彼此相邻生成块,并且效果很好。
void Start () {
chunks = new Chunk[renderArea * renderArea];
worldHeightmap = PerlinNoise.GenerateHightmap(chunkSize * worldSize + 1, chunkHeight * worldSize + 1, worldSeed, worldSeedIntensity);
print(worldHeightmap.Length);
RVector3 chunkDimensions = new RVector3(chunkSize, chunkHeight, chunkSize);
for(int x = 1; x < renderArea + 1; x++) {
for(int z = 1; z < renderArea + 1; z++) {
Vector3 spawnPos = new Vector3(x * chunkSize, 0, z * chunkSize);
// Ignore this float [,] heightMapPeice = new float[x * chunkSize, z * chunkSize];
// Creates Chunk //
GameObject chunkHolder = Instantiate(block, block.transform.position, Quaternion.identity);
chunk = chunkHolder.GetComponent<Chunk>();
chunk.GenerateChunk(chunkDimensions, spawnPos, worldHeightmap, new Vector2(x, z));
chunks[chunkIndex] = chunk;
chunkIndex++;
}
}
print(chunks.Length + " Chunks Generated");
}
脚本2:块生成器
public void GenerateChunk (RVector3 chunkDimensions, Vector3 spawnPosition, float[,] chunkHeights, Vector2 heightIndex) {
chunkSize = chunkDimensions;
chunkBlocks = new Block[chunkSize.x + 1, chunkSize.y + 1, chunkSize.z + 1];
transform.position = spawnPosition;
for(int x = 0; x <= chunkSize.x; x++) {
for(int y = 0; y <= chunkSize.y; y++) {
for(int z = 0; z <= chunkSize.z; z++) {
chunkBlocks[x,y,z] = new Block(true);
//print(x * (int) heightIndex.x);
if(y < chunkHeights[x * chunkSize, z * chunkSize]) {
chunkBlocks[x,y,z] = new Block(false);
}
}
}
}
updateChunk();
}
如果我能在这方面得到一些帮助,将不胜感激。非常感谢<3。
答案 0 :(得分:0)
在我看来,您的问题源自以下3个for循环的范围:
for(int x = 0; x <= chunkSize.x; x++) {
for(int y = 0; y <= chunkSize.y; y++) {
for(int z = 0; z <= chunkSize.z; z++) {
您要从0
到chunkSize.<axis>
进行迭代,当我只能假设您只需要chunkSize.<axis> + 1
时,每个轴总共有chunkSize.<axis>
个迭代。您可以使用<
代替<=
for(int x = 0; x < chunkSize.x; x++) {
for(int y = 0; y < chunkSize.y; y++) {
for(int z = 0; z < chunkSize.z; z++) {