随机生成二维对象,但不与其他对象重叠
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;
}
我正在为 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;
}