Бесконечный Prefab Instantiating с различным положением и вращением - PullRequest
0 голосов
/ 04 апреля 2019

Hello StackOverFlow Folks,

Я работаю над игрой, которая будет использовать какую-то систему создания пулов / создания экземпляров. Моя цель - создать бесконечный трек с моими префабами на первом изображении ниже. Я хочу каждый раз выбирать случайный сборный блок и соединять его с моим текущим треком с правильным положением и вращением. Казалось бы, как на втором изображении, где я вручную отрегулировал положения и повороты своих префабов (я создал свои префабы в блендере так, чтобы они составляли 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 Ответ

0 голосов
/ 04 апреля 2019

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

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

Надеюсь, это имеет смысл.

...