【unity小技巧】Unity音乐和音效管理器,持久化存储设置记录(2024/6/30补充)

最终效果

在这里插入图片描述

前言

在游戏开发中,音乐和音效的管理是一个重要的环节。好的音乐和合适的音效可以为游戏增添氛围并提升玩家的体验。为了更好地管理音乐和音效,我们可以使用一个专门的音乐和音效管理器。

在本文中,我将向大家介绍如何在Unity中创建一个简单而实用的音乐和音效管理器。通过这个管理器,我们可以轻松地控制音乐和音效的播放、静音以及音量调节等功能。

首先,我们需要创建一个名为AudioManager的C#脚本。在这个脚本中,我们定义了音乐和音效的Sound数组以及对应的AudioSource。通过Sound数组,我们可以方便地管理多个音乐和音效资源。而AudioSource则负责实际的音频播放。

在AudioManager中,我们提供了几个方法来实现音乐和音效的播放控制。例如,我们可以通过PlayMusic方法来播放指定名称的音乐,通过PlaySFX方法来播放指定名称的音效。同时,我们还提供了ToggleMusic和ToggleSFX方法,用于切换音乐和音效的静音状态。此外,我们还可以使用MusicVolume和SFXVolume方法来调节音乐和音效的音量。

为了进一步便利使用,我们创建了一个名为UIController的脚本。在这个脚本中,我们可以通过与用户界面交互来控制音乐和音效的播放、静音以及音量调节等操作。通过将UI元素(如Slider)与相应的方法绑定,我们可以轻松地实现音乐和音效的控制。

通过使用这个音乐和音效管理器,我们可以更加方便地管理游戏中的音频资源,提供更好的音乐和音效体验。在接下来的文章中,我将详细介绍如何创建和使用这个管理器,并给出一些实际的应用示例。

希望本文对大家在Unity游戏开发中的音乐和音效管理有所帮助!让我们一起进入音乐的世界,为游戏增添更多的乐趣吧!

开始

新增Sound

using UnityEngine;

[System.Serializable]
public class Sound
{
    public string name;         // 音频剪辑的名称
    public AudioClip clip;      // 音频剪辑
    [Range(0f, 1f)]
    public float volume = 0.7f; // 音量大小
}

新增一个AudioManager的类,用于管理音效和音乐的播放。其中包括了定义音乐和音效的Sound数组,定义音乐和音效的AudioSource,以及播放音乐和音效的方法。在程序唤醒时,会判断是否已经存在Instance,确保在整个程序中只有一个AudioManager存在。

public class AudioManager : MonoBehaviour
{
	public static AudioManager Instance;
	
	//定义音乐和音效的Sound数组
	public Sound[] musicSounds, sfxSounds;
	//音乐和音效的AudioSource
	public AudioSource musicSource, sfxSource;

	private void Awake() 
	{
	    if (Instance == null) 
	    {
	        Instance = this;
	        //在场景切换时不销毁该对象
	        DontDestroyOnLoad(gameObject);
	    }
	    else 
	    {
	        Destroy(gameObject);
	    }
	}
	
	//播放音乐的方法,参数为音乐名称
	public void PlayMusic(string name) 
	{
	    //从音乐Sounds数组中找到名字匹配的Sound对象
	    Sound s = Array.Find(musicSounds, x => x.name == name);
	    //如果找不到对应的Sound,输出错误信息
	    if (s == null) 
	    {
	        Debug.Log("没有找到音乐");
	    }
	    //否则将音乐源的clip设置为对应Sound的clip并播放
	    else 
	    {
	        musicSource.clip = s.clip;
	        musicSource.Play();
	    }
	}

	//播放音效的方法,参数为音效名称
	public void PlaySFX(string name) 
	{
	    //从音效Sounds数组中找到名字匹配的Sound对象
	    Sound s = Array.Find(sfxSounds, x => x.name == name);
	    //如果找不到对应的Sound,输出错误信息
	    if (s == null) 
	    {
	        Debug.Log("没有找到音效");
	    }
	    //否则播放对应Sound的clip
	    else 
	    {
	        sfxSource.PlayOneShot(s.clip);
	    }
	}
}

挂载脚本,配置音乐音效参数
在这里插入图片描述
在这里插入图片描述

使用

# 调用音乐
AudioManager.Instance.PlayMusic("Theme");

# 调用音效
AudioManager.Instance.PlaySFX("Jump");

# 停止音乐
AudioManager.Instance.musicSource.Stop();

# 停止音效
AudioManager.Instance.sfxSource.Stop();

音乐音效控制

1. 绘制控制音乐音效界面

在这里插入图片描述

2. 修改AudioManager

//切换音乐的静音状态
public void ToggleMusic()
{
	musicSource.mute = !musicSource.mute;
}

//切换音效的静音状态
public void ToggleSFX()
{
	sfxSource.mute = !sfxSource.mute;
}

//设置音乐音量的方法,参数为音量值
public void MusicVolume(float volume)
{
	musicSource.volume = volume;
}

//设置音效音量的方法,参数为音量值
public void SFXVolume(float volume)
{
	sfxSource.volume = volume;
}

3. UI控制脚本

新增一个UIController的类,用于控制用户界面的交互

public class UIController : MonoBehaviour
{
	public Slider _musicSlider, _sfxSlider;
	
	//切换音乐静音状态的方法
	public void ToggleMusic()
	{
	    AudioManager.Instance.ToggleMusic();
	}
	
	//切换音效静音状态的方法
	public void ToggleSFX()
	{
	    AudioManager.Instance.ToggleSFX();
	}
	
	//设置音乐音量的方法
	public void MusicVolume()
	{
	    AudioManager.Instance.MusicVolume(_musicSlider.value);
	}
	
	//设置音效音量的方法
	public void SFXVolume()
	{
	    AudioManager.Instance.SFXVolume(_sfxSlider.value);
	}
}

挂载脚本,配置音量滑动参数
在这里插入图片描述
配置按钮事件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 效果

在这里插入图片描述

完整代码

public class AudioManager : MonoBehaviour
{
	public static AudioManager Instance;
	
	//定义音乐和音效的Sound数组
	public Sound[] musicSounds, sfxSounds;
	//音乐和音效的AudioSource
	public AudioSource musicSource, sfxSource;

	private void Awake() 
	{
	    if (Instance == null) 
	    {
	        Instance = this;
	        //在场景切换时不销毁该对象
	        DontDestroyOnLoad(gameObject);
	    }
	    else 
	    {
	        Destroy(gameObject);
	    }
	}
	
	//播放音乐的方法,参数为音乐名称
	public void PlayMusic(string name) 
	{
	    //从音乐Sounds数组中找到名字匹配的Sound对象
	    Sound s = Array.Find(musicSounds, x => x.name == name);
	    //如果找不到对应的Sound,输出错误信息
	    if (s == null) 
	    {
	        Debug.Log("没有找到音乐");
	    }
	    //否则将音乐源的clip设置为对应Sound的clip并播放
	    else 
	    {
	        musicSource.clip = s.clip;
	        musicSource.Play();
	    }
	}

	//播放音效的方法,参数为音效名称
	public void PlaySFX(string name) 
	{
	    //从音效Sounds数组中找到名字匹配的Sound对象
	    Sound s = Array.Find(sfxSounds, x => x.name == name);
	    //如果找不到对应的Sound,输出错误信息
	    if (s == null) 
	    {
	        Debug.Log("没有找到音效");
	    }
	    //否则播放对应Sound的clip
	    else 
	    {
	        sfxSource.PlayOneShot(s.clip);
	    }
	}
	
	//切换音乐的静音状态
	public void ToggleMusic()
	{
		musicSource.mute = !musicSource.mute;
	}
	
	//切换音效的静音状态
	public void ToggleSFX()
	{
		sfxSource.mute = !sfxSource.mute;
	}
	
	//设置音乐音量的方法,参数为音量值
	public void MusicVolume(float volume)
	{
		musicSource.volume = volume;
	}
	
	//设置音效音量的方法,参数为音量值
	public void SFXVolume(float volume)
	{
		sfxSource.volume = volume;
	}
}

持久化存储设置记录(2024/6/30补充)

using UnityEngine;
using UnityEngine.UI;

public class UIController : MonoBehaviour
{
	public Slider _musicSlider, _sfxSlider;
	public GameObject musicOnIcon, musicOffIcon;
	public GameObject sfxOnIcon, sfxOffIcon;

	private void Start()
	{
		if (PlayerPrefs.HasKey("musicOnIconActiveSelf")) musicOnIcon.SetActive(PlayerPrefs.GetFloat("musicOnIconActiveSelf") == 1f);
		if (PlayerPrefs.HasKey("musicOffIconActiveSelf"))musicOffIcon.SetActive(PlayerPrefs.GetFloat("musicOffIconActiveSelf") == 1f);
		if (PlayerPrefs.HasKey("sfxOnIconActiveSelf"))sfxOnIcon.SetActive(PlayerPrefs.GetFloat("sfxOnIconActiveSelf") == 1f);
		if (PlayerPrefs.HasKey("sfxOffIconActiveSelf") )sfxOffIcon.SetActive(PlayerPrefs.GetFloat("sfxOffIconActiveSelf") == 1f);
		if (PlayerPrefs.HasKey("musicValue")){
			_musicSlider.value = PlayerPrefs.GetFloat("musicValue");
			MusicVolume();
		}
		if (PlayerPrefs.HasKey("sfxValue")){
			_sfxSlider.value = PlayerPrefs.GetFloat("sfxValue");
			SFXVolume();
		}
	}

	//切换音乐静音状态的方法
	public void ToggleMusic()
	{
		AudioManager.Instance.ToggleMusic();
		musicOnIcon.SetActive(!AudioManager.Instance.musicSource.mute);
		musicOffIcon.SetActive(AudioManager.Instance.musicSource.mute);
		PlayerPrefs.SetFloat("musicOnIconActiveSelf", musicOnIcon.activeSelf ? 1 : 0);
		PlayerPrefs.SetFloat("musicOffIconActiveSelf", musicOffIcon.activeSelf ? 1 : 0);
		PlayerPrefs.Save();
	}

	//切换音效静音状态的方法
	public void ToggleSFX()
	{
		AudioManager.Instance.ToggleSFX();
		sfxOnIcon.SetActive(!AudioManager.Instance.sfxSource.mute);
		sfxOffIcon.SetActive(AudioManager.Instance.sfxSource.mute);
		PlayerPrefs.SetFloat("sfxOnIconActiveSelf", sfxOnIcon.activeSelf ? 1 : 0);
		PlayerPrefs.SetFloat("sfxOffIconActiveSelf", sfxOffIcon.activeSelf ? 1 : 0);
		PlayerPrefs.Save();
	}

	//设置音乐音量的方法
	public void MusicVolume()
	{
		PlayerPrefs.SetFloat("musicValue", _musicSlider.value);
		PlayerPrefs.Save();
		AudioManager.Instance.MusicVolume(_musicSlider.value);
	}

	//设置音效音量的方法
	public void SFXVolume()
	{
		PlayerPrefs.SetFloat("sfxValue", _sfxSlider.value);
		PlayerPrefs.Save();
		AudioManager.Instance.SFXVolume(_sfxSlider.value);	
	}
}


完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

在这里插入图片描述

  • 18
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity音频管理器是一个用于在游戏项目中管理音频资源的工具。它的作用是加载、播放、暂停、调节音量等一系列与音频相关的操作。在项目中,我们可以将不同类型的音效资源拖拽到管理器中,然后通过代码调用管理器的接口来对音效进行控制。对于常规的音效操作,管理器已经提供了一些常用的功能,可以满足大部分需求。但对于一些特殊功能,比如在线剪切音频片段、动态调整音乐元素等,可能需要我们自行实现。 Unity中有两个重要的音频组件:AudioListener和AudioSource。通过AudioListener进行监听,通过AudioSource进行音频的播放。因此,使用音频管理器可以统一管理音频的相关操作,提高代码的模块化程度,方便维护和管理音频资源。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【Unity开发小技巧】AudioManager声音管理器](https://blog.csdn.net/qq_37310110/article/details/103311193)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Unity实现音频播放管理器](https://download.csdn.net/download/weixin_38735887/14840003)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [U3D游戏开发框架(四)——音频管理器](https://blog.csdn.net/LLLLL__/article/details/115150281)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向宇it

创作不易,感谢你的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值