【问题标题】:Scene randomizer issue场景随机器问题
【发布时间】:2021-06-25 10:12:22
【问题描述】:

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

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

MainMenuScript.cs:

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

LevelControlScript.cs:

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

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

  3. 播放完所有场景后 - 应清除列表。

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

但是,我不明白为什么 unity 会显示此错误以及如何修复它:NullReferenceException: Object reference not set to an instance of an object LevelControlScript.LoadNextLevel () (at 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);
    }
}

【问题讨论】:

  • 究竟是哪一行引发了该错误? Unity 说“LevelControlScript.cs:606”,即第 606 行,那是哪一个?请edit您的问题以注释或仅包含该行或两者的单独代码块突出显示有问题的行
  • @MindSwipe 第 606 行:foreach(mainmenu.remember 中的 int 索引)
  • 所以mainmenu 为空,您确定将mainmenu 组件添加到包含LevelControlScript 的GameObject 吗?
  • @MindSwipe 很抱歉,但我对它还很陌生……我不能像 Unity 中的 GameObject 那样使用它。如果我在 LevelControlScript 中将 mainmenu 添加到 GameObject,例如:public GameObject mainmenu; 我有一个错误:错误 CS0102:“LevelControlScript”类型已经包含“mainmenu”的定义。

标签: c# list random nullreferenceexception


【解决方案1】:

我不完全确定这是否有帮助,但由于 MainMenuScript 在初始(菜单)场景中加载并且在所有其他场景中仍然需要)您可能应该在 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);
    }
}

希望这会有所帮助:)

【讨论】:

  • 你好,我相信它应该可以工作,但我不知道如何在我的程序中正确输入它,因为之前我这样做了,但它没有工作
  • 非常感谢!我试过你写的并改变了一点。它现在可以工作了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
相关资源
最近更新 更多