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

时间:2015-09-02 00:32:12

标签: c# android ios mobile unity3d

在我的团结游戏中,我有两个切换按钮,它们都在一个切换组中。它们是标有" On"和"关"用于打开和关闭游戏音乐。

我现在设置它的方式使它表现得非常奇怪。如果音乐已开启,我会点击"关闭"切换,音乐关闭。然后如果我点击" On"再次,我得到一个空对象引用错误,并且复选标记没有显示在" On"切换按钮,直到我点击"开"第二次,然后声音重新开始。真正奇怪的是,当它重新开启时,当然会为音乐播放器创建一个游戏对象。当我再次尝试将其关闭时,音乐会保持打开状态,并创建第二个音乐播放器游戏对象。我不明白发生了什么。

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)));
}

在检查员中我有&#34; On&#34;传入1时按钮调用上面的功能。当&#34;关&#34;按下,它用0调用相同的函数。

14年9月2日

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

15年9月4日

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

我最后只是让toggle.isOn调用它试图访问的函数,并使用静态bool只让它在我想要的时候访问某些代码。 Thaina的答案是让我远远达到这一点的原因,所以归功于Thaina。

1 个答案:

答案 0 :(得分:1)

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

我怀疑你的MusicPlayer对象实际上被命名为“MusicPlayer”而不是“MusicPlayer”。无论如何,通过它的名字得到对象在我看来是个坏主意。它容易出错