【问题标题】:Instantiate blocks evenly between two instantiated objects在两个实例化对象之间均匀实例化块
【发布时间】:2021-05-31 18:19:00
【问题描述】:

我正在随机 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);
            }
        }
    }
}

【问题讨论】:

    标签: c# unity3d object instantiation


    【解决方案1】:

    希望我的问题是正确的,如果我错了,请添加更多细节,但现在你的变量“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 更改为所需的块数)

    希望这可以阐明其工作原理并且有意义。祝你好运!

    【讨论】:

    • 感谢您的回复。我会尝试第一种方式,看看我的情况如何,但你的第二种方式听起来更像是我正在寻找的东西,因为感觉将红色块均匀地放在两个障碍物之间会更准确。如果可以的话,如果您能提供更多关于这方面的信息,我将不胜感激。
    • ** 现在你的变量“obstacleSpawn”是一个随机时间,然后这个变量越小,生成的对象就越靠近。因此,您正在使用时间来测量对象之间的距离。 ** 这是对的。我觉得这是在不同距离生成障碍物的最佳方法,但如果您有其他建议这样做可以更容易生成红色块,我愿意接受建议。
    • 好的,我添加了一个编辑,希望能为您解决这个问题
    • 谢谢您,似乎更清楚了,但我遇到了一个问题,希望您能提供帮助。我已经设法设置障碍物列表并让它们像以前一样生成,但我在实现你的“distanceBetweenBlocks”代码时遇到了麻烦。由于列表没有长度属性,所以我将其替换为 Count,但出现以下错误: - ArgumentOutOfRangeException:索引超出范围。必须是非负数且小于集合的大小。参数名称:index - 此外,障碍物会因此错误而停止生成。有什么建议吗?
    • 干杯,感谢您对此的帮助。现在开始有所收获。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多