在两个实例化对象之间均匀地实例化块
Instantiate blocks evenly between two instantiated objects
我在随机 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
我在找两件事。
如果落下的物体在一定距离内,则创建方块。所以在我的代码中,如果 obstacleSpawn 时间在 0.25 – 0.6 秒之间,方块就不会生成。之后,obstacleSpawn 时间越大,创建的方块越多。
让方块在障碍物之间均匀生成。如果实例化了一个块,则它位于两个障碍物的中间。如果是两个,三个等等,它们会像上图一样均匀分布。
我尝试使用以下代码来执行此操作,但很明显,它会每隔 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);
}
}
}
}
希望我的问题是对的,如果我错了,请添加更多细节,但现在你的变量“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”gameobject/variable 的范围更改为整个脚本(在顶部声明变量并更改它在 ObstacleSpawner() 如果有意义的话)。然后你可以在“(1 * i)”中使用1来获得不同的间距。
我推荐这个^但我也会用另一种方式解释-
如果你真的想使用障碍物生成,并划分它们之间的距离以获得精确的测量值,你可以,但它会更复杂。您需要引用最近产生的障碍物(例如对象 1)和第二个最近产生的障碍物(例如对象 2),然后您可以将它们的 y 距离除以您拥有的块数,比如您有 3 个块spawn - ((object1.transform.position.y - object2.transform.position.y) / 3) - 这将 return 每个块的 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 更改为你想要的块数)
希望这能弄清楚它是如何工作的并且它有意义。祝你好运!
我在随机 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
我在找两件事。
如果落下的物体在一定距离内,则创建方块。所以在我的代码中,如果 obstacleSpawn 时间在 0.25 – 0.6 秒之间,方块就不会生成。之后,obstacleSpawn 时间越大,创建的方块越多。
让方块在障碍物之间均匀生成。如果实例化了一个块,则它位于两个障碍物的中间。如果是两个,三个等等,它们会像上图一样均匀分布。
我尝试使用以下代码来执行此操作,但很明显,它会每隔 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);
}
}
}
}
希望我的问题是对的,如果我错了,请添加更多细节,但现在你的变量“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”gameobject/variable 的范围更改为整个脚本(在顶部声明变量并更改它在 ObstacleSpawner() 如果有意义的话)。然后你可以在“(1 * i)”中使用1来获得不同的间距。
我推荐这个^但我也会用另一种方式解释-
如果你真的想使用障碍物生成,并划分它们之间的距离以获得精确的测量值,你可以,但它会更复杂。您需要引用最近产生的障碍物(例如对象 1)和第二个最近产生的障碍物(例如对象 2),然后您可以将它们的 y 距离除以您拥有的块数,比如您有 3 个块spawn - ((object1.transform.position.y - object2.transform.position.y) / 3) - 这将 return 每个块的 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 更改为你想要的块数)
希望这能弄清楚它是如何工作的并且它有意义。祝你好运!