c# - 等级增加时如何产生障碍物?
问题描述
我有一个问题,我想在玩家进入下一个关卡时产生不同的障碍物,我有无限数量的关卡,我想在某个时候产生一个随机障碍物,我的障碍物在预制件中。一切都适用于 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语句中的对象也会改变..我希望有人有更好的解决方案然后我的..
解决方案
现在,我看到你的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);
}
推荐阅读
- linux - 如何修复openssl的malloc失败错误?
- javascript - 如何在javascript代码中添加日期范围字段
- java - 有时嵌入式tomcat ClassDefNotFound 异常?
- cordova - 如何将启动文件 index.html 更改为 phonegap 中的其他 html 文件
- python - 为什么 python cryptodome 使用 latin-1 编码和解码字符串?
- traefik - 公开在本地 kubernetes 集群中运行的 traefik 的正确方法?
- docker - 为什么 docker 立即关闭 tcp 连接?
- python - 如果特定单词存在于字符串中的单词之前,如何删除它们
- angular - 验证动态生成的参考模板驱动的角度
- backbone.js - 以静默方式将单元格添加到 JointJS 图中