0

你好 StackOverFlow 人,

我正在开发一款将使用某种对象池/实例化系统的游戏。我的目标是用我的预制件在下面的第一张图片中创建一个无尽的轨道。我想每次都选择一个随机的预制件,并以正确的位置和旋转将它拼接到我当前的轨道上。在第二张图片中,我手动调整了我的预制件的位置和旋转(我在搅拌机中创建了我的预制件,无论是垂直还是水平,都是 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

4

1 回答 1

0

所以基本上为了让它完美对齐,你应该知道你将放置的第一个道路项目的终点和第二个道路项目的起点。

那么为什么不将 2 个空的游戏对象作为每个方块的起点和终点,并将它们存储为道路项目的属性,然后将第 2 个方块的起始位置与前一个方块的结束位置对齐。

我希望这是有道理的。

于 2019-04-04T14:41:57.580 回答