无尽的预制件实例化不同的位置和旋转
Endless Prefab Instantiating with different position and rotation
大家好 Whosebug,
我正在开发一款将使用某种对象 pooling/instantiating 系统的游戏。我的目标是在下面的第一张图片中使用我的预制件创建一条无尽的轨道。我想每次选择一个随机的预制件并将其以正确的位置和旋转拼接到我当前的轨道。在第二张图片中,我手动调整了预制件的位置和旋转(我在搅拌机中创建的预制件在垂直或水平方向上为 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;
}
所以基本上为了完美对齐,您应该知道第一个道路项目的终点和您将放置的第二个道路项目的起点。
那么为什么不制作2个空的游戏对象作为每个方块的起点和终点,并将它们存储为道路项目的属性,然后将第2个方块的起始位置与前一个方块的结束位置对齐.
我希望这是有道理的。
大家好 Whosebug,
我正在开发一款将使用某种对象 pooling/instantiating 系统的游戏。我的目标是在下面的第一张图片中使用我的预制件创建一条无尽的轨道。我想每次选择一个随机的预制件并将其以正确的位置和旋转拼接到我当前的轨道。在第二张图片中,我手动调整了预制件的位置和旋转(我在搅拌机中创建的预制件在垂直或水平方向上为 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;
}
所以基本上为了完美对齐,您应该知道第一个道路项目的终点和您将放置的第二个道路项目的起点。
那么为什么不制作2个空的游戏对象作为每个方块的起点和终点,并将它们存储为道路项目的属性,然后将第2个方块的起始位置与前一个方块的结束位置对齐.
我希望这是有道理的。