主題

unity學習筆記#7 使用DontDestroyOnLoad保留物件在轉換場景時不被摧毀

弒羽 | 2021-11-18 22:37:35 | 巴幣 6 | 人氣 129

在經過前面介紹的SceneManager.LoadScene後,當重新讀取場景時可能會遇到一些問題
我可能有一些想要保留的資訊或是物件,在重新讀取場景後就會被清空
這是因為unity在重新讀取場景後,舊的場景會被刪除,然後建構成新的場景
不只是說從場景1更換到場景2,去做場景1的重新讀取也一樣
這時候我們就需要一個機制來處理問題,那個機制就叫做singleton(單例模式)
用這個字去估狗就可以有很多教學跟講解,這部分我就不特別詳細說明
畢竟我也還是在學習階段,怕解釋錯誤給成了錯誤資訊

回到這次的主題,我們先來假設一個狀況,假設我今天是做個關卡制遊戲
我會有一個得分,在每個關卡都可以獲得,然後會一直累積總得分
就以之前的場景來簡單做個修改

我就簡單做了一個Score的Script,然後放在一個ScoreManager的空物件中
有一個簡單的方法去放到按鈕上,按下去可以讓我的Score增加10分
去模擬說我的遊戲在遊玩途中不斷獲得分數

這時候我就可以很開心的一直增加我的分數,然後進入下個場景

這時候會發現,當我重新讀取場景後,因為舊的物件被摧毀改生成新的,所以分數被清空了
這時候就可已使用DontDestroyOnLoad來保留我不想被清空的物件
在Score當中新增一個Awake,然後去檢查Score這個類型的物件數量
如果還沒有,就使用DontDestroyOnLoad這個方法,大於1的話代表已經有了,有直接Destroy

這邊可以做個簡單的小延伸,就是unity的機制
在文檔中可以看到,生成物件的時候最先跑的會是Awake,所以把檢查放在這邊
然後Destoy會在整個流程的最後一步,所以保險起見在確認物件已經有的話,新的物件把Active改成false
這時候再測試一次

這時候會發現左邊的Hierarchy多了一個DontDestroyOnLoad,裡面的物件就是ScoreManager
但是問題來了,分數還是一樣歸零,而且沒辦法再去獲得分數
這時來看右邊的部分會發現,原本引用的ScoreText不見了
這是因為原本引用的ScoreText是上個場景中的,當重新讀取場景後就被摧毀了
當前場景的ScoreText則是重新讀取後新生成的
這時可以用一個最簡單的方法,將整個Canvas放到ScoreManager底下

因為Canvas變成的ScoreManager的子物件,所以一樣會被DontDestroyOnLoad保留下來
這時就可以達到我想要保留分數的目的了

這個例子其實沒有很好,像是我可以直接把score宣告成static就可以一直保留下去
就當作是個簡單的例子去測試DontDestroyOnLoad這個方法的使用
如果之後有什麼需要保留物件的需求,就有機會使用這個方法了

以上就是這次的內容
感謝收看

unity文件連結:

創作回應

虛鹿
看起來好像很厲害
2021-11-20 05:44:16

相關創作

更多創作