在用Unity3D開發游戲中,我們會經常創建多個場景,但是在場景過度的時候,通常場景中的對象會被刪除。所以Unity3D給了我們一個不刪除前一個 場景中的某一個對象或者腳本的API,那就是“DontDestoryOnLoad(對象或者某個腳本)”。但是我們在用這個API的時候我們會發現一個 很奇怪的問題就是:如果A里面放了個東西o,當到場景B的時候,o 也會出現在B場景中,這里一看,感覺還是對的,然后你再返回到場景A, 你就會驚訝的發現,A里面出現了兩個o,然后你到B, 看到B里面也出現了兩個 o, 再回到A, A里面出現了3個o, 一直遞增上去。
那我們有什么好的解決辦法呢?我的辦法就是把要DontDestroyOnLoad的對象做成一個預制體,然后專門用一個static bool變量來記錄這個對象是否被clone(克隆),當第一次被克隆的時候我們就把這個布爾變量變成真,只有在這個布爾變量是假的情況下才克隆這個預制 體。那么這個問題就解決了。
using UnityEngine; using System.Collections; public class LoadTest : MonoBehaviour { public GameObject CloneTemp; public static bool IsHaveUsed = false; private GameObject clone; void Awake() { //DontDestroyOnLoad(transform.gameObject); } // Use this for initialization void Start () { //if (!GameObject.Find("Root(Clone)")) if(!IsHaveUsed) { clone = Instantiate(CloneTemp, transform.position, transform.rotation) as GameObject; IsHaveUsed = true; Debug.Log("this log obviously show create"); DontDestroyOnLoad(clone.transform.gameObject); } } // Update is called once per frame void Update () { if (Input.GetKeyDown(KeyCode.W)) { Application.LoadLevel("temp"); } } }
我們把這個腳本掛在場景的一個gameobject上面,因為CloneTemp是公開的,那么我們就可以把想要不釋放的gameobject拖到這個上面去了,這樣就不會被釋放了。
開始我以為掛上這個腳本的gameobject不會釋放,事實不是這樣的,不會釋放的gameobject是被Instantiate new出來的,掛在gameobject上面是不對的,
DontDestroyOnLoad(clone.transform.gameObject); 這句最為重要,我之前是DontDestroyOnLoad(transform.gameObject);,呵呵了
