Как я могу создать генератор платформ? - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь создать простой генератор платформ, и я придумал этот метод:

float space = Random.Range(0, distance); Instantiate(building, building.transform.GetChild(1).position + new Vector3(building.transform.position.x,0,0)+ new Vector3(space,0,0), Quaternion.identity);

Но, как и ожидалось, он просто создает платформы на основе позиции первой платформы. Как я могу получить позицию сгенерированной платформы каждый раз вместо первой?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

У меня нет опыта работы с Unity. Но из случаев, когда люди создавали элементы Windows Forms в цикле, я могу дать вам следующее:

Вы создаете их в цикле. И каждое изменение изменяется на (i * [ширина платформы + расстояние между платформами]) + смещение от границы следующего.

Вы также можете хранить последнюю платформу в переменной, область которой находится за пределами цикла. Вам просто нужно иметь дело с тем, чтобы он был пустым (нулевым) при первом изменении. И позволить ему выйти за рамки после завершения цикла. Что-то вроде:

{
  Platform lastPlatform = null;
  for(...){
  }
}

Я надеюсь, что есть какое-то лучшее решение для Unity.

0 голосов
/ 02 ноября 2018

Функция Instantiate возвращает объект, который она создает. Вы можете получить этот объект и получить доступ к его положению и повороту.

Глобальная переменная для хранения последнего экземпляра объекта:

public GameObject obj;

Создание и возврат ссылки на экземпляр объекта:

obj = Instantiate(building, building.transform.GetChild(1).position
    + new Vector3(building.transform.position.x, 0, 0) + new Vector3(space, 0, 0), Quaternion.identity);

Доступ к позиции и повороту экземпляра объекта:

Vector3 pos = obj.transform.position;
Quaternion rot = obj.transform.rotation;

Если вам нужно использовать позицию последнего экземпляра объекта, просто проверьте, если это null. Если null, используйте префаб исходную позицию префаба, так как пока нет инстанцированного префаба. Если нет null, используйте последнюю позицию объекта.

if (obj == null)
{
    //Use the original prefab position
    obj = Instantiate(building, building.transform.GetChild(1).position
       + new Vector3(building.transform.position.x, 0, 0) + new Vector3(space, 0, 0), Quaternion.identity);
}
else
{
    //Use last instantiated object position
    obj = Instantiate(building, obj.transform.GetChild(1).position +
        new Vector3(obj.transform.position.x, 0, 0) + new Vector3(space, 0, 0), Quaternion.identity);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...