Unity中的一個方法DontDestroyOnLoad可以讓某些游戲對象在切換場景的時候不是施放,聽起來是一個非常好的方法,但是其實如果沒用好那么可能就是有問題了。
舉個例子:
在場景1中某一個腳本的Start方法中,DontDestroyOnLoad(A)
接著切換到場景2中,理所當然A對象被保留了下來
如果在從2場景再次回到1場景,那么又執行了一遍DontDestroyOnLoad(A)然而之前你的A對象卻沒有被施放,這樣就會無線循環下去了。
當然我們可以去做邏輯判斷是否DontDestroyOnLoad,判斷A是否等于Null做一些判斷。但是我覺得這其實是下策。DontDestroyOnLoad方法其實更多的是去保存一個全局的游戲腳本,比如一些第三方的SDK你需要用這個腳本來做中間件的支持。
我目前的做法是,我做了一個初始化場景。在初始化場景里面我只做兩件事,第一在初始化場景里面的某個游戲對象的全局腳本中,Start方法里我把這個場景里面的所有游戲對象全部設置成DontDestroyOnLoad,也就是切換場景時不銷毀,比如NGUI的Root梳妝結構。
Object[] initsObjects = GameObject.FindObjectsOfType(typeof(GameObject)); foreach (Object go in initsObjects) { DontDestroyOnLoad(go); }第二,接著我在進入我的第一個游戲場景,也就是說我的邏輯永遠不會在回返我的初始化場景。所以我也不會出現來回切場景DontDestroyOnLoad沒有刪除的問題。
還有一個巧妙的辦法就是利用static 初始化方法,如下代碼所示,當代碼在調用Global類的時候
首先程序會進入static Global方法中,這個方法永遠只會走一遍,所以我在這里創建一個GameObjcet,然后把Global這條腳本綁定上去,我在DontDestroyOnLoad這個對象。
using UnityEngine;using System.Collections;public class Global :MonoBehaviour{ public static Global instance; static Global() { GameObject go = new GameObject("Global"); DontDestroyOnLoad(go); instance = go.AddComponent<Global>(); } public void DoSomeThings() { Debug.Log("DoSomeThings"); } void Start () { Debug.Log("Start"); }}這樣這條腳本就類似一個靜態腳本了,而且這個游戲對象也永遠不會因為切換場景而被銷毀。而且用起來非常方便。在需要調用它的地方直接調用就行了。
Global.instance.DoSomeThings();本文轉自:http://www.xuanyusong.com/archives/2938
新聞熱點
疑難解答