我有一个问题,我想在玩家进入下一个关卡时生成不同的障碍物,我有无限多个关卡,并且我希望有时会生成随机障碍物,我的障碍物已进入预制件。一切都可以与spawn一起使用,但是当我按照自己的方式进行操作时,代码会变得太多,因为200个级别将有超过500行,因为我检查级别是否高于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向我指出正确的解决方案,因为这并不是我想的那样。
编辑:我忘了提一下,当级别增加时,在switch语句中变量“ lastObjectCreated”下的对象也会发生变化。.我希望有人能比我更好。
答案 0 :(得分:3)
目前,我发现您的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);
}