我正在制作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个在炮塔上有标签,另一个在炮塔和父对象上都有标签。
可能发生了什么?我不是唯一一个在这个游戏上工作的人,但其他人发誓他们没有触及标签或音量脚本。
答案 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();
}
}
}
这样您就不必担心遍历标签、检查名称等。您可以直接找到所有来源。