【问题标题】:Spawn gameObject horde, modify concentration of spawned objects生成游戏对象部落,修改生成对象的集中度
【发布时间】:2016-09-27 08:24:46
【问题描述】:

我将如何创建一个非均匀随机生成的游戏对象(敌人),以模仿如下图所示的“部落”的形成:

我希望在前面有更多的游戏对象,而在后面逐渐减少。我想制作一个 Empty gameObject 并使用如下代码让敌人瞄准:

public Vector3 target : Transform;
if (target == null && GameObject.FindWithTag("Empty"))
{
       target = GameObject.FindWithTag("Empty").transform;
}

但是,这样做不会给我带来后面的 int 较少的“跟踪”效果。

这是我随机生成敌人的代码,如果有帮助的话:

void SpawnHorde()
{
    for (int i = 0; i < hordeCount; i++) 
    {
        Vector3 spawnPosition = new Vector3(Random.Range (0, 200), 50, Random.Range (0, 200));
        Instantiate(Resources.Load ("Prefabs/Sphere"), spawnPosition, Quaternion.identity);
    }
}

有人对如何实现这一点有建议吗?

我实现@Jerry 的代码后的结果:

更集中在前面;少在后面:)

【问题讨论】:

  • 如果你把上面的图像放在一个X-Y轴系统中,你可以从左到右逐步遍历X坐标,并且有一个函数可以告诉每个X坐标或偏移多少敌人沿 Y 线随机生成。例如,在X=0 随机生成 10 个敌人,然后在 X=1 生成 7 个,等等。类似指数衰减 (e^(-x)) 或线性衰减 (-ax + b),可能是二次的?随着 X 坐标的进展,您越能以数学方式描述 Y 线上的敌人数量,您获得的结果就越好。
  • Random 在该范围内生成一个随机数,并且通常在该范围内随着时间的推移非常均匀地分布。您真的希望能够设置随机数的均值和标准分布。我会查看this question,因为答案显示了如何为您的 x 轴值创建这种类型的分布。
  • 如果你想要一些灵感,你可以使用两个线性函数(这里是y = -2x + 100y = 2x - 100),它给出了你想要的敌人 y 位置的上下边界如果x = 0 to x = 50 则生成。这给了你想要的那条漂亮的“小径”。现在结合起来,较低的 x 值意味着产生更多的敌人,而较高的 x 值意味着产生更少的敌人(线性 lerping?;)),你就有了敌人的踪迹。 (i.stack.imgur.com/FpdOd.png)
  • @MaximilianGerhardt 感谢您的快速回复,这是个好主意,谢谢。我会尝试一下,看看我想出了什么。啊,我直到现在才看到你的新回复。我要向 Lithium 提到,我实际上可以在方程中使用系统时间来获得我想要的结果。但是哇,谢谢你花时间找到一个方程和一切。实际上这似乎更容易

标签: c# unity3d random unity5 non-uniform-distribution


【解决方案1】:

我会寻求 Maximilian Gerhardt 的建议。这是一些原始实现,供您根据需要进行调整。最重要的调整是在一列中定位,你可以用一些随机数来实现。

    void SpawnHorde()
    {
        int hordeCount = 200;
        float xPosition = 0;

        const int maxInColumn = 20;

        while (hordeCount > 0)
        {
            int numberInColumn = Random.Range(5, maxInColumn);
            hordeCount -= numberInColumn;

            if (hordeCount < 0)
                numberInColumn += hordeCount;

            for (int i = 0; i < numberInColumn; i++)
            {
                Vector3 spawnPosition = new Vector3(xPosition, 50, Random.Range(0, 100));
                Instantiate(Resources.Load("Prefabs/Sphere"), spawnPosition, Quaternion.identity);
            }

            xPosition += (float)maxInColumn * 2f / (float)hordeCount;
        }
    }

【讨论】:

  • 谢谢!我根据自己的喜好调整了一些东西zPosition += (float)maxInColumn * 20f / (float)hordeCount; 使它成为20f 而不是 2f,这样它们会更加分散,我还根据我的地形改变了它们的方向,因此zPosition。在我看到你的答案之前,我通过使用for 循环并根据位置减少每个循环中的对象数量找到了自己的解决方案,但我更喜欢你的答案!我将使用随附的成品图片来编辑我的回复。再次感谢
  • @crin 很高兴我能帮上忙!我看到了您的图像-您仍然可以使用列定位,这样战士就不会在同一个 x 中-它现在看起来很通用。干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
相关资源
最近更新 更多