我正在为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个食物)并且不可能得到。我的想法是建立一个物体的水平(&#34;障碍物&#34;)及其副本,我真的不知道这个想法是否合理,但我想尝试。
如果以任何方式或任何方法在地点产生食物对象,使它们不与障碍物重叠,比如检查空间是否已被占用,或检查食物是否与食物对象相交的方法如果有人教我,我会非常感激,因为我此刻真的迷失了。
答案 0 :(得分:0)
假设你的食物只有一个单位长,你可以用一个协程来检查食物游戏对象周围是否有东西,如果没有任何东西,你可以产生它。
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;
}