等级增加时如何生成障碍物?

时间:2019-07-15 23:56:46

标签: c# unity3d game-development spawn

我有一个问题,我想在玩家进入下一个关卡时生成不同的障碍物,我有无限多个关卡,并且我希望有时会生成随机障碍物,我的障碍物已进入预制件。一切都可以与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”下的对象也会发生变化。.我希望有人能比我更好。

1 个答案:

答案 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);
}