簡體   English   中英

Unity “GameObject”類型的 object 已被銷毀

[英]Unity The object of type “GameObject” has been destroyed

我的選項菜單中有 2 個按鈕,“返回主菜單”和“靜音音樂”每個按鈕都附有一個腳本,並在按下時調用腳本的 OnPress() 方法。 我還有一個主要的關卡對象/腳本來處理所有的場景加載和東西。 因此主菜單按鈕的腳本在其 Start 中執行 FindObjectOfType(),然后在其 OnPress() 中調用 level.LoadStartScene()。 靜音按鈕的腳本做同樣的事情,但調用 level.ToggleMuteMusic()。 所以這之前工作得很好,但后來我使用以下代碼制作了 singleton 級別:

public void Awake() {
    InitializeSingleton();
}

private void InitializeSingleton() {
    if (FindObjectsOfType(GetType()).Length > 1) {
        Destroy(gameObject);
    } else {
        DontDestroyOnLoad(gameObject);
    }
}

所以現在主菜單按鈕可以正常工作,但是靜音按鈕會出錯; 我認為這是因為在 Start() 中它找到了舊級別 object,然后帶有 DontDestroyOnLoad 的級別進來並刪除了舊級別,但是為什么主菜單按鈕起作用?

靜音按鈕代碼:

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;

public class MuteButton : MonoBehaviour {

[SerializeField] string mutedText = "Unmute Music";
[SerializeField] string unmutedText = "Mute Music";

private Level level;
private TextMeshProUGUI myText;

public void Start() {
    level = FindObjectOfType<Level>();
    myText = GetComponent<TextMeshProUGUI>();
}

public void OnPress() {
    if (level == null) {
        Debug.Log("log 1");
    }
    level.ToggleMuteMusic();
    bool muteMusic = level.GetMuteMusic();
    if (muteMusic == true) {
        myText.SetText(mutedText);
    } else if (muteMusic == false) {
        myText.SetText(unmutedText);
    }
}

}

菜單按鈕代碼:

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

public class MenuButton : MonoBehaviour {

Level level;

public void Start() {
    level = FindObjectOfType<Level>();
}

public void OnPress() {
    level.LoadStartScene();
}
}

完全錯誤:

MissingReferenceException:“GameObject”類型的 object 已被破壞,但您仍在嘗試訪問它。 您的腳本應該檢查它是否是 null,或者您不應該破壞 object。 UnityEngine.GameObject.GetComponent[T] () (at C:/buildslave/unity/build/Runtime/Export/Scripting/GameObject.bindings.cs:28) Level.ToggleMuteMusic () (at Assets/Scripts/Level.cs: 74) MuteButton.OnPress () (在 Assets/Scripts/MuteButton.cs:23)

謝謝你的時間:)

你能展示你的腳本的全部代碼嗎? :) 這將有助於理解。

確定導致此問題的事物執行的確切順序可能有點困難,但是您在 Start() 中丟失了在 Awake() 中處理的引用這一事實很奇怪。 過去我在 Start() 中使用FindObjectOfType<>時遇到過問題,因此最好改變您處理 singleton 的方式。

我建議您制作您的級別static ,以便您可以更輕松地引用它,因為您已經在實施 Singleton 的形式。

這是一個如何重寫 Level.cs 文件頂部的示例:

public static Level instance;

private void Awake()
{
    if (instance != null && instance != this)
    {
        Destroy(this.gameObject);
        return;
    }
    else
    {
        instance = this;
    }
    DontDestroyOnLoad(this.gameObject);
}

這會導致它創建關卡 class 一次,然后銷毀它的所有后續版本(例如重新加載它所在的場景時)。

現在,要在其他腳本中引用它,您再也不必使用FindObjectOfType<Level>()了! 您可以靜態引用Level.instance ,如下所示:

//New way to call ToggleMuteMusic()
Level.instance.ToggleMuteMusic();

希望這會有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM