私は現在、Minecraftに触発された無限の世界に取り組んでいます。チャンクは 16x16x16のブロックで構成されています。ブロック(キューブ)は1x1x1です。
これは、私のコンピューターで12チャンク(12x16)のViewRangeを使用して非常にスムーズに実行されます。いいね。
チャンクの高さを256に変更すると、これは-明らかに-途方もない遅延になります。
だから私が基本的にやりたいことはチャンクを積み重ねることです。つまり、私の世界は[∞、16、∞]チャンクが大きくなる可能性があります。
問題は今、その場でチャンクを生成する方法ですか?
現時点では、自分の位置を中心にして(ほぼ遠くに)存在しないチャンクを生成しています。まだチャンクをスタックしていないので、これはそれほど複雑ではありません。
ここで重要な注意点として、私はまた、最小/最大の高さが異なるバイオームを持ちたいと思っています。だから、バイオームに平地ブロックと最も高い層は、8(8×16)になります-バイオームで山脈のブロックと最も高い層は、14(14x16)になります。例として。
私ができることは、例えば私の上と下に1チャンクをロードすることです。
しかし、ここでの問題は、異なるbioms間の遷移がyの1つのチャンクよりも大きくなる可能性があることです。
私の現在のチャンクの読み込みアクションで
完全を期すために、現在のチャンクは「アルゴリズム」をロードしています
private IEnumerator UpdateChunks(){
for (int i = 1; i < VIEW_RANGE; i += ChunkWidth) {
float vr = i;
for (float x = transform.position.x - vr; x < transform.position.x + vr; x += ChunkWidth) {
for (float z = transform.position.z - vr; z < transform.position.z + vr; z += ChunkWidth) {
_pos.Set(x, 0, z); // no y, yet
_pos.x = Mathf.Floor(_pos.x/ChunkWidth)*ChunkWidth;
_pos.z = Mathf.Floor(_pos.z/ChunkWidth)*ChunkWidth;
Chunk chunk = Chunk.FindChunk(_pos);
// If Chunk is already created, continue
if (chunk != null)
continue;
// Create a new Chunk..
chunk = (Chunk) Instantiate(ChunkFab, _pos, Quaternion.identity);
}
}
// Skip to next frame
yield return 0;
}
}