【问题标题】:Unity, I have problem with DontDestroyOnLoad to keep tracking in different scenceUnity,我对 DontDestroyOnLoad 有问题,无法在不同的场景中保持跟踪
【发布时间】:2020-01-11 13:34:06
【问题描述】:

我是新人,我有一个问题 我正在制作一个有 2 个场景(主菜单场景和游戏场景)的游戏,我将音乐放在主菜单场景上。我制作了一个空的游戏对象,并在其中附加了音频源(音乐),并且还附加了这样的脚本:

第一个脚本

public static KeepTheMusicOn Instance;

    void Awake()
    {

        if (!Instance)
            Instance = this;

        else
            Destroy(this.gameObject);


        DontDestroyOnLoad(this.gameObject);
    }

使用该脚本,我可以在不重新启动音乐的情况下保持音乐在第二个场景中播放,并且在主菜单场景中,我有设置按钮来静音音乐,该按钮将运行我的第二个脚本。

第二个脚本:

     public AudioSource mainMusic;

    public void Update()
    {
        DontDestroyOnLoad(mainMusic);
    }

    public void MusicOnOff()
    {

        if (mainMusic.isPlaying)
        {
            mainMusic.Pause();
        }
        else
        {
            mainMusic.UnPause();
        }

    }

我的问题是当我开始游戏时,我在我的主菜单场景中我可以用按钮静音音乐,但是当我进入游戏场景并返回菜单时,按钮不做任何事情。 所以这是我的问题,我希望任何人都可以帮助我。对不起我的英语不好。

【问题讨论】:

  • 不确定第二个脚本是什么,但是,它不需要每帧都做 dontdestroyonload .. 如果第一个脚本是 mainmusic 游戏对象的一部分,那就足够了。如果第二个脚本在场景中,或者不是该主要音乐游戏对象的一部分,则每个场景都需要找到该主要音乐游戏对象,因为它可能已经在其中,不再相关

标签: unity3d


【解决方案1】:

听起来好像在切换场景时您会破坏按钮。当您返回主菜单时,您会破坏音频控制器事物的重复实例 => Button 中配置的引用丢失。


在您的情况下,因为您无论如何都使用公共 Singleton,您也可以(ab)使用它并将组件放在 Button 本身上(因此引用不会丢失)并执行类似的操作,例如

[RequireComponent(typeof(Button))]
public class MusicButton : MonoBehaviour
{
    [SerializeField] private Button button;

    private void Awake()
    {
        if(!button) button = GetComponemt<Button>();

        // dynamically add the callback
        // it won't appear in the editor but get called in onClick
        button.onClick.AddListener(OnClicked);
    }

    private void OnClicked()
    {
        KeepTheMusicOn.Instance.MusicOnOff();
    }
}

如果您更喜欢在编辑器中查看它,当然也可以从 Awake 移动它,将 OnClicked 公开并在按钮的 onClick 事件中手动引用它。

【讨论】:

    猜你喜欢
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多