unity3d中的DontDestroyOnLoad來回切換出現多個實例問題


在用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);,呵呵了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM