2016-12-12 5 views
0

Привет, я много разбираюсь в этой проблеме, но не смог найти лучшего решения моей проблемы.Как использовать кнопку «Отключить звук»/«Включить звук»?

Так что проблема в том, что моя фоновая музыка начинает играть. У меня есть две кнопки. «Вкл» и «Выкл.». Я хочу отключить музыку, поэтому, когда я нажимаю кнопку отключения звука, она от «Вкл.» Переходит в «Выкл.» И музыка останавливается. Но когда я меняю сцену и возвращаюсь, она возвращается к кнопке с текстом «Вкл», но музыка все еще остановлена. Итак, мой вопрос заключается только в том, как сохранить измененную кнопку без возврата по умолчанию? Вот мой сценарий:

public GameObject on; 
public GameObject off; 
public string sound; 

Soundtrack music; 
static bool isMuted; 


void Awake() 
{ 
    SoundCheck(); 


} 
void Start() 
{ 
    music = FindObjectOfType<Soundtrack>(); 
} 
public void Off() 
{ 
    if (isMuted == false) 
    { 
    on.gameObject.SetActive(false); 
    off.gameObject.SetActive(true); 
    music.s.Stop(); 
    isMuted = true; 
    PlayerPrefs.SetString("Sound", "muted"); 
    } 
} 
public void On() 
{ if(isMuted==true) 
    { 
    on.gameObject.SetActive(true); 
    off.gameObject.SetActive(false); 
    music.s.Play(); 
    isMuted = false; 
    PlayerPrefs.SetString("Sound", "enabled"); 
    } 
} 
public void SoundCheck() 
{ 
    sound = PlayerPrefs.GetString("Sound"); 

    if (sound == "enabled") 
    { 
     isMuted = false; 
    } 
    else if (sound == "muted") 
    { 
     isMuted = true; 
    } 
} 

}

+0

Возможно, это не связано с проблемой, но похоже, что у вас есть большая проблема с вашими операторами if: многострочный код, который вы хотите выполнить в инструкции if, должен быть заключен в фигурные скобки - в противном случае, только первая строка после оператора if будет условно выполнена. Например, в 'Off()', единственная строка, которая будет выполнена условно, будет 'on.gameObject.SetActive (false);'. Остальные строки будут выполняться каждый раз при вызове метода, независимо от того, что. Я рекомендую вам привыкнуть писать фигурные скобки с каждым выражением, которое вы пишете. – Serlite

+0

О да, я знал это. Это не работает, когда я помещаю фигурные скобки на весь код в функции. Теперь я должен был случайно удалить их при написании этого сообщения. Но спасибо за внимание :). Теперь я исправлю его для будущих читателей. –

+0

Похож на дубликат. Пожалуйста, посмотрите [здесь] (http://stackoverflow.com/a/41073496/3785314) – Programmer

ответ

0

легко. Прежде всего, лучше сохранить bool в своих PlayerPrefs вместо string. Но чтобы решить вашу проблему все, что вам нужно сделать, это добавить в

public void SoundCheck() { sound = PlayerPrefs.GetString("Sound"); if (sound == "enabled") { isMuted = false; } else if (sound == "muted") { isMuted = true; } on.gameObject.SetActive(isMuted); off.gameObject.SetActive(!isMuted); }

+0

Как насчет функций «on» и «off»? –

+0

Должен ли я что-то менять с них? –

+0

Если вы измените тип PlayerPrefs с 'string' на 'bool', тогда вам придется его модифицировать, но вместо этого нет. – zhekazheka

0

Вам нужно изменить саундчека() вызов в Start Функция не Awake! Пуск() вызовет, когда вы вернетесь, но не пробудитесь.

Btw:

  1. Должен BOOL для сохранения PlayerPrefs,
  2. Подумайте кнопку и изменить спрайт Sprite On и Off Sprite может лучше.