无法从统一的另一个场景访问脚本

问题描述 投票:0回答:1

我正在学习 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();
        }
    }
}

尝试在教程和谷歌上查找但没有成功,希望这里有人可以提供帮助。

c# unity-game-engine unityscript
1个回答
0
投票

使用音频混合器

基本上,您可以将背景音频的

AudioSource
输出其音频变成
AudioMixer
,并且可以使用设置菜单来设置前述
AudioMixer
的输出音量。

AudioMixer
不属于任何场景(可从所有场景访问),这意味着您无需尝试在
BackgroundMusicScript
内引用
SettingsMenuLogic

如果您想知道如何重构设置菜单来调整音频混音器,此线程演示了如何在设置菜单中调整混音器:https://stackoverflow.com/a/50940850/22296059

© www.soinside.com 2019 - 2024. All rights reserved.