C# 按切换组中的切换按钮可调用多个按钮

C# 按切换组中的切换按钮可调用多个按钮,c#,android,ios,mobile,unity3d,C#,Android,Ios,Mobile,Unity3d,在我的unity游戏中,我有两个切换按钮,它们都在一个切换组中。它们是标有“开”和“关”的按钮,用于打开和关闭游戏音乐 我现在设置它的方式使它的行为非常奇怪。如果音乐打开,我单击“关闭”切换,音乐将关闭。然后,如果我再次点击“开”,我会得到一个空对象引用错误,复选标记不会出现在“开”切换按钮中,直到我第二次点击“开”,然后声音再次响起。真正奇怪的是,当它重新打开时,当然会为musicplayer创建一个游戏对象。当我再次尝试关闭它时,音乐将保持打开状态,并创建第二个musicplayer游戏对象

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

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

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)));
}
void Start()
{
检查Whatson();
}
void checkWhatsOn()
{
bool sound=PlayerPrefs.GetInt(“声音播放”,1)=1;
//if(sound)soundToggle.isOn=true;//这两条语句
//else soundToggle.isOn=false;//导致问题的原因!!
}
公共声音
{
打印(string.Format(“在开关方法中声音为{0}”,PlayerPrefs.GetInt(“声音播放”,6)));
bool sound=PlayerPrefs.GetInt(“声音播放”,1)=1;
如果(声音)
{
if(GameObject.FindObjectOfType()!=null)
{
PlayerPrefs.SetInt(“声音播放”,0);
PlayerPrefs.Save();
GameObject.FindObjectOfType().GetComponent().Disable();
}
else打印(“声音未更改,MusicLayer需要为空。”);
}
否则,如果(!声音)
{
PlayerPrefs.SetInt(“声音播放”,1);
PlayerPrefs.Save();
if(GameObject.FindObjectOfType()==null)
{
MusicLayer=实例化(Resources.Load(“MusicLayer”))作为游戏对象;
GameObject.DontDestroyOnLoad(MusicLayer);
}
else打印(“声音未更改,MusicLayer不应为空。”);
}
打印(string.Format(“切换方法后声音为{0}”),PlayerPrefs.GetInt(“声音播放”,7));
}
在inspector中,我使用“On”按钮调用上述函数,同时传入1。当按下“Off”键时,它将使用0调用相同的函数

9/2/14

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

9/4/15

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

解决方案


最后,我让toggle.isOn调用它试图访问的函数,并使用静态bool仅允许它在需要时访问某些代码。Thaina的答案是什么让我走到了这一步,所以功劳归于Thaina。

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


我怀疑您的MusicLayer对象实际上命名为“MusicLayer”而不是“MusicLayer”。无论如何,在我看来,按名称获取对象是个坏主意。它容易出错

为什么要使用两个切换按钮来实现单一目的..???@rj因此,当两个按钮都在inspector@rj我只使用一个切换按钮更新了我的帖子。我已经让它大部分工作,但你会看到我的问题在编辑。谢谢。我不知道你的意思,因为你说的不是MusicPlayer而是MusicPlayer。同名?我已经确保指定了正确的名称。你认为有什么比用名字更好?我宁愿不容易出错。不是同一个名字。“MusicLayer”具有空格字符,因此不等于“MusicLayer”。因为当您实例化“MusicLayer”时,它将被命名为“MusicLayer(克隆)”,而您的代码条(克隆)将留下一个空格字符there@saboehnke以及使用类型而不是字符串名称查找对象类型。它返回您指定类型的对象,精确地获取您创建的MonoBehavior。与使用字符串和返回GameObject查找不同。正确使用泛型而不是名称总是可以减少C#中的错误。字符串太动态了,所以如果你使用if(bool),那么使用else。如果(!bool)好的,我会试一试……是的,我知道如果(!bool)在那里,我不需要其他的。当我试图弄清楚它为什么这么做的时候,我只是100%的精确。