zoukankan      html  css  js  c++  java
  • 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 }

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

    (新手上路,望指教)

  • 相关阅读:
    因为付出,所以喜欢。开发就是这么坑!
    停滞在一个圈子,决定人生的高低![深度文章]
    我不曾忘记的初心-程序员如何看待买房子
    能力要进化-还在技术停滞不前吃老本吗?
    能力要进化-还在技术停滞不前吃老本吗?
    我不曾忘记初心-我们最终都成了自己讨厌的人
    我不曾忘记初心-我们最终都成了自己讨厌的人
    我不曾忘记的初心-冒险努力正是你缺少的!
    我不曾忘记的初心-冒险努力正是你缺少的!
    JS之正则表达式
  • 原文地址:https://www.cnblogs.com/answer-yj/p/10608285.html
Copyright © 2011-2022 走看看