問題描述
游戲開發中會有多個場景,有時會有這樣的需求,我們需要保證場景跳轉但是需要保持某個游戲對象不被銷毀,比如:音樂
實現思路
unity中提供了DontDestroyOnLoad(),這個API
使用這個指令一般寫在跳轉場景之前,寫在跳轉場景的觸發事件中,把背景音樂綁定的對象做成預制體,上面綁定了播放音樂的代碼
實現代碼
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 using UnityEngine.SceneManagement; 5 6 public class DontDestroyMusicClass : MonoBehaviour { 7 8 public GameObject MusicBk; //預制體(不銷毀的物體(做成預制體)) 9 private GameObject clone;//克隆的不銷毀物體 10 void Start () { 11 clone = Instantiate(MusicBk, transform.position, transform.rotation) as GameObject; 12 } 13 14 public void Btn() 15 { 16 DontDestroyOnLoad(clone);//切換場景不銷毀clone 17 SceneManager.LoadScene(1);//跳到1場景 18 } 19 20 }
這樣就實現了不銷毀所需物體的需求
加載不銷毀的坑
想必大家也都發現了,這實現這功能沒問題,但是出現了一個新問題:
在用這個API的時候,因為它是為了在游戲開發中不會由於場景的過度而銷毀物體,所以會有一個很奇怪的問題,就是比如:如果場景0中有對象A,當跳轉到場景1的時候,對象A也出現在場景1中,此時你可能會認為這是沒問題的,但是你返回場景0中你就會發現出現了兩個對象A,然后到場景1中,也會有兩個對象A,再返回場景0,你會發現又多了一個對象A,再返回場景1又多了1個,依次遞增
問題分析以及解決方案
這是重復性實例化出現的問題,在這里我用一個static bool變量來記錄該對象是否被克隆過,如果克隆過就不再克隆依次解決該問題
修改后的代碼
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 using UnityEngine.SceneManagement; 5 6 public class DontDestroyMusicClass : MonoBehaviour { 7 8 public GameObject MusicBk; //預制體(不銷毀的物體(做成預制體)) 9 public static bool isHave = false; 10 private GameObject clone;//克隆的不銷毀物體 11 public void Btn() 12 { 13 if (!isHave) 14 { 15 clone = GameObject.Instantiate(MusicBk, transform.position, transform.rotation); 16 isHave = true; 17 18 } 19 DontDestroyOnLoad(clone);//切換場景不銷毀clone 20 SceneManager.LoadScene(1);//跳到1場景 21 } 22 23 }
通過靜態變量解決了該問題
(新手上路,望指教)