通用音频系统
为 Unity 项目提供了一套简单但全面清晰的音频解决方案,将音频播放划分为背景音乐(BGM)、环境音(Ambient)和音效(SFX)三个独立的部分进行管理与配置
com.dreemurrstudio.audiosystem 
Install via UPM
Add to Unity Package Manager using this URL
https://www.pkglnk.dev/audiosystem.git README Markdown
Copy this to your project's README.md
## Installation
Add **通用音频系统** to your Unity project via Package Manager:
1. Open **Window > Package Manager**
2. Click **+** > **Add package from git URL**
3. Enter:
```
https://www.pkglnk.dev/audiosystem.git
```
[](https://www.pkglnk.dev/pkg/audiosystem)Dependencies (1)
README
Unity 音频系统模块 (Audio System Module)
概述
本模块为 Unity 项目提供了一套功能全面、结构清晰的音频解决方案,它将音频播放划分为背景音乐(BGM)、环境音(Ambient)和音效(SFX)三个独立的部分进行管理
通过使用 ScriptableObject 进行音频注册和 AudioMixer 进行音量控制,该系统旨在提供一个易于扩展、配置和使用的音频框架
推荐在导入时将包内的
unitypackage文件导入到您的 Unity 项目中,以便根据项目需求进行自定义修改和管理
核心功能
- 模块化管理:
BGMManager: 专用于背景音乐,支持循环、续播、淡入淡出和播放间隔AmbientManager: 专用于环境音,支持循环播放SFXManager: 专用于音效,使用对象池管理音源,支持 2D(全局)和 3D(世界)音效AudioManager: 作为总控制器,通过AudioMixer统一管理各类音频的音量
- 基于 ScriptableObject 的注册表: 所有音频(BGM, Ambient, SFX)都需要在对应的注册表 SO 文件中进行配置,便于美术和策划进行管理,无需修改代码
- 高级音效控制:
- 随机播放: 支持为一个音效配置多个随机的音频片段,增加多样性
- 重复策略: 可配置音效在短时间内重复触发时的播放策略(如忽略、重播等)
- 对象池:
SFXManager内置对象池,高效复用AudioSource实例,减少运行时动态创建和销毁的开销 - 动画事件支持: 提供了
AnimationEvent_Audio脚本,可以方便地在动画剪辑中通过事件触发音效 - 音频保活: 内置
keepAliveSource机制,通过播放静音来确保 Unity 音频系统始终处于激活状态,防止在无声后首次播放音频失败
依赖项
- DreemurrStudio.Utilities: 本模块中的所有管理器(
AudioManager,BGMManager等)都继承自Singleton<T>泛型基类,该基类由DreemurrStudio.Utilities包提供。请确保您的项目中已导入该依赖包
快速开始
1. 场景设置
- 创建管理器: 从包的Prefabs目录下,将
AudioManager预制体拖拽到场景中实例化 - 配置 BGM/Ambient Manager:
- 创建或修改默认的
BGMInfoRegistrySO、AmbientRegistrySO资产文件,并对应地在其中注册所有要使用的音频文件 - 参照Manager组件中属性的提示信息进行额外配置
- 创建或修改默认的
- 配置 SFXManager:
- 创建或修改默认的
AudioSource预制体,一个用于 UI音效,一个用于世界音效 - 创建或修改默认的
SoundEffectRegistrySO资产文件,注册所有要使用的音效
- 创建或修改默认的
2. 播放背景音乐和环境音
using DreemurrStudio.AudioSystem;
using UnityEngine;
public class SceneController : MonoBehaviour
{
void Start()
{
// 播放名为 "MainTheme" 的背景音乐,并带1.5秒的淡入效果
BGMManager.Instance.Play("MainTheme", 1.5f);
// 播放名为 "Forest" 的环境音
AmbientManager.Instance.Play("Forest");
}
public void EnterBossRoom()
{
// 切换到 Boss 战音乐
BGMManager.Instance.Play("BossBattle");
}
}
3. 播放音效
using DreemurrStudio.AudioSystem;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
// 在角色行走时播放脚步声
public void PlayFootstepSound()
{
// "Footstep" 是在 SoundEffectRegistrySO 中注册的名字
// 该音效会以世界坐标形式在玩家对象的位置播放
SFXManager.Instance.PlayWorldSFX("Footstep", this.gameObject);
}
// 在打开UI时播放一个全局音效
public void PlayUIClickSound()
{
// "UIClick" 是一个2D UI音效,不受位置影响
SFXManager.Instance.PlayOverlaySFX("UIClick");
}
}
4. 控制音量
using DreemurrStudio.AudioSystem;
using UnityEngine.UI;
public class SettingsMenu : MonoBehaviour
{
public Slider sfxSlider;
void Start()
{
// 初始化Slider的值
sfxSlider.value = AudioManager.Instance.SFXVolume;
// 监听Slider值的变化
sfxSlider.onValueChanged.AddListener(SetSFXVolume);
}
public void SetSFXVolume(float volume)
{
// volume 的范围是 0.0 到 1.0
AudioManager.Instance.SFXVolume = volume;
}
}
No comments yet. Be the first!