场景随机化器问题



我正在开发一款关于团结的休闲2D游戏。我有点被卡住了。我有两个脚本:一个在游戏开始时加载-(MainMenuScript.cs(,一个在每个场景开始时加载,-(LevelControlScript.cs(

我需要随机化场景,但index_scene=UnityEngine.Random.Range(a,b(不是我的情况所需要的。但我仍然需要按随机顺序显示场景。我写这个代码的地方:

MainMenuScript.cs:

  1. 创建一个列表,在其中放置播放的场景。它应该在加载时初始化一次

LevelControlScript.cs:

  1. 随机选择下一个场景,并使用列表中的值进行检查。

  2. 如果列表中包括该场景,则选择另一个随机场景,如果该场景不在列表中,则播放该场景,然后该场景应添加到播放的场景列表中。

  3. 当所有场景都播放完后,列表应该被清除。

因此,它应该旋转,直到我手动离开该级别。

但是,我不明白为什么unity会显示这个错误以及如何修复它:NullReferenceException:对象引用未设置为对象LevelControlScript.LoadNextLevel((的实例(位于Assets/Scripts/LevelControlScript。cs:606(

主菜单脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class MainMenuScript : MonoBehaviour {
public List<int> remember = new List<int>(); //here
public void StartLvl()
{
SceneManager.LoadScene("Scenes/LVL");
}
public void Quit()
{
Application.Quit();
}
}

LevelControlScript:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class LevelControlScript : MonoBehaviour {
MainMenuScript mainmenu; //here
// Variable to contain current scene build index
int currentSceneIndex;
void Start() {
mainmenu = GetComponent<MainMenuScript>(); //here

// Getting current scene build index
currentSceneIndex = SceneManager.GetActiveScene().buildIndex;    
}
// Method is invoked when correct answer is given
public void RightAnswer()
{
Code...    
}
// Method loads next level
public void LoadNextLevel()
{
int index_scene = UnityEngine.Random.Range(1, 10);
foreach (int index in mainmenu.remember)
{
if (index == index_scene)
{
index_scene = UnityEngine.Random.Range(1, 10);
}
}
if (mainmenu.remember.Count == 10)
{
mainmenu.remember.Clear();
}
mainmenu.remember.Add(index_scene);
SceneManager.LoadScene(index_scene);
}
}

我不完全确定这是否有帮助,但由于MainMenuScript在初始(Menu(场景中加载,并且在所有其他场景中仍然是必需的(,您可能应该在MainMenuSScript的启动函数中添加DontDestroyOnLoad。

编辑:

试试这个:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class MainMenuScript : MonoBehaviour {
public List<int> remember = new List<int>(); //here
private static bool created = false;
void Start()
{
if (!created)
{
DontDestroyOnLoad(this.gameObject);
created = true;
}
}
public void StartLvl()
{
SceneManager.LoadScene("Scenes/LVL");
}
public void Quit()
{
Application.Quit();
}
}

这应该有效,但如果无效,请尝试将LevelControlScript更改为:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class LevelControlScript : MonoBehaviour {
GameObject mainmenugameobject;
MainMenuScript mainmenu; //here
// Variable to contain current scene build index
int currentSceneIndex;
void Start() {
mainmenugameobject = GameObject.Find("Changethistothenameofthemenugameobject"):
mainmenu = mainmenugameobject.GetComponent<MainMenuScript>(); //here

// Getting current scene build index
currentSceneIndex = SceneManager.GetActiveScene().buildIndex;    
}
// Method is invoked when correct answer is given
public void RightAnswer()
{
Code...    
}
// Method loads next level
public void LoadNextLevel()
{
int index_scene = UnityEngine.Random.Range(1, 10);
foreach (int index in mainmenu.remember)
{
if (index == index_scene)
{
index_scene = UnityEngine.Random.Range(1, 10);
}
}
if (mainmenu.remember.Count == 10)
{
mainmenu.remember.Clear();
}
mainmenu.remember.Add(index_scene);
SceneManager.LoadScene(index_scene);
}
}

希望这有帮助:(

最新更新