[英]unity The object of type 'GameObject' has been destroyed but you are still trying to access it
[英]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.