【问题标题】:How to Minimize code using loops and should not repeat random numbers?如何使用循环最小化代码并且不应该重复随机数?
【发布时间】:2026-02-12 20:20:03
【问题描述】:

我有 18 个游戏对象,我想将所有 18 个游戏对象定位在定义的随机位置。是的,我说定义的位置是因为我的游戏对象 z 位置只会随机变化,如 [0,60, 120, 180 等] 随机变化。请帮忙。

GameObject[] hurdles;
int randShared;

void Shart()
    {
        hurdles = GameObject.FindGameObjectsWithTag("Hurdles");
        randShared = Random.Range(0,19);

        if (randShared == 0)
        {
            hurdles[0].transform.position = new Vector3(0f, 0f, 0f);
            hurdles[1].transform.position = new Vector3(0f, 0f, 60f);
            hurdles[2].transform.position = new Vector3(0f, 0f, 120f);
            .
            .
            .
            hurdles[18].transform.position = new Vector3(0f, 0f, 120f);
        }

        if (randShared == 1)
        {
            hurdles[0].transform.position = new Vector3(0f, 0f, 120f);
            hurdles[1].transform.position = new Vector3(0f, 0f, 0f);
            hurdles[2].transform.position = new Vector3(0f, 0f, 60f);
            .
            .
            .
            hurdles[18].transform.position = new Vector3(0f, 0f, 120f);
        }

        if (randShared == 2)
        {
            hurdles[0].transform.position = new Vector3(0f, 0f, 60f);
            hurdles[1].transform.position = new Vector3(0f, 0f, 120f);
            hurdles[2].transform.position = new Vector3(0f, 0f, 0f);
            .
            .
            .
            hurdles[18].transform.position = new Vector3(0f, 0f, 120f);
        }

        .
        .
        .

        if (randShared == 18)
        {
            hurdles[0].transform.position = new Vector3(0f, 0f, 60f);
            hurdles[1].transform.position = new Vector3(0f, 0f, 120f);
            hurdles[2].transform.position = new Vector3(0f, 0f, 0f);
            .
            .
            .
            hurdles[18].transform.position = new Vector3(0f, 0f, 120f);
        }
    }

【问题讨论】:

    标签: c# unity3d optimization


    【解决方案1】:

    您可以循环您的范围并根据您的随机数以 60 的间隔创建一个偏移量。

    for (var i = 0; i < 19; i++)
    {
        var offset = i + randShared;
        if (offset > 18)
        {
            offset = offset - 19;
        }
    
        hurdles[i].transform.position = new Vector3(0f, 0f, (float)(offset * 60));
    
    }
    

    【讨论】:

      【解决方案2】:
      var rnd = new Random();
      for (var i = 0; i < 19; i++)
          hurdles[i].transform.position = new Vector3(0f, 0f, 60f * rnd.Next(4)));
      

      【讨论】:

      • 其工作但不是随机的,此代码按顺序生成 zPos。根据 randShared,只有第一个是随机的。我想要随机的 zPos。 @Zdravko Danev
      • 显示错误,键入UnityEngine.Random' does not contain a definition for Next' 并且找不到扩展方法Next' of type UnityEngine.Random'。您是否缺少程序集参考? @Zdravko Danev
      • 改成 System.Random
      • 好的,现在错误消失了。但所有障碍都出现在接下来的 4 个位置,其余 14 个位置是空的 :(