我随机实例化障碍物 X 秒,它们从屏幕上掉下来。我正在寻找一种方法来实例化落下障碍物之间的块。
这是坠落的障碍物: GIF Example
IEnumerator ObstacleSpawner()
{
while (true)
{
obstacleSpawn = Random.Range(0.25f, 0.9f);
yield return new WaitForSeconds(obstacleSpawn);
GameObject newObstacle = Instantiate(obstacle, new Vector2(-1, 6.5f), Quaternion.identity);
}
}
这就是我要找的: Example
我在寻找两件事。
如果下落的物体在一定距离内,则创建块。所以在我的代码中,如果障碍生成时间在 0.25 - 0.6 秒之间,则块不会生成。之后,障碍物生成时间越大,创建的块就越多。
让方块在障碍物之间均匀生成。如果一个块被实例化,它在两个障碍物的中间。如果是二、三等,则如上图所示均匀分布。
我已尝试使用以下代码执行此操作,但显然使用此代码时,它每 X 秒实例化一次,因为我是初学者,老实说,我不知道从哪里开始执行此操作,因此希望得到一些帮助。
IEnumerator BlockSpawner()
{
while (true)
{
yield return new WaitForSeconds(Random.Range(0.25f, 0.9f));
if (obstacleSpawn >= 0.5f && obstacleSpawn < 0.7f)
{
GameObject newBlock = Instantiate(block, new Vector2(Random.Range(-1.65f, 1.65f), 6.5f), Quaternion.identity);
}
else if (obstacleSpawn >= 0.7f && obstacleSpawn < 0.8f)
{
for (int i = 0; i < 1; i++)
{
GameObject go = Instantiate(Instantiate(block));
go.transform.position = new Vector2(Random.Range(-1.65f, 1.65f), 6.5f);
}
}
else if (obstacleSpawn >= 0.8f && obstacleSpawn < 0.9f)
{
for (int i = 0; i < 2; i++)
{
GameObject go = Instantiate(Instantiate(block));
go.transform.position = new Vector2(Random.Range(-1.65f, 1.65f), 6.5f);
}
}
else if (obstacleSpawn >= 0.9f)
{
for (int i = 0; i < 3; i++)
{
GameObject go = Instantiate(Instantiate(block));
go.transform.position = new Vector2(Random.Range(-1.65f, 1.65f), 6.5f);
}
}
}
}
答案 0 :(得分:0)
希望我的问题是正确的,如果我错了,请添加更多细节,但现在你的变量“obstacleSpawn”是一个随机时间,然后这个变量越少,对象产生的越近。因此,您正在使用时间来测量物体之间的距离。这很有效,但由于您希望均匀地生成对象,这会使事情变得更加复杂。
最简单的方法可能是在红色方块生成时随意调整它们的 y 位置,直到你做对为止。这看起来像 -
for (int i = 0; i < 2 i++)
{
GameObject go = Instantiate(Instantiate(block));
go.transform.position = new Vector2(Random.Range(-1.65f, 1.65f), newObstacle.transform.postition.y + (1 * i));
}
现在你需要从你的其他协程引用 newObstacle,或者你可以将“newObstacle”游戏对象/变量的范围更改为整个脚本(在顶部声明变量并在 ObstacleSpawner() 中更改它,如果说得通)。然后你可以在 "(1 * i)" 中使用 1 来获得不同的间距。
我推荐这个 ^ 但我也会用另一种方式解释 -
如果你真的想使用生成的障碍物,并划分它们之间的距离以获得精确的测量值,你可以,但它会更复杂。您需要引用最近生成的障碍物(例如 object1)和第二个最近生成的障碍物(例如 object2),然后您可以将它们的 y 距离除以您拥有的块数,例如,如果您有 3 个块spawn - ((object1.transform.position.y - object2.transform.position.y) / 3) - 这将返回每个块的 y 增量,然后你可以用这个替换之前的 (1 * 1)价值。
编辑 - 第二种方式的更多解释 - 最简单的方法是列出您生成的障碍物,然后使用列表中的最后 2 个障碍物并计算它们之间的距离。
要添加列表,请在脚本顶部添加如下所示的内容
private List<GameObjects> listOfObstacles;
然后在 ObstacalSpawner() 函数中,您将游戏对象添加到该列表“listOfObjects.Add(newObstacle)”,这将创建从第一个生成到最后一个(最近)的障碍列表。现在你可以用我之前说的方式把它们分开-
float distanceBetweenBlocks = ((listOfObjects[listOfObjects.Count - 2].transform.position.y - listOfObjects[listOfObjects.Count - 1].transform.position.y) / 3)
go.transform.position = new Vector2(Random.Range(-1.65f, 1.65f), listOfObjects[listOfObjects.Count - 2].transform.postition.y + (distanceBetweenBlocks * i));
“listOfObjects[listOfObjects.Count - 1]”会让你得到该列表中的最后一项(最近产生的对象),然后 -1 到长度会让你倒数第二,然后你就按照我说的去做之前,获取每个之间的距离并将其除以您想要的块数(您需要将 3 更改为您想要的块数)
希望这能说明它是如何工作的并且是有道理的。祝你好运!