Unity-如何让玩家远离墙壁

时间:2018-08-02 15:04:15

标签: unity3d position procedural-programming

因此,我整理了一个过程生成的地图,当我单击它时,该地图会随机更改。它的作用是在平面上循环并根据正方形的位置(与randomfillpercent相比)随机生成网格。如果地图坐标标记为1,则为墙;如果标记为0,则为开放空间。我遇到一个问题,如果我单击地图,则玩家球体最终会出现在随机生成的墙内。如果球员的位置等于一堵墙的地图坐标,我想这样做,然后将其向下移动到地图上,直到到达开放空间。不幸的是,我一直收到空引用错误。我可以给我一些想法,我将不胜感激。这是我的变量和我的RandomFillMap函数。我没有显示整个代码。如果您需要看什么,请告诉我。谢谢。

public class MapGeneratorCave : MonoBehaviour {

public int width;
public int height;

public string seed;
public bool useRandomSeed;
public GameObject player;
int[,] playerPosition;

[Range(0, 100)]
public int randomFillPercent;

int[,] map;

void Start()
{
    GenerateMap();
}

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        GenerateMap();
    }
}

void GenerateMap()
{
    map = new int[width, height];
    RandomFillMap();

    for (int i = 0; i < 5; i++)
    {
        SmoothMap();
    }

    ProcessMap();

    int borderSize = 1;
    int[,] borderedMap = new int[width + borderSize * 2, height + borderSize * 2];

    for (int x = 0; x < borderedMap.GetLength(0); x++)
    {
        for (int y = 0; y < borderedMap.GetLength(1); y++)
        {
            if (x >= borderSize && x < width + borderSize && y >= borderSize && y < height + borderSize)
            {
                borderedMap[x, y] = map[x - borderSize, y - borderSize];
            }
            else
            {
                borderedMap[x, y] = 1;
            }
        }
    }

    MeshGenerator meshGen = GetComponent<MeshGenerator>();
    meshGen.GenerateMesh(borderedMap, 1);
}



 void RandomFillMap()
{
    int playerX = (int)player.transform.position.x;
    int playerY = (int)player.transform.position.y;

    if (useRandomSeed)
    {
        seed = Time.time.ToString();
    }

    System.Random pseudoRandom = new System.Random(seed.GetHashCode());

    for (int x = 0; x < width; x++)
    {
        for (int y = 0; y < height; y++)
        {
            if (x == 0 || x == width - 1 || y == 0 || y == height - 1)
            {
                map[x, y] = 1;
            }
            else
            {
                map[x, y] = (pseudoRandom.Next(0, 100) < randomFillPercent) ? 1 : 0;
            }
            if (playerPosition[playerX, playerY] == map[x, y] && map[x, y] == 1) 
            {
                playerPosition[playerX, playerY] = map[x, y - 1];
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您可能会得到null引用,因为playerPosition [playerX,playerY]不存在。

您应该使用Vector2代替多维数组(int [,])

然后您将执行以下操作:

for (int x = 0; x < width; x++)
{
    for (int y = 0; y < height; y++)
    {
        if (x == 0 || x == width - 1 || y == 0 || y == height - 1)
        {
            map[x, y] = 1;
        }
        else
        {
            map[x, y] = (pseudoRandom.Next(0, 100) < randomFillPercent) ? 1 : 0;
        }
    }
}

while(map[playerPosition.x, playerPosition.y] == 1){  
    playerPosition.y --; 
    // make sure you aren't out of bounds and such
}
相关问题