66 lines
2.0 KiB
C#
66 lines
2.0 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);
|
|
}
|
|
|
|
Debug.Log($"[FlatWorldGenerator] Generated {chunksX * chunksZ} chunks.");
|
|
}
|
|
|
|
[System.Serializable]
|
|
public struct LayerDef
|
|
{
|
|
public string blockId;
|
|
[Min(1)] public int height;
|
|
}
|
|
}
|