Как реализовать чанк (кусок игровоего мира)?

Всем привет, я делаю игру в 2D на Godot 4 и хочу реализовать мир, состоящий из чанков. То есть у меня есть клетка (1х1 квадратный метр) и из клеток состоит чанк (32х32 клетки), а из чанков и состоит игровой мир.

Я сделал реализацию, но думаю, что что-то упускаю и хотел бы увидеть шаблоны, уроки или другой материал, который бы мне помог, ибо информации, что я находил, было мало и была она в основном для 3D.

Кому интересно, моя реализация выглядит так:

using Godot;

namespace GridGame.Scripts;

public class Cell
{
    public int ID;
    public string Name;

    public Vector2I ChunkPosition; // from 0 to 32
    public Vector2I GridPosition; // WorldCoords

    public CellType Type;
   
    public Cell(int ID, Vector2I GridPosition)
    {
        SetID(ID);
        this.GridPosition = GridPosition;
    }

    public void SetID(int ID) // Rework for autocomplete information
    {
        this.ID = ID;
    }
}
public enum CellType
{
    None,
    Air,
    Ground
}
using Godot;

namespace GridGame.Scripts;

public class Chunk
{
    public const int CHUNK_SIZE = 32; // i.e. 32x32

    public Vector2I GridPosition;

    public bool Visible = true;

    public Cell[,] Cells;

    public Chunk(Vector2I GridPosition)
    {
        this.GridPosition = GridPosition;
    }

    public void GenerateCells() // Needs to be redesigned to be importable
    {
        Cells = new Cell[CHUNK_SIZE, CHUNK_SIZE];

        // To get GridPosition (check note :D)
        int FirstX = CHUNK_SIZE * GridPosition.X; 
        int FirstY = CHUNK_SIZE * GridPosition.Y;

        Vector2I CellGridPos = Vector2I.Zero;

        for (int x = 0; x < CHUNK_SIZE; x++)
        {
            for (int y = 0; y < CHUNK_SIZE; y++)
            {
                CellGridPos.X = FirstX + x;
                CellGridPos.Y = FirstY + y;
                Cells[x, y] = new Cell(1, CellGridPos);
            }
        }
    }
}
using Godot;
namespace GridGame.Scripts;

public partial class Grid : TileMap
{
    public const int BlackID = 0;
    public const int WhiteID = 1;

    public Chunk[,] Chunks;

    public int ChunksCount = 16;

    public FastNoiseLite Noise;
    public int Seed = 0;
    public override void _Ready()
    {
        Noise = new FastNoiseLite();
        Chunks = new Chunk[ChunksCount, ChunksCount];
        for(int x = 0; x < ChunksCount; x++)
        {
            for (int y = 0; y < ChunksCount; y++)
            {
                Chunks[x, y] = new Chunk(new Vector2I(x, y));
                Chunks[x, y].GenerateCells();
            }
        }
        DrawGrid();
    }

    public override void _PhysicsProcess(double delta)
    {
        if (Input.IsActionJustPressed("f1"))
        {
            Seed += 1;
            Noise.Seed = Seed;
            DrawGrid();
        }
    }

    public void DrawGrid()
    {
        for (int x = 0; x < ChunksCount; x++)
        {
            for (int y = 0; y < ChunksCount; y++)
            {
                if (Chunks[x, y].Visible)
                {
                    DrawChunk(x, y);
                }
            }
        }
    }

    public void DrawChunk(int x, int y)
    {
        for (int x2 = 0; x2 < Chunk.CHUNK_SIZE; x2++)
        {
            for (int y2 = 0; y2 < Chunk.CHUNK_SIZE; y2++)
            {
                int CellID = Chunks[x, y].Cells[x2, y2].ID;
                Vector2I CellPosition = Chunks[x, y].Cells[x2, y2].GridPosition;

                if (Noise.GetNoise2D(CellPosition.X, CellPosition.Y) >= 0)
                {
                    SetCell(0, CellPosition, WhiteID, new Vector2I(0, 0));
                }
                else
                {
                    SetCell(0, CellPosition, BlackID, new Vector2I(0, 0));
                }
            }
        }
    }

    public void EraseChunk(int x, int y)
    {
        for (int x2 = 0; x2 < Chunk.CHUNK_SIZE; x2++)
        {
            for (int y2 = 0; y2 < Chunk.CHUNK_SIZE; y2++)
            {
                Vector2I CellPosition = Chunks[x, y].Cells[x2, y2].GridPosition;
                SetCell(0, CellPosition, -1);
            }
        }
    }
}

Ответы (0 шт):