IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 【Unity】跨场景音乐资源不间断播放(可控音量) -> 正文阅读

[游戏开发]【Unity】跨场景音乐资源不间断播放(可控音量)

场景描述

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

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

场景布局及层级目录

场景一(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<AlwaysPlay>();
                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<Button>();
        volumeSlider = GameObject.Find("volumeSlider").GetComponent<Slider>();
        audioSource = GameObject.Find("GameMusic").GetComponent<AudioSource>();
        //注册切换场景按钮的点击事件
        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<AudioSource>();
        ShiftButton = GameObject.Find("ShiftButton2").GetComponent<Button>();
        volumeSlider = GameObject.Find("volumeSlider2").GetComponent<Slider>();
        //注册切换场景按钮的点击事件
        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");
    }
}
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-08-18 13:01:39  更:2021-08-18 13:01:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 16:06:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码