游戏声音系统组成
音频片段(Audio Clip):
当选中导入的声音之后,你便可以在右侧属性面板中看到关于这个文件的一些属性。
声音源(Audio Source):
发出这个声音的声音源。
- 当把声音挂在一个游戏物体身上,这个游戏物体就拥有了Audio Source组件。
声音模式(空间混合):
- 2d模式:在场景中,无论在什么位置,声音的大小都不会发生变化。
- 3d模式:在场景中,音源发出的声音会如同现实生活中一样,当你距离音源的距离不同的时候,声音会发生变化,如:距离远了,声音听起来就变小了。
音频衰减:
你也可以设置音乐衰减的方式,和自定义衰减曲线。
声音监听器(Audio Listener):
声音的监听者。在游戏中是摄像机用来放我们的监听器。
一般位于我们的Main Camera 上面,用来监听游戏场景中所有的音乐和音效。一个场景中只能拥有一个。
音频混音器(Audio Mixer):
作用:
1.用来给声音添加效果,如:高频,低频等。
2.用来管理项目中的音乐和音效。
如何创建
在项目面板右键->创建->音频混合器。
双击音频混合器即可进行管理。
主要分为左右两个部分:
左侧栏目:是对项目中的音频进行管理。
- 快照:用来保存音频的参数,可以设置很多个快照用来保存不同的参数。
- 组:就是可以设置不同的层级关系,用来进行管理。
右侧栏目:是对音轨进行管理。可以添加一些音效,如:混响。
- 其中S是单独播放这一个轨道。M是静音。B是消除当前轨道上面的所有效果。
注意:
- 在游戏模式下进行更改,其更改也会保留。
混音器与Audio Source进行连接:
在下图位置进行设置链接:
支持的声音文件格式
主流的声音文件格式Unity都支持,如常见的mp3.
导入声音文件
可以直接拖入文件到你用来放置声音文件的收藏夹。
声音系统代码
声音数据结构
在项目中创建一个AudioType的C#脚本文件,用来存放与声音有关的组件和方便调节声音。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
[System.Serializable] //序列化 让数据类型可以展示在检测视图上面
public class AudioType
{
public AudioSource Source; //声音源
public AudioClip Clip; //声音片段
public AudioMixerGroup Group; //声音混音器
public string Name; //音乐名
[Range(0f,1f)] //使得音量大小是以条的形式进行调节
public float Volume; //音量大小
[Range(0.1f,5f)] //同理 条进行调节
public float Pitch; //音高
public bool Loop; //是否循环播放
}
这代代码的作用便是,当游戏中创建一个空物体,然后在这个物体身上挂在AudioManager脚本,这个脚本会创建AudioType的对象,这时候,在右侧面板中便可以控制声音源,声音大小,等等参数。
声音管理
创建一个AudioManager的C#脚本,并将其设置为一个单例。
设置为单例的目的:希望AudioManager是一个公开的,类似于静态的对象,为了方便在其他地方非常方便的调用AudioManager,然后使用里面的一些方法,例如:Play(),比如Stop()来暂停我们的音乐。
使用AudioManager.cs来管理声音组件,定义一些函数方便外部使用。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AudioManager : MonoBehaviour
{
/// <summary>
/// 获得AudioManager的实例
/// </summary>
public static AudioManager instance;
public AudioType [] AudioTypes;
private void Awake(){
if(instance==null)
{
instance=this;
}else{
Destroy(gameObject); //如果为空则删除这个物体
return;
}
DontDestroyOnLoad(instance); //在场景切换的时候不会将物体进行摧毁
}
private void Start(){
foreach(AudioType type in AudioTypes){
type.Source = gameObject.AddComponent<AudioSource>();
type.Source.clip = type.Clip;
type.Source.name = type.Name;
type.Source.volume = type.Volume;
type.Source.pitch = type.Pitch;
type.Source.loop = type.Loop;
if (type.Group != null)
{
type.Source.outputAudioMixerGroup = type.Group;
}
}
}
//播放音乐函数
public void Play(string name)
{
//如果找到这个音乐则开始播放
foreach(AudioType type in AudioTypes)
{
if(type.Name == name)
{
type.Source.Play();
return;
}
}
Debug.LogWarning("没有找到" + name + "音频!");
}
//暂停音乐播放
public void Pause(string name)
{
foreach(AudioType type in AudioTypes)
{
if(type.Name == name)
{
type.Source.Pause();
return;
}
}
Debug.LogWarning("没有找到" + name + "音频!");
}
}
在外部调用AudioManager的Play()播放函数:
AudioManager.instance.Play();