Бесконечное создание экземпляров сборных конструкций с различным положением и вращением

#unity3d #instantiation #objectinstantiation #racing

#unity3d #создание экземпляров #objectinstantiation #Гонки

Вопрос:

Привет, ребята из StackOverflow,

Я работаю над игрой, которая будет использовать какую-то систему объединения объектов / создания экземпляров. Моя цель — создать бесконечный трек с моими сборными конструкторами на первом изображении ниже. Я хочу каждый раз выбирать случайный сборный материал и соединять его с моим текущим треком с правильным положением и вращением. Похоже, что на втором изображении, где я вручную отрегулировал положения и повороты своих сборных элементов (я создал свои сборные элементы в blender размером 60 единиц по вертикали или горизонтали, что означает, что мои позиции кратны 30).

Довольно легко создавать экземпляры прямых объектов на неопределенный срок, но я понятия не имею, как каждый раз включать разное вращение и положение, что сделает мою гоночную трассу завершенной. Вот мой простой скрипт для создания экземпляров прямых префабов на неопределенный срок. Что я должен включить в метод SpawnTiles(), чтобы достичь того, чего я хочу. Ответ не обязательно должен быть конкретным. Я могу использовать некоторые идеи, открывающие разум.

Заранее благодарю за вашу помощь.

 public GameObject[] tilePrefabs;
private Transform playerTransform;
private float spawnZ = 35.5f;
private float tileLength = 60.0f;
private float safeZone = 60;
private int lastPrefabIndex = 0;

private int amountTilesOnScreen = 3;
private List<GameObject> activeTiles; 

void Start()
{
    activeTiles = new List<GameObject>();
    playerTransform = GameObject.FindGameObjectWithTag("Cars").transform;

    for (int i = 0; i < amountTilesOnScreen; i  )
    {
        SpawnTiles();
    }
}

void Update()
{
    if (playerTransform.position.z - safeZone > (spawnZ - amountTilesOnScreen * tileLength))
    {
        SpawnTiles();
        DeleteTile();
    }
}

private void SpawnTiles(int prefabIndex = -1)
{
    GameObject go = Instantiate(tilePrefabs[RandomPrefabIndex()]) as GameObject;
    go.transform.SetParent(transform);
    go.transform.position = Vector3.forward * spawnZ;
    spawnZ  = tileLength;
    activeTiles.Add(go);
}

private void DeleteTile()
{
    Destroy(activeTiles[0]);
    activeTiles.RemoveAt(0);
}

private int RandomPrefabIndex()
{
    if (tilePrefabs.Length <= 1)
    {
        return 0;
    }
    int randomIndex = lastPrefabIndex;
    while (randomIndex == lastPrefabIndex)
    {
        randomIndex = Random.Range(0, tilePrefabs.Length);
    }
    lastPrefabIndex = randomIndex;
    return randomIndex;
}
  

TrackPrefabs
ExampleTrack

Комментарии:

1. Эй, я знаю, откуда у тебя этот код / логика. Хотя и потрясающий урок, но вы не можете достичь желаемого с помощью этой логики. У одного и того же человека разные руководства по кривым путям, как у subway surfer. Пожалуйста, посмотрите и на это.

Ответ №1:

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

Итак, почему бы не создать 2 пустых игровых объекта в качестве начальной и конечной точки каждого блока и сохранить их как свойство элемента road, а затем выровнять начальную позицию 2-го блока с предыдущей конечной позицией блока.

Я надеюсь, что это имеет смысл.

Комментарии:

1. Я пробую эту идею прямо сейчас! Спасибо за помощь. Будет держать вас в курсе.