Nested For Loops — создание шестигранной сетки в стиле катана в Unity

Как следует из названия, я пытаюсь создать процедурную шестнадцатеричную сетку в 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));
    }
    }
}

Код работает, однако строки генерируются «назад», то есть внешние строки содержат большее количество гексов, а внутренние строки содержат наименьшее.

Очевидно, это противоположный эффект, которого я пытаюсь достичь. Я возился с этим кодом часами и не могу понять, почему.

есть идеи?


person GreenWire    schedule 13.11.2013    source источник


Ответы (2)


Итак, после еще нескольких часов возни с кодом я понял, почему он не работает должным образом. Он усовершенствованный код...

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));
                }
            }
    }
}

Теперь, может кто-нибудь предложить, как очистить его немного? Мой мозг затуманен...

person GreenWire    schedule 13.11.2013

Просто подсказка, Пробуждение происходит до 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;
}
person Community    schedule 13.11.2013