Unity, у меня проблема с DontDestroyOnLoad, чтобы отслеживать в разных сценах - PullRequest
0 голосов
/ 11 января 2020

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

Первый скрипт

public static KeepTheMusicOn Instance;

    void Awake()
    {

        if (!Instance)
            Instance = this;

        else
            Destroy(this.gameObject);


        DontDestroyOnLoad(this.gameObject);
    }

С этим скриптом я могу сохранить musi c играет во второй сцене без перезапуска musi c, и в главном меню сцены у меня есть настройки, в которых есть кнопка для отключения звука c, кнопка запустит мой второй скрипт.

Второй сценарий:

     public AudioSource mainMusic;

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

    public void MusicOnOff()
    {

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

    }

Моя проблема в том, когда я запускаю игру, так что я в сцене моего главного меню, я могу приглушить музыку c с помощью кнопки, но когда я go в игру, и я вернулся в меню, кнопка ничего не делает. Так что это моя проблема, я надеюсь, что кто-нибудь может мне помочь. Извините за мой плохой английский sh.

1 Ответ

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

Похоже, при переключении сцен вы уничтожаете кнопку. Когда вы go вернетесь в главное меню, вы уничтожите дубликат экземпляра вашего аудиоконтроллера => ссылки, настроенные в кнопке, будут потеряны.


В вашем случае, так как вы используете publi c Синглтон, в любом случае, вы также можете (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 publi c и ссылаться на него в событии onClick кнопки вручную.

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