Unity:找不到带标签的所有对象

时间:2016-06-24 06:56:56

标签: c# unity3d tags

我正在制作TD游戏,并且可以选择在游戏过程中更改音量。我第一次写它的时候工作得很好,但现在没有,我很确定没有人改变相关部分。

我正在使用几个组件。

首先,有一个附加到炮塔的小脚本,将AudioSource音量设置为PlayerPrefs中设置的值。这很简单。

void Start () {
    SetVolume();
}

public void SetVolume() {
    if (gameObject.GetComponent<AudioSource> () == null) {
        gameObject.AddComponent<AudioSource> ();
    }
    gameObject.GetComponent<AudioSource>().volume = PlayerPrefs.GetFloat ("SFXVolume");
}

然后是从音量设置中调用的脚本。当用户滑动音量滑块时,该值将保存在PlayerPrefs中,然后我搜索带有Turret标记的对象,并在循环中更改其音量。

void Start () {
    musSlider = GameObject.Find ("MusicSlider");
    sfxSlider = GameObject.Find ("SFXSlider");
    if (!(PlayerPrefs.HasKey ("MusicVolume"))) {
        PlayerPrefs.SetFloat ("MusicVolume", 1.0f);
        PlayerPrefs.SetFloat ("SFXVolume", 1.0f);
    }
    musSlider.GetComponent <Slider> ().value = PlayerPrefs.GetFloat ("MusicVolume");
    sfxSlider.GetComponent <Slider> ().value = PlayerPrefs.GetFloat ("SFXVolume");
}

public void SetSFXVolume() {
    PlayerPrefs.SetFloat ("SFXVolume", sfxSlider.GetComponent <Slider> ().normalizedValue);
    if (!(String.Equals (SceneManager.GetActiveScene ().name, "VietrixMainMenuScene"))) {
        GameObject[] turrets = GameObject.FindGameObjectsWithTag("Turret");
        for (int i = 0; i < turrets.Length; i++) {
            if (String.Equals (turrets [i].name, "Turret")) {
                Debug.Log ("Turret name: " + turrets [i].transform.parent.gameObject.name);
            } else {
                Debug.Log ("Turret name: " + turrets [i].name);
            }
            turrets[i].GetComponent<AudioSource> ().volume = PlayerPrefs.GetFloat ("SFXVolume");
        }
    }
}

这里出了问题。我现在在场景中有6个炮塔,其中只有4个出现在日志中,并且它们的音量发生了变化。所有的标签都已到位,我刚刚检查了它的无数次。在显示的4个中,3个在炮塔上有标签,1个在炮塔及其父对象上都有标签。在没有出现的2个中,1个在炮塔上有标签,另一个在炮塔和父对象上都有标签。

可能发生了什么?我不是唯一一个在这个游戏上工作的人,但其他人发誓他们没有触及标签或音量脚本。

1 个答案:

答案 0 :(得分:1)

与其手动更改每个音频源的音量,不如查看 AudioMixer 已经完成您正在尝试执行的操作。 Here's a tutorial on it.

使用 GameObjects 的名称来尝试找到正确的名称并不是一个好主意,因为名称可以更改(例如,当它们被实例化时,它们将是 Turret(克隆))。

如果您真的对解决方案感兴趣,为什么不直接在 SetSFXVolume 的 VolumeSettings 脚本中执行此操作(假设炮塔上的小脚本名为 AudioSourceBuddy):

public void SetSFXVolume() {
    PlayerPrefs.SetFloat ("SFXVolume", sfxSlider.GetComponent <Slider> ().normalizedValue);
    if (!(String.Equals (SceneManager.GetActiveScene ().name, "VietrixMainMenuScene"))) {
        foreach(AudioSourceBuddy buddy in GameObject.FindObjectsOfType<AudioSourceBuddy >()) { 
            buddy.SetVolume();
        }
    }
}

这样您就不必担心遍历标签、检查名称等。您可以直接找到所有来源。