繁体   English   中英

在切换组中按切换按钮会调用多个按钮

[英]Pressing toggle button in toggle group calls more than one button

在我的统一游戏中,我有两个切换按钮,它们都在切换组中。 它们是标记为“打开”和“关闭”的按钮,用于打开和关闭游戏音乐。

我现在设置的方式使其行为非常奇怪。 如果音乐打开并且我单击“关闭”切换,则音乐关闭。 然后,如果我再次单击“开”,则会收到空对象引用错误,并且在再次单击“开”之前,复选标记不会出现在“开”切换按钮中,直到声音再次出现。 真正奇怪的是,当它重新打开时,当然会为音乐播放器创建一个游戏对象。 当我尝试再次将其关闭时,音乐将保持打开状态,并创建另一个音乐播放器游戏对象。 我不明白发生了什么。

void Start () 
{
    checkWhatsOn();
}

void checkWhatsOn()
{
    bool sound = PlayerPrefs.GetInt("Sound Playing", 1) == 1;
    //if (sound) soundToggle.isOn = true;  //THESE TWO STATEMENTS
    //else soundToggle.isOn = false;       //ARE CAUSING THE ISSUE!!
}

public void switchSound()
{
    print (string.Format("In switch method sound is {0}", PlayerPrefs.GetInt("Sound Playing", 6)));
    bool sound = PlayerPrefs.GetInt("Sound Playing", 1) == 1;
    if (sound)
    {
        if (GameObject.FindObjectOfType<MusicPlayer>() != null)
        {
            PlayerPrefs.SetInt("Sound Playing", 0);
            PlayerPrefs.Save();
            GameObject.FindObjectOfType<MusicPlayer>().GetComponent<MusicPlayer>().Disable();
        }
        else print ("Sound wasn't changed, MusicPlayer needs to be null.");
    }
    else if (!sound)
    {
        PlayerPrefs.SetInt("Sound Playing", 1);
        PlayerPrefs.Save();
        if (GameObject.FindObjectOfType<MusicPlayer>() == null)
        {
            musicPlayer = Instantiate (Resources.Load ("MusicPlayer")) as GameObject;
            GameObject.DontDestroyOnLoad(musicPlayer);
        }
        else print ("Sound wasn't changed, MusicPlayer shouldn't be null.");
    }
    print (string.Format("After switch method sound is {0}", PlayerPrefs.GetInt("Sound Playing", 7)));
}

在检查器中,我通过传入1的同时在上方打开了“ On”按钮。在按下“ Off”时,它以0调用相同的函数。

14年9月2日

我仅使用一个切换按钮更新了代码。 切换按钮调用一种方法,该方法检查PlayerPrefs以查看是否应打开声音。 当我从一个场景移到其中具有切换按钮的场景时,仍然遇到一个问题。 当我这样做时,音乐就停止了。 出于某种原因,仅当按下切换按钮时才调用该方法。 有任何想法吗?

15年9月4日

在测试了Thaina告诉我的内容之后(上面的代码已更新),我将问题缩小到以下事实:如果我尝试将切换按钮设置为on,它将自动调用该切换器附带的函数。 我只想在按下该函数时调用它,而不是在设置其保存状态时调用它。 有没有办法做到这一点?

我最后只是让toggle.isOn调用了它试图访问的函数,并使用了一个静态布尔值仅在需要时才允许它访问某些代码。 Thaina的答案是让我足够远的地方达到了这一点,因此归功于Thaina。

我建议您使用GameObject.FindObjectOfType<MusicPlayer>() 因此,您可以确定它将在场景中获得MusicPlayer

我怀疑您的MusicPlayer对象实际上被命名为“ MusicPlayer”,而不是“ MusicPlayer”。 无论如何,以我的名字命名对象并不是一个好主意。 容易出错

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM