场景随机化器问题

Scene randomizer issue

提问人:AnBlsv 提问时间:3/29/2021 更新时间:3/30/2021 访问量:86

问:

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

我需要随机化场景,但index_scene = UnityEngine.Random.Range(a, b) 并不是我所需要的。但我仍然需要以随机顺序显示场景。我写了这段代码,其中:

主菜单脚本.cs:

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

级别控制脚本.cs:

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

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

  3. 当所有场景都播放完毕时 - 列表应该被清除。

所以,它应该旋转,直到我手动离开关卡。

但是,我不明白为什么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);
    }
}
C# 列出 随机 NullReferenceException

评论

0赞 MindSwipe 3/29/2021
究竟是哪一行抛出了这个错误?Unity 说“LevelControlScript.cs:606”,即第 606 行,这是哪一个?请编辑您的问题,以使用注释或仅包含该行或两者的单独代码块突出显示相关行
0赞 MindSwipe 3/29/2021
还有什么是 NullReferenceException,我该如何修复它?
0赞 AnBlsv 3/29/2021
@MindSwipe第 606 行:foreach(mainmenu.remember 中的 int 索引)
0赞 MindSwipe 3/29/2021
所以是 null,您是否确保将组件添加到包含 ?mainmenumainmenuLevelControlScript
0赞 AnBlsv 3/29/2021
@MindSwipe对不起,但我对它很陌生......我不能像 Unity 中的游戏对象那样使用它。如果我在 LevelControlScript 中将 mainmenu 添加到游戏对象,例如:public GameObject mainmenu;我有一个错误:错误 CS0102:类型“LevelControlScript”已包含“mainmenu”的定义。

答:

0赞 Fadi 3/30/2021 #1

我不完全确定这是否有帮助,但由于 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);
    }
}

希望这对:)有所帮助

评论

0赞 AnBlsv 3/30/2021
您好,我相信它应该有效,但我不知道如何正确地将其输入到我的程序中,因为之前我这样做了,但它没有工作
0赞 AnBlsv 4/1/2021
非常感谢!我试过你写的,并做了一点改动。它现在可以:)