等级提升时如何生成障碍物?



我有一个问题,我想在玩家进入下一个关卡时生成不同的障碍物,我有无限数量的关卡,我想在某个时候生成一个随机障碍物,我的障碍物是预制件。一切都适用于 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);
}

相关内容

  • 没有找到相关文章

最新更新