unity 切換場景不銷毀物體問題的解決

在用unity進行遊戲開發時我們有時需要一些物體在場景切換時不需要被銷毀這時我們可以用官方給的DontDestroyOnLoad()方法,

這個方法可以讓我們在場景切換時不銷毀場景。但如果你又返回這個場景(創建不可銷毀物體的場景)時就會發現會有兩個這個物體(標記為不可銷毀的物體)。

這個問題有一個較為簡單的解決方法就是:

在物體的Awake()或Star()方法中加入這段代碼。如果找到和自己一樣的名字卻不是自己的物體就將自己銷毀,這樣就解決瞭這個問題。(別的地方不知道,我的項目是可以用);

if (GameObject.Find("Players").gameObject != this.gameObject)
            Destroy(this.gameObject);

補充:Unity加載場景、計時器、加載時不銷毀某物體

異步加載場景,SceneManager.LoadSceneAsync(SceneName);需引用 using UnityEngine.SceneManagement;命名空間,

Application.LoadLevel這個方法不再適用;

可以用協同程序做一個簡單的計時器,詳見代碼;

DontDestroyOnLoad (this.gameObject);方法可以在加載場景時不銷毀指定物體;

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Base : MonoBehaviour {    
    public virtual void ScenesLoad(string SceneName,int AfterSomeMinutesToLoad)
    {
       StartCoroutine (Calculagraph(SceneName,AfterSomeMinutesToLoad));
   }
   IEnumerator Calculagraph(string SceneName,int AfterSomeMinutesToLoad)
   {
       yield return new WaitForSeconds (AfterSomeMinutesToLoad*60);
       DontDestroyOnLoad (this.gameObject);
       SceneManager.LoadSceneAsync(SceneName);
   }
}

補充:Unity小技巧——延時銷毀GameObject

當我們希望延遲一段時間銷毀GameObject,Component,或者 asset 的時候可以利用下面的函數來實現。

不用自己再去實現延遲計時操作。

Destroy(Object obj, float t = 0.0F);

第二個參數單位為秒,物體將在t秒後被銷毀。

using UnityEngine;
public class ScriptExample : MonoBehaviour
{
    void DestroyGameObject()
    {
        Destroy(gameObject);
    }
    void DestroyScriptInstance()
    {
        // 立刻從gameobject上移除該腳本
        Destroy(this);
    }
    void DestroyComponent()
    {
        // 從gameobject上移除rigidbody腳本
        Destroy(GetComponent<Rigidbody>());
    }
    void DestroyObjectDelayed()
    {
        // 5秒後銷毀當前gameobject
        Destroy(gameObject, 5);
    }
    // 當用戶按下Ctr鍵後,將會從gameobject上移除boxcollider腳本
    void Update()
    {
        if (Input.GetButton("Fire1") && GetComponent<BoxCollider>())
        {
            Destroy(GetComponent<BoxCollider>());
        }
    }
}

在做編輯器擴展開發的時候,非運行時環境,隻能使用 Object.DestroyImmediate()

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。

推薦閱讀:

    None Found