提问人:AnBlsv 提问时间:3/29/2021 更新时间:3/30/2021 访问量:86
场景随机化器问题
Scene randomizer issue
问:
我正在开发一款关于unity的休闲2D游戏。我有点卡住了。我有 2 个脚本:一个在游戏开始时加载 - (MainMenuScript.cs),一个在每个场景开始时加载 - (LevelControlScript.cs)
我需要随机化场景,但index_scene = UnityEngine.Random.Range(a, b) 并不是我所需要的。但我仍然需要以随机顺序显示场景。我写了这段代码,其中:
主菜单脚本.cs:
- 创建一个列表,我们在其中放置播放的场景。它应该在加载时初始化一次。
级别控制脚本.cs:
随机选择下一个场景,并使用列表中的值进行检查。
如果列表包含该场景 - 选择另一个随机场景,如果它不在列表中 - 它会播放,然后该场景应添加到播放的场景列表中。
当所有场景都播放完毕时 - 列表应该被清除。
所以,它应该旋转,直到我手动离开关卡。
但是,我不明白为什么unity显示此错误以及如何修复它: NullReferenceException:对象引用未设置为对象LevelControlScript.LoadNextLevel()(在Assets/Scripts/LevelControlScript.cs:606)
MainMenuScript:
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) 场景中加载,并且在所有其他场景中仍然需要),您可能应该在 MainMenuScript 的启动函数中添加 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);
}
}
希望这对:)有所帮助
评论
mainmenu
mainmenu
LevelControlScript