将图块动态添加到基于网格的地图

Dynamically adding tiles to a grid based map

我想要一张可以无限探索的地图。该计划是创建游戏图块类别(道路、障碍物、建筑物),并在玩家接近现有图块集的边缘时随机选择要添加的游戏图块类别。一旦玩家距离该瓷砖 2 个网格方块,瓷砖也将被销毁。目前我正在使用需要大小初始值设定项的多维数组。

我目前拥有的:

public class GameManager : MonoBehaviour
{
    private GameObject[,] tileArray;
    public GameObject groundTile;
    public GameObject player;

    private int tileSize = 80;
    private int nextFarX = 1;
    private int nextFarZ = 1;
    private int nextNearX = -1;
    private int nextNearZ = -1;
    private float padding = .1f;

    private int arrayOffset;
    private int arrayDimension;

    // Use this for initialization
    void Start ()
    {
        arrayDimension = 200;
        arrayOffset = arrayDimension / 2;
        tileArray = new GameObject[,];
        this.AddCubeAt(0, 0);
    }

    // Update is called once per frame
    void Update () {
        var x = Convert.ToInt32(player.transform.position.x / tileSize);
        var z = Convert.ToInt32(player.transform.position.z / tileSize);

        for (int i = -1; i < 2; i++)
        {
            for (int j = -1; j < 2; j++)
            {
                var checkX = x + i;
                var checkZ = z + j;
                if (tileArray[checkX + arrayOffset, checkZ + arrayOffset] == null)
                {
                    //player is less than 2 tiles away from this grid, add a tile
                    this.AddCubeAt(checkX, checkZ);
                }
            }
        }
        // feels like a hack, but it will remove tiles that are not touching the tile that the player occupies
        for (int i = 0; i < 6; i++)
        {
            for (int j = 0; j < 6; j++)
            {
                if (i == 0 | i == 5 | j == 0 | j == 5)
                {
                    if (tileArray[x + (i-2) + arrayOffset, z + (j-2) + arrayOffset] != null)
                    {
                        Destroy(tileArray[x + (i - 2) + arrayOffset, z + (j - 2) + arrayOffset]);
                        tileArray[x + (i - 2) + arrayOffset, z + (j - 2) + arrayOffset] = null;
                    } 
                }
            }
        }
    }

    private void AddCubeAt(int x, int z)
    {
        var pos = new Vector3(x * tileSize, 0, z * tileSize);
        var rot = Quaternion.identity;
        GameObject newCube = (GameObject)Instantiate(groundTile, pos, rot);
        tileArray[x + arrayOffset, z + arrayOffset] = newCube;
    }
}

解决这个问题的更好方法是什么?

您应该熟悉图形数据结构(而不​​是邻接矩阵实现)。它更适合这项任务。而且,我会解决这个

Tiles will also be destroyed once the player is 2 grid squares away from that tile

换一种方式:每次玩家改变他的位置时,我都会从 DFS 目标深度开始(在你的情况下是 2)并移除找到的方块。

决定使用简单的字典和方法来 query/update 它:

private GameObject RetrieveTileAt(int x, int z)
{
    string key = string.Format("{0}.{1}", x, z);
    if (tileDictionary.ContainsKey(key))
    {
        return tileDictionary[key];
    }
    else
    {
        return null;
    }
}

private void InsertTileAt(int x, int z, GameObject tile)
{
    string key = string.Format("{0}.{1}", x, z);
    tileDictionary[key] = tile;
}

它不是一个无限大的网格,(int min + int max)squared,但它应该远远超过我需要的。