程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> DontDestroyOnLoad(Unity3D開發之五)

DontDestroyOnLoad(Unity3D開發之五)

編輯:C++入門知識

DontDestroyOnLoad(Unity3D開發之五)


Unity中我們從A場景切換到B場景的時候,A場景所有對象都會銷毀,但有時候我不需要銷毀某些東西。

比如一個簡單的游戲的背景音樂,我不需要多次重復創建,多個場景播放這一個就行了。這個時候就需要用到DontDestroyOnLoad。

using UnityEngine;
using System.Collections;

public class MusicManager : MonoBehaviour {
    string volumeSetting;
	void Awake () 
	{
        volumeSetting = PlayerPrefs.GetString("Volume");
        if (volumeSetting == "False")
        {
            AudioListener.volume = 0;
        }
		DontDestroyOnLoad(gameObject);
	}
}

我在場景加載的時候初始化場景音樂,之後的進入游戲場景,就不需要重新加載了。

注意:Unity 4.5之前的版本,在來回切換場景的時候會導致多次加載DontDestroyOnLoad的對象,導致出現多個的bug。
如果你是Unity 4.5之前,請使用一個static變量記錄你的對象是否已經初始化,防止多次創建。

上面是一個辦法,當然你也可以使用單例的方式代替DontDestroyOnLoad。

宣雨松的博客中提到過這種方式,下面一段是宣雨松寫的,僅此記錄一下。
原文:http://www.xuanyusong.com/archives/2938

首先程序會進入static Global方法中,這個方法永遠只會走一遍,所以我在這裡創建一個GameObjcet,然後把Global這條腳本綁定上去,我在DontDestroyOnLoad這個對象。

using UnityEngine;
using System.Collections;
 
public class Global :MonoBehaviour
{
    public static Global instance;
 
    static Global()
    {
        GameObject go = new GameObject("Globa");
        DontDestroyOnLoad(go);
        instance = go.AddComponent();
    }
 
    public void DoSomeThings()
    {
        Debug.Log("DoSomeThings");
    }
 
    void Start () 
    {
        Debug.Log("Start");
    }
 
}

這樣這條腳本就類似一個靜態腳本了,而且這個游戲對象也永遠不會因為切換場景而被銷毀。而且用起來非常方便。在需要調用它的地方直接調用就行了。

Global.instance.DoSomeThings();



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved