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

时间:2021-05-31 18:19:00

标签: c# unity3d object instantiation

我随机实例化障碍物 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);
            }
        }
    }
}

1 个答案:

答案 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 更改为您想要的块数)

希望这能说明它是如何工作的并且是有道理的。祝你好运!

相关问题