我有50个级别,这些级别是预制的(而不是场景(,在脚本的帮助下加载。我想要的是当我打了50个级别时。它应该从我之前玩过的50个等级开始随机化等级。目前,我使用了一个列表来存储从0到49的整数,因为我的级别分别标识为0到49表示级别到级别50。它只工作了一次,就像它加载了一个随机级别一样,然后例如,如果随机级别是30,它将从30开始加载级别,即31、32、32等等。目前,当我赢得50级并单击下一步按钮时,我收到了一个将子级转换为越界的错误。
逻辑如下:在这里,当我开始级别50时,我将bool变量设置为true。
if (EnvirenmentNo == 49)
{
lastLevel = true;
PlayerPrefs.SetInt("startRandom",startRandom?1:0);
startRandom = true;
//PlayerPrefs.SetInt("CurrentLevel", EnvirenmentNo);
}
这是加载下一个级别的逻辑。代码的其他部分正常加载下一个关卡,如果部分是我希望从我播放的关卡中随机加载关卡的地方,直到它们全部播放完毕。为此,我使用了一个列表,并在开始关卡之前删除了随机数。似乎什么都不管用。
else if (btn == "next")
{
if (lastLevel)
{
int nextLevelIndex = Random.Range(0,randomLevels.Count);
int nextLevel = randomLevels[nextLevelIndex];
EnvirenmentNo = nextLevel;
randomLevels.Remove(nextLevelIndex);
lastLevel = true;
startRandom = true;
EnvirenmentNo = Random.Range(0, 50);
//currentLevel++;
LoadingPanel.SetActive(true);
Finish.Instance.collider2D.enabled = false;
LevelCompletePanel.SetActive(false);
PlayerPrefs.SetInt("restart", 1);
Application.LoadLevel(Application.loadedLevel);
//VehicleSimpleControl._instance.rigidBody.bodyType = RigidbodyType2D.Static;
}
else
{
//DrawingManager.Instance.posCount = 0;
EnvirenmentNo ++;
//currentLevel++currentLevel++;
LoadingPanel.SetActive(true);
Finish.Instance.collider2D.enabled = false;
LevelCompletePanel.SetActive(false);
PlayerPrefs.SetInt("restart", 1);
Application.LoadLevel(Application.loadedLevel);
//VehicleSimpleControl._instance.rigidBody.bodyType = RigidbodyType2D.Static;
}
这是我创建的列表和整数,
protected const int MAX = 50;
public static List<int> randomLevels = new List<int>();
早些时候,我无法随机化水平。现在,一旦用户完成等级50,等级就被随机化。但仍然存在一个问题,这种水平正在重复。我正在删除随机水平的指数,但在几个水平后,它仍然会以某种方式再次出现。就像现在一样,我有三次达到49级,18级和25级。我还添加了列表和我在问题列表中使用的整数。提前感谢!
从您提供的小代码中,我所能告诉您的是,您完全忽略了
EnvirenmentNo = nextLevel;
并使用硬编码再次覆盖
EnvirenmentNo = Random.Range(0, 50);
几行之后,这并不能防止任何重复的级别。
除此之外,这真的很难判断,因为正如所说,我们不知道你的完整代码,但很可能你也应该在某个地方存储已经玩过的关卡,这样你以后就不会重复随机的关卡了。
例如,您可以使用保存和加载它们
PlayerPrefs.SetString("randomLevels", string.Join(",", randomLevels.ToArray()));
和
using System.Linq;
...
randomLevels.Clear();
randomLevels.AddRange(PlayerPrefs.GetString("randomLevels").Split(',').Select(s => int.Parse(s)));
同时注意
在这里,当我开始级别50时,我将bool变量设置为true。
这在逻辑上是错误的。您只想在完成50级后执行此操作,而不是在开始时执行!
您应该在PlayerPrefs.SetInt
之前将startRandom
更改为true
,以保存正确的值。