Files
my-project/Assets/Blocks/Scripts/FlatWorldGenerator.cs
2026-04-17 02:14:56 +05:00

70 lines
2.3 KiB
C#

using UnityEngine;
/// <summary>
/// Генерирует плоский мир — слои блоков по всей сетке чанков.
/// Реализует простой интерфейс, который легко заменить на terrain-генератор.
/// </summary>
public class FlatWorldGenerator : MonoBehaviour
{
[Header("World Size (in chunks)")]
public int chunksX = 4;
public int chunksZ = 4;
[Header("Layers (bottom → top)")]
public LayerDef[] layers = new[]
{
new LayerDef { blockId = "stone", height = 3 },
new LayerDef { blockId = "dirt", height = 3 },
new LayerDef { blockId = "grass", height = 1 },
};
void Start()
{
if (WorldManager.Instance == null)
{
Debug.LogError("[FlatWorldGenerator] WorldManager not found.");
return;
}
Generate();
}
public void Generate()
{
for (int cx = 0; cx < chunksX; cx++)
for (int cz = 0; cz < chunksZ; cz++)
{
// Центрируем мир относительно нуля
var chunkPos = new Vector3Int(cx - chunksX / 2, 0, cz - chunksZ / 2);
var data = new ChunkData(chunkPos);
int currentY = 0;
foreach (var layer in layers)
{
for (int h = 0; h < layer.height; h++)
{
if (currentY >= ChunkData.HEIGHT) break;
for (int x = 0; x < ChunkData.SIZE; x++)
for (int z = 0; z < ChunkData.SIZE; z++)
data.SetBlock(x, currentY, z, layer.blockId);
currentY++;
}
}
WorldManager.Instance.CreateChunk(chunkPos, data);
}
// Перестраиваем все меши после создания всех чанков —
// иначе граничные грани между соседними чанками не скрываются
WorldManager.Instance.RebuildAllChunks();
Debug.Log($"[FlatWorldGenerator] Generated {chunksX * chunksZ} chunks.");
}
[System.Serializable]
public struct LayerDef
{
public string blockId;
[Min(1)] public int height;
}
}