c# - 在切换组中按下切换按钮调用多个按钮

标签 c# android ios mobile unity-game-engine

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

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

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

在检查器中,我让“On”按钮在传入 1 时调用上面的函数。当按下“Off”时,它会调用带有 0 的相同函数。

9/2/14

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

2015 年 9 月 4 日

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

解决方案

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

最佳答案

我建议你应该使用 GameObject.FindObjectOfType<MusicPlayer>() .所以你可以确定它会在场景中获取 MusicPlayer

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

关于c# - 在切换组中按下切换按钮调用多个按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32342925/

相关文章:

c# - C# Random 类是如何工作的

c# - 在 MediaTypeFormatter 中请求 URI

c# - 在 C# 中使用带有异步的 SQLite

JAVA错误: "E/MediaPlayer: Error (-38,0)"

php - 在服务器端问题上运行 php

ios - 更改 MKmapView 中图钉的颜色会将新图钉图像以及当前位置变成旧图钉图像?

objective-c - didSelectRowAtIndexPath 在被调用 View 的 viewDidLoad 之后被调用

c# - 无法在 127.0.0.1 端口 555 上打开 TCP channel (SocketException : No Such Host Is Known)

Android PopupWindow 动画不工作

iphone - iOS 执行 LDAP 搜索