问题描述

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

实现思路

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. Power BI For Competition

    It's traditional report design, I'm insufficient for designing that if had a designer to help me wil ...

  2. BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块

    题目描述 输入 输出 样例输入 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 样例输出 2 2 1 1 3 2 2 1 提示 N=100000,M=1000000 ...

  3. 洛谷P1072Hankson的趣味题题解

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

  4. 2017-12-20python全栈9期第五天第一节之昨日内容回顾和作业讲解之字母变大写

    #!/user/bin/python# -*- coding:utf-8 -*-lis = [2,3,'k',['qwe',20,['k1',['tt','3','1']],89],'ab','adv ...

  5. Lending Club—构建贷款违约预测模型

    python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...

  6. hadoop记录-浅析Hadoop中的DistCp和FastCopy(转载)

    DistCp(Distributed Copy)是用于大规模集群内部或者集群之间的高性能拷贝工具. 它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成. 它把文件和目录的列表作为ma ...

  7. MyISAM与InnoDB的区别是什么?

    1. 存储结构 MyISAM:每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型..frm文件存储表定义.数据文件的扩展名为.MYD (MYData).索引文件 ...

  8. Java调用第三方http接口的方式

    1. 概述 在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适.很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信.天气等). 在J ...

  9. 在没联网环境下,启动tomcat出错

    使用SSH框架,在联网情况下,项目可以正常运行,当一旦断网,则启动服务器报错: org.hibernate.HibernateException: Could not parse configurat ...

  10. sql server 删除所有表和递归查询、数字类型转为字符串

    1.删除所有表 select 'drop table '+name+';' from sys.tables where name like 'DataSyncV1DelaySample%' or na ...