【问题标题】:Pressing toggle button in toggle group calls more than one button在切换组中按下切换按钮会调用多个按钮
【发布时间】:2015-09-02 00:32:12
【问题描述】:

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

我现在设置它的方式使它表现得很奇怪。如果音乐打开并且我单击“关闭”切换,则音乐将关闭。然后,如果我再次点击“开”,我会收到一个空对象引用错误,并且复选标记不会显示在“开”切换按钮中,直到我再次点击“开”然后声音又回来了。真正奇怪的是,当它重新打开时,当然会为音乐播放器创建一个游戏对象。当我再次尝试将其关闭时,音乐继续播放并创建了第二个音乐播放器游戏对象。我不明白发生了什么事。

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 时调用上面的函数。当按下“关”时,它会使用 0 调用相同的函数。

9/2/14

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

9/4/15

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

解决方案

我最终只是让 toggle.isOn 调用它试图访问的函数,并使用静态 bool 只让它在我想要的时候访问某些代码。 Thaina 的回答让我走到了那一步,所以这要归功于 Thaina。

【问题讨论】:

  • 你为什么使用两个切换按钮来实现单一目的..??
  • @rj 所以按钮可以用于调用具有两个不同值的方法,同时在检查器中进行设置
  • @rj 我只使用一个切换按钮更新了我的帖子。我已经让它大部分工作了,但你会在编辑中看到我的问题。谢谢。

标签: c# android ios mobile unity3d


【解决方案1】:

我建议你应该使用GameObject.FindObjectOfType&lt;MusicPlayer&gt;()。所以你可以确定它会在场景中获得 MusicPlayer

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

【讨论】:

  • 我不明白你的意思,因为你说它不是 MusicPlayer 而是 MusicPlayer。一样的名字?而且我已确保我指定了正确的名称。你认为有什么比使用名字更好的呢?我宁愿不要容易出错。大声笑
  • 不一样的名字。 “MusicPlayer”有空格字符,所以它不等于“MusicPlayer”。因为当您实例化“MusicPlayer”时,它将被命名为“MusicPlayer(Clone)”,而您的代码条“(Clone)”会在那里留下一个空格字符
  • @saboehnke 和 FindObjectOfType 使用类型而不是字符串名称。它返回您指定类型的对象,精确地获取您创建的 MonoBehavior。与 Find 使用字符串并返回 GameObject 不同。正确使用泛型而不是名称总是可以减少 C# 中的错误。字符串太动态
  • 如果你 if(bool) 然后 else。你不需要 else if(!bool)
  • 好的,我会试一试...是的,我知道我不需要 else if (!bool) 那里。当我试图弄清楚为什么它正在做它正在做的事情时,我只是 100% 准确。
猜你喜欢
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 2020-08-24
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
相关资源
最近更新 更多