我正在嘗試在 Unity 2021.2 中實作一個簡單的賽車游戲,并且我有一個 GameManager 物件,它在不同的場景(即比賽)中保持狀態。為了實作這一點,我在我的 GameManager 中使用了這段代碼:
public static GameManager instance;
private void Awake()
{
if (instance == null)
{
DontDestroyOnLoad(gameObject);
instance = this;
} else if (instance != this)
{
Destroy(gameObject);
}
}
只要 GameManager 的欄位是原始型別(例如 int 和 string),就可以正常作業。但是,我的 GameManager 也有一個 RacerData[] 型別的欄位,其中 RacerData 是我在單獨的腳本中創建的一個類,它保存與賽車手相關的資料,例如姓名、分數等。
使用這種方法我遇到了以下問題:當我從第一場比賽過渡到第二場比賽時,即加載新場景時,GameManager 保留原始型別的所有欄位的值,但丟失了對 RacerData 物件的參考.
我第一次嘗試解決這個問題是我將我的 RacerData 腳本變成了 MonoBehavior。我不只是在 GameManager 中實體化 RacerData 物件,而是創建了一個帶有 RacerData 腳本的預制件,并在我的 GameManager 中從這個預制件中實體化了 GameObjects。
GameObject myRacerDataInstance = Instantiate(myRacerDataPrefab, …, …);
DontDestroyOnLoad(myRacerDataInstance);
代替:
RacerData myRacerData = new RacerData();
這對在加載新場景時保留 RacerData 游戲物件具有理想的效果,但是當加載新場景時,GameManager 對這些游戲物件的參考仍然丟失。然后我開始撰寫一個 hacky 解決方法來重新分配下一個場景中的物件,到目前為止,我未能成功。但是,我對使這種變通方法起作用不太感興趣,而不是了解為什么對 RacerData 游戲物件的參考首先會丟失,以及有什么更好的方法來保持跨場景加載的資料。
這對我來說似乎是一個非常常見的用例,我不太相信開發人員應該手動重新連接參考,特別是因為這些可能形成比我的更復雜的物件圖。
那么:有沒有辦法跨場景保留這些參考?或者說 DontDestroyOnLoad() 不是正確的機制,在這種情況下:有什么更好的選擇來保存跨場景的資料(包括物件參考)?
uj5u.com熱心網友回復:
事實證明,問題并不像我想象的那樣:在我嘗試訪問它們時,沒有在GameManager物件上設定參考,即來自Start()另一個名為的游戲物件的方法RaceManager。
一個快速解決問題的方法是簡單地等待重新創建參考,如下所示(in RaceManager):
void Start()
{
StartCoroutine(WaitForRacers());
}
private IEnumerator WaitForRacers()
{
while (racers == null)
{
yield return new WaitForSeconds(1);
gameManager = FindObjectOfType<GameManager>();
racers = gameManager.GetRacers();
}
InitializeRace(); // initialization logic that relies on racers to be != null
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/405089.html
標籤:
上一篇:CharacterController的碰撞器不與BoxCollider2D碰撞
下一篇:將所有關節重置為0并保持偏移
