【Unity】跨场景音乐资源不间断播放(可控音量)

您所在的位置:网站首页 flash怎么导入音乐全部场景使用 【Unity】跨场景音乐资源不间断播放(可控音量)

【Unity】跨场景音乐资源不间断播放(可控音量)

2023-08-28 06:12| 来源: 网络整理| 查看: 265

文章目录 场景描述场景布局及层级目录场景一(SceneOne)场景二(SceneTwo) 脚本GameConst.csAlwaysPlay.csController.csController2.cs

场景描述

两个场景:场景一和场景二

当从场景一点击“去场景二”按钮时,可以切换至场景二,音乐可不间断播放。当从场景二点击“去场景一”按钮时,切换回场景一。两个场景中均可控制音乐资源的音量

场景布局及层级目录 场景一(SceneOne)

在这里插入图片描述 其中,ShiftButton用于切换场景二,volumeSlider用于控制音量大小。

GameMusic(空物体)上挂载了AudioSource组件(声音资源)及AlwaysPlay脚本(使用DontDestroyOnLoad方法在跨场景过程中不销毁GameMusic物体)。

GameManager(空物体)上挂载了Controller脚本。

场景二(SceneTwo)

在这里插入图片描述 其中,ShiftButton2用于切换场景一,volumeSlider2用于控制音量大小。

GameManager2(空物体)上挂载了Controller2脚本。

脚本 GameConst.cs

用于保存游戏中需要保存的常量,这里保存音乐资源的音量。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameConst : MonoBehaviour { public enum PlayerPrefsStr { soundValue, } } AlwaysPlay.cs

使用DontDestroyOnLoad方法使得音乐资源所在空物体在场景二中不被销毁。 需要考虑再次进入场景的重复问题。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class AlwaysPlay : MonoBehaviour { static AlwaysPlay _instance; public static AlwaysPlay instance { get { if (_instance == null) { _instance = FindObjectOfType(); DontDestroyOnLoad(_instance.gameObject); } return _instance; } } private void Awake() { //此脚本永不销毁,并且每次进入初始场景时进行判断,若存在重复的则销毁 if (_instance == null) { _instance = this; DontDestroyOnLoad(this); } else if (this != _instance) { Destroy(gameObject); } } } Controller.cs using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; public class Controller : MonoBehaviour { private Button ShiftButton; private Slider volumeSlider; private AudioSource audioSource; void Awake() { //获取对应组件 ShiftButton = GameObject.Find("ShiftButton").GetComponent(); volumeSlider = GameObject.Find("volumeSlider").GetComponent(); audioSource = GameObject.Find("GameMusic").GetComponent(); //注册切换场景按钮的点击事件 ShiftButton.onClick.AddListener(OnShiftClick); } void Start() { Init(); audioSource.Play(); } public void Init() { //当音量是有上一次记录的值时,附上相应的值 if(PlayerPrefs.HasKey(GameConst.PlayerPrefsStr.soundValue.ToString())) { float vol = PlayerPrefs.GetFloat(GameConst.PlayerPrefsStr.soundValue.ToString()); audioSource.volume = vol; volumeSlider.value = vol; } //否则,设置当前音量值为1 else { audioSource.volume = 1; PlayerPrefs.SetFloat(GameConst.PlayerPrefsStr.soundValue.ToString(),1); volumeSlider.value = 1; } //音量条拖动时,记录下当前音量值 volumeSlider.onValueChanged.AddListener(delegate (float vol) { PlayerPrefs.SetFloat(GameConst.PlayerPrefsStr.soundValue.ToString(),vol); audioSource.volume = vol; }); } //点击切换按钮,切换至场景二 void OnShiftClick() { SceneManager.LoadScene("SceneTwo"); } } Controller2.cs using System.Diagnostics; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; public class Controller2 : MonoBehaviour { private Button ShiftButton; private AudioSource audioSource; private Slider volumeSlider; void Awake() { //获取对应组件 audioSource = GameObject.Find("GameMusic").GetComponent(); ShiftButton = GameObject.Find("ShiftButton2").GetComponent(); volumeSlider = GameObject.Find("volumeSlider2").GetComponent(); //注册切换场景按钮的点击事件 ShiftButton.onClick.AddListener(OnShiftClick); } // Start is called before the first frame update void Start() { if(PlayerPrefs.HasKey(GameConst.PlayerPrefsStr.soundValue.ToString())) { float vol = PlayerPrefs.GetFloat(GameConst.PlayerPrefsStr.soundValue.ToString()); audioSource.volume = vol; volumeSlider.value = vol; } else { audioSource.volume = 1; PlayerPrefs.SetFloat(GameConst.PlayerPrefsStr.soundValue.ToString(),1); volumeSlider.value = 1; } volumeSlider.onValueChanged.AddListener(delegate (float vol) { PlayerPrefs.SetFloat(GameConst.PlayerPrefsStr.soundValue.ToString(),vol); audioSource.volume = vol; }); } //点击切换按钮,切换回场景一 void OnShiftClick() { SceneManager.LoadScene("SceneOne"); } }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3