【问题标题】:How to have an object in Unity 3D that stays in scenes and does not recreate如何在 Unity 3D 中拥有一个留在场景中且不会重新创建的对象
【发布时间】:2019-02-16 12:35:29
【问题描述】:

我正在尝试找到一种在 Unity 3D 中播放背景音乐的好方法。我希望音乐在场景加载中保持一致。 Don't Destroy on load 很好并且可以工作,但是每次我加载同一个场景时,它都会创建另一个音乐游戏对象,因为场景本身就有游戏对象。我该如何解决我的问题?我是一个“初学者”(有点),所以我想要我能理解的代码。

【问题讨论】:

    标签: c# unity3d background playback


    【解决方案1】:

    在统一论坛上的一个问题的帮助下,我想我已经解决了我的问题。问题的链接在这里...

    https://answers.unity.com/questions/982403/how-to-not-duplicate-game-objects-on-dontdestroyon.html

    最佳答案是我正在使用的答案。

    代码是这样的……

    private static Player playerInstance;
    
    void Awake(){
        DontDestroyOnLoad(this);
    
        if (playerInstance == null) {
            playerInstance = this;
        } else {
            Destroy(gameObject); // Used Destroy instead of DestroyObject
        }
    }
    

    【讨论】:

      【解决方案2】:

      我建议创建一个 audioSource 对象,然后为该对象创建一个脚本并在唤醒函数上执行以下操作:

      void Awake() {
          DontDestroyOnLoad(this.gameObject);
      }
      

      这将使背景音乐在场景之间继续播放。有关更多信息,您可以使用 Unity 关于 this function 的文档。

      【讨论】:

      • 如果场景中存在对象,在加载相同场景时是否会创建另一个对象。还有你为什么用“this”?
      • 没关系,我回答了我自己的问题,并且知道如何使用“this”,谢谢。
      【解决方案3】:

      我建议从“EazySoundManagerDemo”之类的资产开始。它需要一点重构和改进(即它使用 3 组音频和 3 组辅助功能,而不是一组带有 AudioPurpose 枚举以增加代码重用)。

      然而,它确实解决了您遇到的基本问题,并且是使用音频管理器/层而不是简单地直接从您的游戏对象播放音频的一个很好的介绍。试一试,从中学习,然后对其进行调整或创建您自己的音频管理层。

      祝你好运!

      【讨论】:

      • 关于“EazySoundManagerDemo”的注释 - 在进一步检查代码后,我发现虽然持久对象问题得到解决,但 EazySoundManagerDemo 包含错误的设计模式、复制/粘贴代码并导致内存泄漏。仔细检查和使用!
      猜你喜欢
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-13
      相关资源
      最近更新 更多