GameManager 一直被标记为空

问题描述 投票:0回答:1

我正在使用 Singleton 设计模式为 GameManager 编写脚本,但不知何故,当我运行我的游戏时,我得到了空引用异常。由于我经常改变我的场景,我制作了一个脚本,我不会破坏 GameManager 和一些不同的对象,而是使用 DontDestroyOnLoad,这很可能是异常的原因。

我正在为 GameManager 使用这个脚本,它附加到场景中的空游戏对象。

using System.Collections.Generic;
using UnityEngine.SceneManagement;
using UnityEngine;

public class GameManager : MonoBehaviour {
    private static GameManager instance;
    public static GameManager Instance {
        get {
            if (instance == null) {
                Debug.Log("Game Manager not found");
            }
            return instance;
        }
    }

    [SerializeField] private List<GameObject> objectsNotToDestroy;
    [SerializeField] private float dayAndNightTime;
    private PlayerMovement player;
    public float CurrentTime { get; set; }
    public float DayTime { get; private set; }

    private void Awake() {
        if (instance != null) {
            Debug.Log("Not null");
            objectsNotToDestroy.ForEach(Destroy);
        }
        else {
            Debug.Log("Here");
            instance = this;
            DontDestroyOnLoad(gameObject);
            objectsNotToDestroy.ForEach(DontDestroyOnLoad);
        }
        PlayerMovement playerMovement = objectsNotToDestroy[1].GetComponent<PlayerMovement>();
        if (playerMovement != null) {
            player = playerMovement;
        }
        else {
            Debug.LogError("PlayerMovement script not found on object in objectsNotToDestroy list.");
        }
        DayTime = dayAndNightTime;
    }

    public void Load(int buildIndex) {
        CurrentTime += Time.time;
        SceneManager.LoadSceneAsync(buildIndex);
        player.Running(false);
    }
}

当我运行我的游戏时,“GameManager not found”和“Here”都被输出,这让我得出结论,不破坏我的 GameManager 脚本附加到的 gameObject 是造成问题的原因。我尝试了一些东西,比如包括/排除我的 GameManager 脚本附加到的游戏对象,但我尝试的任何东西都不起作用,我有点困惑为什么。

unity3d nullreferenceexception
1个回答
0
投票

要为您的单身人士获得可预测的行为,请尝试以下操作:

  • 设置脚本执行顺序,以便您的 GameManager 在引用它的任何其他脚本之前实例化:https://docs.unity3d.com/Manual/class-MonoManager.html
  • 创建“init”类型的场景,它永远不会被卸载并且在顶级游戏对象上有你的 GameManager 脚本。将所有其他场景加载为附加场景,而无需卸载“初始”场景。
© www.soinside.com 2019 - 2024. All rights reserved.