在玩完 50 级并赢得后随机加载级别。随机级别将从 1 级到 50 级,它们不会重复两次

  • 本文关键字:随机 两次 加载 级到 c# unity-game-engine
  • 更新时间 :
  • 英文 :


我有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,以保存正确的值。

最新更新