【问题标题】:Nested For Loops - generating a catan-style hex-grid in Unity嵌套 For 循环 - 在 Unity 中生成卡坦风格的十六进制网格
【发布时间】:2013-11-26 13:27:03
【问题描述】:

正如标题所示,我正在尝试使用 C# 在 Unity 中生成程序十六进制网格。

void Start () 
{
    //5 mid
     startRowSize = 5;

    for (int i = 0; i < startRowSize; i++)
    {
        GameObject newHex = (GameObject)Instantiate(hex);
        hexWidth = newHex.gameObject.renderer.bounds.size.z;
        newHex.transform.Rotate(new Vector3(0,30,0));
        newHex.transform.position = new Vector3((i * hexWidth),0,0);
    }

    for (int row = 0; row <= startRowSize-1; row ++)
    {
    for (int i = 0; i < row; i++)
    {
        GameObject newHex = (GameObject)Instantiate(hex);
        newHex.transform.Rotate(new Vector3(0,30,0));
        newHex.transform.position = new Vector3(((i*hexWidth)+((hexWidth/2))+(row*(hexWidth/2))),0,((startRowSize-row))*-(hexWidth/1.17f));
    }
    }
}

代码有效,但是行是“向后”生成的,这意味着外行包含较多的十六进制数,而内行包含最少的。

这显然是我试图达到的相反效果。我一直在弄乱这段代码好几个小时,我不知道为什么。

有什么想法吗?

【问题讨论】:

    标签: c# for-loop unity3d hexagonal-tiles


    【解决方案1】:

    因此,在又搞砸了几个小时的代码之后,我弄清楚了为什么它没有正确迭代。他是精炼的代码……

    void Start () 
    {
        //5 mid
         startRowSize = 10;
    
        for (int i = 0; i < startRowSize; i++)
        {
            GameObject newHex = (GameObject)Instantiate(hex);
            hexWidth = newHex.gameObject.renderer.bounds.size.z;
            newHex.transform.Rotate(new Vector3(0,30,0));
            newHex.transform.position = new Vector3((i * hexWidth),0,0);
        }
    
        for (int row = 0; row < startRowSize; row++)
        {
            for (int i = 0; i < startRowSize-1-row; i++)
                {
                    GameObject newHex = (GameObject)Instantiate(hex);
                    newHex.transform.Rotate(new Vector3(0,30,0));
    
                if (row == 0)
                    {
                        newHex.transform.position = new Vector3(((i*hexWidth)+(hexWidth/2)),0,-(hexWidth/1.17f));
                    }
                else
                    {
                        newHex.transform.position = new Vector3((i*hexWidth)+((row+1)*(hexWidth/2)),0,(row+1)*-(hexWidth/1.17f));
                    }
                }
        }
    
        for (int row = 0; row < startRowSize; row++)
        {
            for (int i = 0; i < startRowSize-1-row; i++)
                {
                    GameObject newHex = (GameObject)Instantiate(hex);
                    newHex.transform.Rotate(new Vector3(0,30,0));
    
                if (row == 0)
                    {
                        newHex.transform.position = new Vector3(((i*hexWidth)+(hexWidth/2)),0,(hexWidth/1.17f));
                    }
                else
                    {
                        newHex.transform.position = new Vector3((i*hexWidth)+((row+1)*(hexWidth/2)),0,(row+1)*(hexWidth/1.17f));
                    }
                }
        }
    }
    

    现在,谁能建议如何清理一下?我的脑袋都晕了……

    【讨论】:

      【解决方案2】:

      提示,Awake 发生在 Start() 之前。

      void Awake() 
      {
         //5 mid
        startRowSize = 10;
      
        for (int i = 0; i < startRowSize; i++)
        {
            GameObject newHex = HexCreator();
            hexWidth = newHex.gameObject.renderer.bounds.size.z;
            newHex.transform.position = new Vector3(i * hexWidth, 0, 0);
        }
      
        for (int row = 0; row < startRowSize; row++)
           for (int i = 0; i < startRowSize-1-row; i++)
           {
               GameObject newHex = HexCreator();
      
               if (row == 0)
                  newHex.transform.position = new Vector3(i*hexWidth + hexWidth/2, 0, -(hexWidth/1.17f));
      
               else
                  newHex.transform.position = new Vector3(i*hexWidth + ((row+1)*(hexWidth/2)), 0,(row+1)*-(hexWidth/1.17f));
          }
      
        for (int row = 0; row < startRowSize; row++)
           for (int i = 0; i < startRowSize-1-row; i++)
           {
              GameObject newHex = HexCreator();
      
              if (row == 0)
                  newHex.transform.position = new Vector3(i*hexWidth+ hexWidth/2, 0, hexWidth/1.17f);
      
              else
                  newHex.transform.position = new Vector3(i*hexWidth + ((row+1)*(hexWidth/2)), 0, (row+1)*(hexWidth/1.17f));
           }
      }
      

      由于您重复了此代码,因此我将其制成了一个函数。这样,如果您需要升级它,您只需转到该功能并在那里进行更改。

      private GameObject HexCreator()
      {
          GameObject newHex = (GameObject)Instantiate(hex);
          newHex.transform.Rotate(new Vector3(0,30,0));
      
          return newHex;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多