2015-09-02 102 views
1

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

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

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以查看声音是否应该打开。当我从一个场景切换到具有切换按钮的场景时,我仍然会遇到一个问题。当我这样做时,音乐停止。出于某种原因,调用只应在按下切换按钮时才会调用的方法。有任何想法吗?

15年9月4日

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

SOLUTION

我最终只是让toggle.isOn称,它正在试图访问的功能和使用的静态布尔只让它访问特定的代码时,我想它。 Thaina的回答是让我足够深入到这一点,所以信用Thaina。

+0

你为什么使用两个切换按钮来实现单一目的? –

+0

@rj所以这两个按钮可以用来调用两个不同的值,同时都在检查器中设置 – saboehnke

+0

@rj我只用一个切换按钮更新了我的帖子。我已经完成了它的大部分工作,但您会在编辑中看到我的问题。谢谢。 – saboehnke

回答

1

我建议你应该使用GameObject.FindObjectOfType<MusicPlayer>()。所以,你可以肯定,它会在现场

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

+0

我不知道你的意思,因为你说它不是MusicPlayer而是MusicPlayer。一样的名字?而且我确定我正在指定正确的名称。你认为什么比使用名字更好?我宁愿不要容易出错。哈哈 – saboehnke

+0

不一样的名字。 “MusicPlayer”具有空格字符,因此不等于“MusicPlayer”。因为当你实例“MusicPlayer”将它命名为“MusicPlayer(克隆)”和你的代码条带“(克隆)”留下一个空格字符有 – Thaina

+0

@saboehnke而FindObjectOfType使用类型不是字符串名称。它返回你指定类型的对象,精确得到你创建的MonoBehavior。与查找使用字符串并返回GameObject不同。正确使用通用名称而不是名称总是会减少C#中的错误。字符串太动态 – Thaina