首页 > 解决方案 > 等级增加时如何产生障碍物?

问题描述

我有一个问题,我想在玩家进入下一个关卡时产生不同的障碍物,我有无限数量的关卡,我想在某个时候产生一个随机障碍物,我的障碍物在预制件中。一切都适用于 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 为我指出正确的解决方案,因为这不会像我猜的那样好。

编辑:我忘了提到当级别增加时,变量“lastObjectCreated”下的switch语句中的对象也会改变..我希望有人有更好的解决方案然后我的..

标签: c#unity3dgame-developmentspawn

解决方案


现在,我看到你的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);
}

推荐阅读