在两个实例化对象之间均匀地实例化块

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

我在找两件事。

我尝试使用以下代码来执行此操作,但很明显,它会每隔 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 更改为你想要的块数)

希望这能弄清楚它是如何工作的并且它有意义。祝你好运!