问题描述

游戏开发中会有多个场景,有时会有这样的需求,我们需要保证场景跳转但是需要保持某个游戏对象不被销毁,比如:音乐

实现思路

unity中提供了DontDestroyOnLoad(),这个API

使用这个指令一般写在跳转场景之前,写在跳转场景的触发事件中,把背景音乐绑定的对象做成预制体,上面绑定了播放音乐的代码

实现代码

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement; public class DontDestroyMusicClass : MonoBehaviour { public GameObject MusicBk; //预制体(不销毁的物体(做成预制体))
private GameObject clone;//克隆的不销毁物体
void Start () {
clone = Instantiate(MusicBk, transform.position, transform.rotation) as GameObject;
} public void Btn()
{
DontDestroyOnLoad(clone);//切换场景不销毁clone
SceneManager.LoadScene();//跳到1场景
} }

这样就实现了不销毁所需物体的需求

加载不销毁的坑

想必大家也都发现了,这实现这功能没问题,但是出现了一个新问题:

在用这个API的时候,因为它是为了在游戏开发中不会由于场景的过度而销毁物体,所以会有一个很奇怪的问题,就是比如:如果场景0中有对象A,当跳转到场景1的时候,对象A也出现在场景1中,此时你可能会认为这是没问题的,但是你返回场景0中你就会发现出现了两个对象A,然后到场景1中,也会有两个对象A,再返回场景0,你会发现又多了一个对象A,再返回场景1又多了1个,依次递增

问题分析以及解决方案

这是重复性实例化出现的问题,在这里我用一个static bool变量来记录该对象是否被克隆过,如果克隆过就不再克隆依次解决该问题

修改后的代码

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement; public class DontDestroyMusicClass : MonoBehaviour { public GameObject MusicBk; //预制体(不销毁的物体(做成预制体))
public static bool isHave = false;
private GameObject clone;//克隆的不销毁物体
public void Btn()
{
if (!isHave)
{
clone = GameObject.Instantiate(MusicBk, transform.position, transform.rotation);
isHave = true; }
DontDestroyOnLoad(clone);//切换场景不销毁clone
SceneManager.LoadScene();//跳到1场景
} }

通过静态变量解决了该问题

(新手上路,望指教)

unity中加载场景不销毁以及切换场景重复实例化的更多相关文章

  1. Dll的编写 在unity中加载

    1. 在VS中新建Dll项目 2.在头文件中对函数进行声明 extern "C" int _declspec(dllexport) testunity(); 3.在源文件中写函数体 ...

  2. 下载某资源文件并加载其中的所有Prefab到场景中

    using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> / ...

  3. unity动态加载(翻译) .

    AssetBundles are files which you can export from Unity to contain assets of your choice. These files ...

  4. Unity资源 ----加载最好需要做哪些事

    先上图解 一.基本关键词 1)AssetBundle:一种保存“一个或多个资源的转变为某种利于传输等的特殊格式(二进制之类)”的文件.(我这边是使用Unity制作手游的角度来说明) 简称AB. 2)对 ...

  5. 细谈unity资源加载和卸载

    转载请标明出处:http://www.cnblogs.com/zblade/ 一.概要 在了解unity的资源管理方式之后,接下来细谈一下Unity的资源是如何从磁盘中加载到运行时的内存中,以及又是如 ...

  6. Unity 异步加载 进度条

    当我们进行游戏开发时,时常会进行场景切换,如果下个场景较大,切换时就会出现卡顿现象,甚至看起来像是"死机",非常影响用户体验,我们这时就可以运用异步加载,在界面上显示加载的进度条以 ...

  7. ASP.NET MVC中加载WebForms用户控件(.ascx)

    原文:ASP.NET MVC中加载WebForms用户控件(.ascx) 问题背景 博客园博客中的日历用的是ASP.NET WebForms的日历控件(System.Web.UI.WebControl ...

  8. .net core中加载lua脚本的类库: MoonSharp

    前言 MoonSharp是一个支持C#调用lua脚本的类库,支持.net, .net core, mono, unity,因此在.net core中也能够使用,而且加载和调用lua也很方便简单: 官网 ...

  9. web 中加载配置文件

    1.web.xml中配置   <!-- 加载配置文件 -->   <listener>      <description>ServletContextListen ...

随机推荐

  1. pc端常規頁面實現

    https://www.cnblogs.com/adc8868/p/5996885.html https://blog.csdn.net/chose_DoIt/article/details/8042 ...

  2. Linux C Socket简单实例与详细注释

    最近做的东西与socket十分紧密,所以很好奇它具体是如何实现的,以前也有了解过,但是又忘记了,于是把它记录下来,以便日后查看. 服务器端:server.c #include <sys/type ...

  3. C# AddRange为数组添加多个元素的代码

    将代码过程中重要的代码片段做个收藏,下面代码段是关于C# AddRange为数组添加多个元素的代码,希望对小伙伴有所用处.ArrayList ab = new ArrayList();ab.Add(& ...

  4. 洛谷P1072Hankson的趣味题题解

    题目 一道十分经典的数论题,在考场上也可以用暴力的算法来解决,从而得到\(50pts\)的较为可观的分数,而如果想要AC的话,我们观察原题给的数据范围\(a,b,c,d\)(为了好表示,分别代表a1, ...

  5. Hackers' Crackdown UVA - 11825 (状压dp)

    给出n个电脑,每个电脑连着n个服务,然后每个电脑都连着m个邻电脑,如果当前的电脑某个服务被断开了,相邻的电脑的服务也会被断开,每个电脑都只能操作一次,问你最多可以让多少种服务被断开.一种服务被断开的条 ...

  6. Python 练习——计算1-2+3-4...+99

    # 求1-99的所有数的和 count = 1 s = 0 while count < 100: s += count count += 1 print(s) 当都为正数时,即1+2+3+... ...

  7. python图形用户

    1)使用GUI 1.GUI:Graphical user interface 2.tkinter:GUI libary for Python自带的库 3.GUI:Example 2)Ubuntu18. ...

  8. grep废弃

    grep -inrw 字符串 .grep -i是忽略大小写的意思cat xxx|grep -i mem 会把文本里的MEM,meM.....等无关乎大小写的内容取出来grep -inrwgrep &q ...

  9. yarn安装使用

    npm install yarn -g // 到指定文件夹 yarn init // 生成package.json文件 yarn init报错 Can't answer a question unle ...

  10. CDN-常用静态资源公共库

    js.css 等静态资源可以放在自己的服务器上,或者引用网络上的公共库使用(CDN) CDN 读取失败时从本地加载 <script src="https://code.jquery.c ...