防止玩家Unity旁边的怪物产卵

时间:2017-11-03 07:56:41

标签: c# unity3d

当网格中没有其他地方时,我试图让怪物在玩家旁边产生。这意味着在32个地方占用了36个地方。我正在使用while循环来防止怪物在我身上产生并阻止它们相互产生。

我在这种方法中尝试的是检查玩家的邻居,但它仍然会在玩家旁边产生。

// re-roll for reasons:
        // 1. can't be on top of player
        // 2. x and y is occupied
        while((randomX == selectedUnit.GetComponent<Unit>().tileX && randomY == selectedUnit.GetComponent<Unit>().tileY) ||
            occupationArray[randomX, randomY] == true) {

            //TODO if monsterList < 32 then monsters shouldn't spawn next to player
            if (monsterList.Count < 32 &&
                ((randomX == selectedUnit.GetComponent<Unit>().tileX && // x=0 y= 1 || -1
                Mathf.Abs(randomY - selectedUnit.GetComponent<Unit>().tileY) == 1) ||
                (Mathf.Abs(randomX - selectedUnit.GetComponent<Unit>().tileX) == 1 && // x= 1 || -1 y=0
                randomY == selectedUnit.GetComponent<Unit>().tileY))) {

                    randomX = Random.Range(0,6);
                    randomY = Random.Range(0,6);
            } else {
                randomX = Random.Range(0,6);
                randomY = Random.Range(0,6);
            }
        }

1 个答案:

答案 0 :(得分:0)

你的while循环只检查玩家的位置或怪物的占领,但不检查与玩家的距离。 因此,只有当您的第一个随机位置被命中时才输入数学部分。 如果你想坚持随机循环,你需要使距离计算成为while循环的一部分:

while((randomX == selectedUnit.GetComponent<Unit>().tileX && 
   randomY == selectedUnit.GetComponent<Unit>().tileY) ||
  occupationArray[randomX, randomY] == true ||
  (monsterList.Count < 32 && DistanceToPlayer(randomX, randomY) == 1)) {
                randomX = Random.Range(0,6);
                randomY = Random.Range(0,6);
      }