unity中加載場景不銷毀以及切換場景重復實例化


問題描述

游戲開發中會有多個場景,有時會有這樣的需求,我們需要保證場景跳轉但是需要保持某個游戲對象不被銷毀,比如:音樂

實現思路

 unity中提供了DontDestroyOnLoad(),這個API

使用這個指令一般寫在跳轉場景之前,寫在跳轉場景的觸發事件中,把背景音樂綁定的對象做成預制體,上面綁定了播放音樂的代碼

實現代碼

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 using UnityEngine.SceneManagement;
 5 
 6 public class DontDestroyMusicClass : MonoBehaviour {
 7 
 8     public GameObject MusicBk; //預制體(不銷毀的物體(做成預制體))
 9     private GameObject clone;//克隆的不銷毀物體
10     void Start () {
11         clone = Instantiate(MusicBk, transform.position, transform.rotation) as GameObject;
12     }
13 
14     public void Btn()
15     {
16         DontDestroyOnLoad(clone);//切換場景不銷毀clone
17         SceneManager.LoadScene(1);//跳到1場景
18     }
19 
20 }

這樣就實現了不銷毀所需物體的需求

加載不銷毀的坑

想必大家也都發現了,這實現這功能沒問題,但是出現了一個新問題:

在用這個API的時候,因為它是為了在游戲開發中不會由於場景的過度而銷毀物體,所以會有一個很奇怪的問題,就是比如:如果場景0中有對象A,當跳轉到場景1的時候,對象A也出現在場景1中,此時你可能會認為這是沒問題的,但是你返回場景0中你就會發現出現了兩個對象A,然后到場景1中,也會有兩個對象A,再返回場景0,你會發現又多了一個對象A,再返回場景1又多了1個,依次遞增

問題分析以及解決方案

這是重復性實例化出現的問題,在這里我用一個static bool變量來記錄該對象是否被克隆過,如果克隆過就不再克隆依次解決該問題

修改后的代碼

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 using UnityEngine.SceneManagement;
 5 
 6 public class DontDestroyMusicClass : MonoBehaviour {
 7 
 8     public GameObject MusicBk; //預制體(不銷毀的物體(做成預制體))
 9     public static bool isHave = false;
10     private GameObject clone;//克隆的不銷毀物體
11     public void Btn()
12     {
13         if (!isHave)
14         {
15             clone = GameObject.Instantiate(MusicBk, transform.position, transform.rotation);
16             isHave = true;
17 
18         }
19         DontDestroyOnLoad(clone);//切換場景不銷毀clone
20         SceneManager.LoadScene(1);//跳到1場景
21     }
22 
23 }

通過靜態變量解決了該問題

(新手上路,望指教)


免責聲明!

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



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