随机生成二维对象,但不与其他对象重叠

Spawning 2d objects randomly, but not overlapping with other objects

我正在为 UNITY 的学校开发一个小型游戏项目,特别是一款名为 Rattler Race 的贪吃蛇游戏的克隆版。我几乎是引擎的完全初学者,因此我有点挣扎。我们假设制作的游戏必须有 30 个复杂性递增的独特关卡,如下所示:Final level

我现在的主要问题是为蛇生成食物,这样它就不会与任何内墙或边界重叠。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpawnFood : MonoBehaviour
{
public GameObject FoodPrefab;

public Transform BorderTop;
public Transform BorderBottom;
public Transform BorderLeft;
public Transform BorderRight;
public Transform Obstacle;

Vector2 pos;

// Use this for initialization
void Start ()
{
    for (int i = 0; i < 10; i++) {
        Spawn();
    }
}

void Spawn()
{
    pos.x = Random.Range(BorderLeft.position.x + 5,BorderRight.position.x - 5);

    pos.y = Random.Range(BorderBottom.position.y + 5, BorderTop.position.y - 5);

    Instantiate(FoodPrefab, pos, Quaternion.identity);

}

// Update is called once per frame
void Update ()
{

}


}

代码当然很简单,因为此时游戏场地是空的,没有障碍物: Current state

但是我的问题是,如果我要放大那个红色的小障碍物,就像这样: Big Obstacle

食物会在它后面生成(每层有 10 个食物对象)并且无法获得。我的想法是建立一个对象("Obstacle")及其副本的关卡,我真的不知道这个想法是否合理,但我想尝试一下。

如果有任何方式或方法可以在某个位置生成食物对象,使它们不与障碍物重叠,比如检查 space 是否已被占用或检查 a 是否会被占用的方法食物对象与现有障碍物相交,如果有人教我,我将不胜感激,因为我现在真的迷路了。

假设你的食物恰好是一个单位长,你可以有一个协程来检查食物 gameObject 周围是否有东西,如果没有任何东西,你可以生成它。

public LayerMask layerMask; //Additional variable so you can control which layer you don't want to be detected in raycast

void Spawn(){
    StartCoroutine(GameObjectExists());
}


IEnumerator GameObjectExists(){

   do{
       yield return null;
       pos.x = Random.Range(BorderLeft.position.x + 5,BorderRight.position.x - 5);
       pos.y = Random.Range(BorderBottom.position.y + 5, BorderTop.position.y - 5);

   }while(Physics2D.OverlapCircle(new Vector2(pos), 1f, layerMask); //1f is the radius of your food gameObject.

  Instantiate(FoodPrefab, pos, Quaternion.identity);
  yield return null;
}