无限预制和不同位置和旋转实例化

时间:2019-04-04 12:33:53

标签: unity3d instantiation objectinstantiation racing

你好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

1 个答案:

答案 0 :(得分:0)

因此,基本上,要使其完全对齐,您应该知道要放置的第一个道路项目的终点和第二个道路项目的起点。

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

我希望这是有道理的。