问题描述
游戏开发中会有多个场景,有时会有这样的需求,我们需要保证场景跳转但是需要保持某个游戏对象不被销毁,比如:音乐
实现思路
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 }
通过静态变量解决了该问题
(新手上路,望指教)