Размещение объектов произвольного размера рядом 2D - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь создать префабы различной формы рядом друг с другом. У меня есть папка, полная объектов разного размера, которые позволяют мне случайным образом связать их вместе, чтобы создать бесконечный 2D бегун. Моя проблема заключается в том, что все ответы онлайн о размещении объектов рядом друг с другом не работают, когда используются объекты разных размеров. Вот код, который я использую для создания разделов. Это работает, когда он только случайным образом выбирает объекты одинакового размера. Если выбранный префаб имеет другую длину, он оставляет зазор или перекрывает предыдущий объект.

  for(int i = 0; i < activeSectionsAtOnce; i++)
    {
        int index = Random.Range(0, sectionPrefabs.Length);
        GameObject currentOb = sectionPrefabs[index];

        Vector2 position = new Vector2();
        if(activeSections.Count == 0)
        {
            //set a (0, 0) position for first object
            position = Vector2.zero;
        }
        else
        {
            //get most recently placed object from list
            GameObject lastOb = activeSections[activeSections.Count - 1];

            //my attempt at getting bounds for the last object and for the next prefab that will be used
            Bounds lasObbounds = new Bounds(lastOb.transform.position, Vector2.zero);
            Bounds currentBounds = new Bounds(currentOb.transform.position, Vector2.zero);

            //Include child objects(all have sprite renderers)
            foreach (Renderer r in lastOb.GetComponentsInChildren<Renderer>())
            {
                lasObbounds.Encapsulate(r.bounds);
            }
            foreach (Renderer rend in currentOb.GetComponentsInChildren<Renderer>())
            {
                currentBounds.Encapsulate(rend.bounds);
            }
            //position object will be instantiated at
            position.x = lastOb.transform.position.x + (lasObbounds.size.x / 2) + (currentBounds.size.x/2);
        }
        //instantiate at selected position
        activeSections.Add(
            Instantiate(currentOb, position, Quaternion.identity)
        );
    }

Это метод запуска. Я не уверен, что проблема в том, как я создаю границы или как я математически создаю координату x. Это ожидаемый результат, который происходит, когда я использую префабы одного размера this is the expected output Это то, что происходит с различными префабами result Более короткий выступ от первого объекта должен быть чисто между двумя другими без зазора.

Вот изображение одного сборного prefab

Спасибо за любой совет

...