我有一个问题,我想在玩家进入下一个关卡时生成不同的障碍物,我有无限数量的关卡,我想在某个时候生成一个随机障碍物,我的障碍物是预制件。一切都适用于 spawn,但是当我在路上这样做时,代码太多了,因为 500 个级别将有超过 200 行,因为我检查级别是否高于 0 并低于 10 以生成障碍物只有 10 个级别,然后接下来将是另一个相同的代码来检查其他级别是否大于 10 并且小于 20。我还想在 1-10 的关卡上生成随机障碍物,这样我的代码就会再次变大。
这是前 10 个级别的简单代码:
if(currentLevel>0 && currentLevel < 10{
for (int i = 0; i < objectNumberSpawner; i++)
{
int randomCircleSpawner = Random.Range(0, 3);
switch (randomCircleSpawner)
{
case 0:
Debug.Log("this");
lastObjectCreated = Instantiate(obstacles[0], new Vector3(obstacles[0].transform.position.x, obstacles[0].transform.position.y, startSpawn), Quaternion.identity);
startSpawn += deltaY;
spawnPlane();
lastObjectCreated = Instantiate(obstacles[1], new Vector3(obstacles[1].transform.position.x, obstacles[1].transform.position.y, startSpawn), Quaternion.identity);
startSpawn += deltaY;
spawnPlane();
break;
case 1:
lastObjectCreated = Instantiate(obstacles[1], new Vector3(obstacles[1].transform.position.x, obstacles[1].transform.position.y, startSpawn), Quaternion.identity);
startSpawn += deltaY;
spawnPlane();
break;
case 2:
lastObjectCreated = Instantiate(obstacles[2], new Vector3(obstacles[2].transform.position.x, obstacles[2].transform.position.y, startSpawn), Quaternion.identity);
startSpawn += deltaY;
spawnPlane();
break;
case 3:
lastObjectCreated = Instantiate(obstacles[3], new Vector3(obstacles[3].transform.position.x, obstacles[3].transform.position.y, startSpawn), Quaternion.identity);
startSpawn += deltaY;
spawnPlane();
break;
}
}
}else if (currentLevel)
{
}
我的问题是,当玩家达到某些级别时,是否有其他方法可以使用不同的预制件生成不同的障碍,因为这代码太多了,但如果这是我认为我需要继续的唯一方法......在代码示例中,如果没有制作,但对于更高的级别,只有更多的障碍,会有相同的过程。我不知道这是正确的方法,因为级别将有超过 1000 行代码,这对我来说没有意义。
当我添加几乎相同的过程来生成该关卡的道具时,我将拥有多少行代码,这将是疯狂的。
谢谢 stackoverflow 为我指出正确的解决方案,因为这并不像我猜的那样好。
编辑:我忘了提到,当级别增加时,变量"lastObjectCreated"下的switch语句中的对象也会改变。我希望有人有比我更好的解决方案..
现在,我看到您的switch
块可以大大缩短。我看看:
case 2:
lastObjectCreated = Instantiate(obstacles[2], new Vector3(obstacles[2].transform.position.x, obstacles[2].transform.position.y, startSpawn), Quaternion.identity);
startSpawn += deltaY;
spawnPlane();
break;
case 3:
lastObjectCreated = Instantiate(obstacles[3], new Vector3(obstacles[3].transform.position.x, obstacles[3].transform.position.y, startSpawn), Quaternion.identity);
startSpawn += deltaY;
spawnPlane();
break;
几乎一模一样。让我们声明一个本地函数并将索引作为参数传递:
void SpawnObstacle (int i) {
lastObjectCreated = Instantiate(obstacles[i], new Vector3(obstacles[i].transform.position.x, obstacles[i].transform.position.y, startSpawn), Quaternion.identity);
startSpawn += deltaY;
spawnPlane();
}
我们的整个switch
变成了:
switch (randomCircleSpawner) {
case 0:
SpawnObstacle (0);
SpawnObstacle (1);
break;
case 1:
SpawnObstacle (1);
break;
case 2:
SpawnObstacle (2);
break;
case 3:
SpawnObstacle (3);
break;
}
进一步简化:
SpawnObstacle (randomCircleSpawner);
if (randomCircleSpawner == 0) {
SpawnObstacle (1);
}