Проблема с dontDestroyOnLoad в другой сцене - PullRequest
0 голосов
/ 14 января 2020

Я делаю игру, в которой есть две сцены (сцена меню и сцена игры). В сцене меню я создаю пустой игровой объект только для моего musi c, который включает (источник звука (musi c), кнопку отключения звука musi c и мой сценарий. Вот сценарий:

public class Music : MonoBehaviour
{
    public static Music Instance;

    public AudioSource mainMusic;

    public GameObject musicOffImage;

    // Keep The Muic Playing In Diffrent Scene
    void Awake()
    {
        if (!Instance)
            Instance = this;
        else
            Destroy(this.gameObject);

        DontDestroyOnLoad(this.gameObject);
    }

    // Method Mute Button
    public void MusicOnOff()
    {

        if (mainMusic.isPlaying)
        {
            mainMusic.Pause();
            musicOffImage.SetActive(true);
        }
        else
        {
            mainMusic.UnPause();
            musicOffImage.SetActive(false);
        }

    }
}

С помощью этого скрипта я могу играть musi c в разных сценах без перезагрузки musi c, и кнопка тоже работает, но проблема в том, когда я go на игровую сцену и Я возвращаюсь на сцену меню, кнопка почему-то не работает. Я думаю, что это объект игры Destroy, но я не уверен, как это исправить. Любая помощь будет много значить для меня. Спасибо.

1 Ответ

0 голосов
/ 14 января 2020

Я предполагаю, что все, что нужно сценариям Music, является его дочерним элементом, поэтому с ним всегда все в порядке.

Однако после Destroy экземпляра из новой сцены ваши кнопки из новой сцена теряет ссылку на экземпляр Music.

Так как у вас в любом случае есть синглтон, вы также можете (ab) использовать его и прикрепить к самой кнопке

public MusicButton : MonoBehaviour
{
    public void MusicOn()
    {
        Music.Instance.MusicOnOff();
    }
}

И укажите, что вместо этого в вашей кнопке.

Также изображение может, например, зарегистрироваться на Music.Instance, например,

public MusicImage : MonoBehaviour
{
    private void Start() 
    {
        Music.Instance.musicOffImage = gameObject; 
        gameObject.SetActive(Music.Instance.mainMusic.isPlaying);
    }
}

Альтернатива

В вашем вопросе Вы сказали, что все объекты являются дочерними по отношению к пустому объекту, однако единственный объект, который получает DontDestroyOnLoad, это Music. Остальные будут уничтожены и перезагружены, поэтому все эти ссылки также могут быть потеряны. Вы, вероятно, скорее всего DontDestroyOnLoad весь пустой объект и будете скрывать / показывать кнопку только в определенных сценах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...