我正在学习 Unity,我尝试在游戏开始时更改背景音乐的音量,但无法从设置菜单(设置场景)访问正在播放声音的脚本(游戏场景)。设置场景行中始终存在错误,显示“BGMusicScript = GameObject.FindGameObjectWithTag("BGMusic").GetComponent();”这表示“对象引用未设置到对象的实例”。
设置场景:
public class SettingsMenuLogic : MonoBehaviour
{
public TMP_Dropdown resolutionDropdown;
Resolution[] resolutions;
public Slider BGMusicSlider;
public GameObject backgroundMusicGameObject;
public BackgroundMusicScript BGMusicScript;
void Start()
{
resolutions = Screen.resolutions;
resolutionDropdown.ClearOptions();
List<string> options = new List<string>();
int currentResolutionIndex = 0;
for(int i = 0; i < resolutions.Length; i++)
{
string option = resolutions[i].width + " x " + resolutions[i].width;
options.Add(option);
if (resolutions[i].width == Screen.currentResolution.width && resolutions[i].height == Screen.currentResolution.height)
{
currentResolutionIndex = i;
}
}
resolutionDropdown.AddOptions(options);
resolutionDropdown.value = currentResolutionIndex;
resolutionDropdown.RefreshShownValue();
BGMusicScript = GameObject.FindGameObjectWithTag("BGMusic").GetComponent<BackgroundMusicScript>();
if (!PlayerPrefs.HasKey("BGMusicVolume"))
{
PlayerPrefs.SetFloat("BGMusicVolume", 1);
loadBGVolume();
} else
{
loadBGVolume();
}
}
public void setResolution(int resolutionIndex)
{
Resolution resolution = resolutions[resolutionIndex];
Screen.SetResolution(resolution.width, resolution.height, Screen.fullScreen);
}
public void changeBGVolume()
{
BGMusicScript.BGMusic.volume = BGMusicSlider.value;
saveBGVolume();
}
public void saveBGVolume()
{
PlayerPrefs.SetFloat("BGMusicVolume", BGMusicSlider.value);
}
public void loadBGVolume()
{
BGMusicSlider.value = PlayerPrefs.GetFloat("BGMUsicVolume");
}
public void setQuality(int qualityIndex)
{
QualitySettings.SetQualityLevel(qualityIndex);
}
public void setFullscreen(bool isFullscreen)
{
Screen.fullScreen = isFullscreen;
}
}
游戏场景脚本:
public class BackgroundMusicScript : MonoBehaviour
{
public BirdScript bird;
public AudioSource BGMusic;
// Start is called before the first frame update
void Start()
{
bird = GameObject.FindGameObjectWithTag("Bird").GetComponent<BirdScript>();
BGMusic = GetComponent<AudioSource>();
BGMusic.volume = PlayerPrefs.GetFloat("BGMusicVolume");
}
// Update is called once per frame
void Update()
{
if(bird.birdIsAlive == false)
{
BGMusic.Stop();
}
}
}
尝试在教程和谷歌上查找但没有成功,希望这里有人可以提供帮助。
使用音频混合器。
基本上,您可以将背景音频的
AudioSource
输出其音频变成AudioMixer
,并且可以使用设置菜单来设置前述AudioMixer
的输出音量。
AudioMixer
不属于任何场景(可从所有场景访问),这意味着您无需尝试在BackgroundMusicScript
内引用SettingsMenuLogic
。
如果您想知道如何重构设置菜单来调整音频混音器,此线程演示了如何在设置菜单中调整混音器:https://stackoverflow.com/a/50940850/22296059