哈嘍艾薇巴蒂,你的橙哥突然出現~
本系列博客地址:傳送門
前段時間出的雙人成行,讓我和物件狗腦子差點打出來,
這不趁著物件睡著了,趕緊來分析一波這游戲的聲音系統,
一、看看游戲里的聲音設定
雙人成行的音效設定里面,將所有的聲音分為了兩塊:
- 對話音量
- 音樂音量
并且加上了 “主音量” 選項,總的控制這兩個聲音的大小,

我們在做專案時,經常也會遇到控制音量的需求,
最基礎的做法是查找需要控制的AudioSource,挨個去控制音量,
這樣是做最通俗易懂的,但隨著不同種類的AudioSource越來越多,控制會變得越來越繁瑣,

那下面介紹我們今天的Unity自帶工具:Audio Mixer,
來看看是不是可以方便的控制專案音效,優雅的書寫代碼,
二、《雙人成行》的音效分析
我們看到雙人成行的設定界面,將音效分為:
- 對話音量組
- 音樂音量組
我們再拆分可以分為這幾個基礎部分:
- 對話音效組
- 背景音樂
- UI音效
- 物體互動音效
- 動物音效
那我們能否有強大的工具, 完成如下功能呢:
- 希望通過一個api,控制整個專案的聲音
- 希望分組簡單,且可以通過一個api,設定不同組的聲音
- 希望方便的拓展新的組或者最底層的音效,且之前寫的控制代碼會對新的拓展有效
三、如何用AudioMixer,分級控制專案音效
我們想實作上面的功能,希望上層控制下層,
一層層向下進行控制,
那樹狀圖,向下分級、分層次的控制,是不是很好的一個解決思路?
我們來看一下根據這個思路,最終建好的AudioMixer:

MasterMixer,是所有音效組的父節點,我們可以控制它的音量,來達到控制全域音量的效果,即所有音效,都受到它自身以上所有父節點的控制,類似Unity的transform,
TalkMixer,是對話音效的組,在MasterMixer之下,受到MasterMixer的控制,
MusicMixer,是音樂組,我們看到下方Groups里有很多音效,音效最上方父物體是Master,那就意味著我們既可以單獨控制每個音效的大小,也可以控制Master音量大小,達到控制這個組音量大小的目的,
四、專案實戰教學
下面我們來實際做一下,如何通過這樣的配置,達到控制專案音效的目的,
大家也可以添加文末vx,獲得原始碼工程,
1、匯入音樂資源
匯入我們的音樂資源,
后面我們會通過 Resources 加載播放,

2、配置Audio Mixer
🔶 建立Audio Mixer
我們看到上圖中的MasterMixer、MusicMixer、TalkMixer,是三個AudioMixer,AudioMixer可在Assets中右鍵創建,

1??建立AudioMixer:
Assets中AudioMixer的樣子:

2??調整節點位置
我們在Assets中建好后,MasterMixer作為根節點,我們要將剩下的兩個作為它的子節點,
- 雙擊MasterMixer打開AudioMixer面板
- 拖動下方的兩個AudioMixer到MasterMixer身上去,在彈出的對話框雙擊Master,完成調整,

3??增加Groups下音效
選中MusicMixer,我們將音效添加進去,注意節點位置!

🔶 暴露Audio Mixer引數
建好了Audio Mixer,代碼還不能直接操作,
就像我們的影片狀態機一樣,我們需要先知道里面的MusicMixer叫什么名字,才能通過代碼找到它,對它進行操作,
MusicMixer:
- 每一個音效都是一個MusicMixer,我們的BackgroundMusic、UIMusic、EntityMusic等都是
- 即使是音效組MasterMixer、MusicMixer、TalkMixer,里面也會有一個Master物體,這個物體也是MusicMixer
- 我們最終都是操作這些MusicMixer的屬性,達到控制專案音效的效果
因為我們只想控制主音效、對話音量、音樂音量,
因此我們只設定MasterMixer、MusicMixer、TalkMixer這三個音效組的引數就好了,
以MasterMixer為例:
- 選中MasterMixer,點擊其內部的Master,
- 在檢視面板右擊 Volume,選擇 Expos xxx to scrip

- 選擇Exposed Parameters,將我們剛剛暴露出來的引數,雙擊命名為“MasterMixer”(誰暴露出來的跟誰同名即可,方便我們找)

其他兩個同樣的操作,完成引數暴露,
3、創建聲音播放源AudioSource,并賦值MusicMixer
即在專案中,給這些基礎部分聲音創建AudioSource,
后面就在這些 AudioSource上,播放對應類別的聲音,

Audio Mixer 的使用思路:
- 原先我們播放音頻,都是直接 AudioSource.Play 里面的音樂就可以了,camera上面的 Audiolistener 會監聽專案中的聲音,播放出來,
- 現在,AudioSource 的 output 選項設定了我們的 MusicMixer ,播放聲音后,聲音受AudioMixer影響,最終輸出到 Audiolistener ,
我們控制AudioMixer,即可控制專案不同類別的音量,
1??創建基礎聲音播放源
因為我們將所有聲音分為了對話聲音、背景音樂…這五部分,
因此我們創建5個AudioSource,后面就用這些不同的AudioSource播放對應的音樂,
全部取消PlayOnAwake,取消Loop,背景音樂需勾選Loop
UI效果如下:

2??賦值對應的 MusicMixer
下方Assets里拖拽的,就是我們剛才創建的MusicMixer,
將它們拖到對應的位置去即可,

4、配置播放音樂面板
🔶 創建UI界面
效果如下圖所示:
- 主音量滑動條控制全域音量
- 對話音量控制“對話”的音量
- 音樂音量控制其余音效音量

🔶 撰寫播放音樂的代碼
下面代碼用于賦值給左側按鈕,用于點擊播放音效,
using UnityEngine;
using UnityEngine.UI;
public class AudioPlayCon : MonoBehaviour
{
//賦值我們創建的AudioSource
public AudioSource[] audioSources;
//賦值我們創建的Btn
public Button[] audioBtn;
void Start()
{
audioBtn[0].onClick.AddListener(() =>
{
audioSources[0].clip ??= Resources.Load<AudioClip>("myTalkMusic");
audioSources[0].Play();
});
audioBtn[1].onClick.AddListener(() =>
{
audioSources[1].clip ??= Resources.Load<AudioClip>("myBackgroundMusic");
audioSources[1].Play();
});
audioBtn[2].onClick.AddListener(() =>
{
audioSources[2].clip ??= Resources.Load<AudioClip>("myUIMusic");
audioSources[2].Play();
});
audioBtn[3].onClick.AddListener(() =>
{
audioSources[3].clip ??= Resources.Load<AudioClip>("myEntityMusic");
audioSources[3].Play();
});
audioBtn[4].onClick.AddListener(() =>
{
audioSources[4].clip ??= Resources.Load<AudioClip>("myAnimalMusic");
audioSources[4].Play();
});
}
}
5、滑動條控制音量改變
現在我們運行游戲,點擊左側按鈕,應該可以聽到聲音了,
那么接下來,我們給上面的滑動條配置代碼,做到拖動滑動條,改變音量的效果,
🔶 撰寫滑動條控制的代碼
我們的滑動條,是控制“喇叭”Audio Mixer,輸入要控制的引數和數值,
做到控制音效的效果,
using UnityEngine;
using UnityEngine.Audio;
public class MixerCon : MonoBehaviour
{
public AudioMixer masterMixer;
public AudioMixer musicMixer;
public AudioMixer talkMixer;
//下方函式使用Dynamic float的方式,賦值給我們的slider
// 控制主音量大小
public void SetMasterMixerVolume(float volume)
{
// MasterVolume為我們暴露出來的Master的引數
masterMixer.SetFloat("MasterMixer", volume);
}
// 控制說話音量
public void SetTalkMixerlume(float volume)
{
talkMixer.SetFloat("TalkMixer", volume);
}
// 控制音樂音量
public void SetMusicMixerVolume(float volume)
{
musicMixer.SetFloat("MusicMixer", volume);
}
}
🔶 配置滑動條閾值
因為我們看到MusicMixer的聲音閾值,在-80-20分貝之間,
因此我們給滑動條的MinValue和MaxValue,都設定-80、20

五、代碼思路總結
AudioMixer創建部分:
- 首先,我們將音樂按類別分類成最基礎單元MusicMixer
- 接著,再將基礎單元分組AudioMixer,我們要控制這些組的音量或音效等
- Assets創建這些AudioMixer組,并在組創建對應的基礎單元Group
- 暴露組的引數,供程式呼叫
UI播放部分:
- 給每個基礎單元創建對應的AudioSource,AudioSource的輸出屬性,賦值這些基礎單元,
現在用這些基礎單元輸出,聲音要經過AudioMixer,再由AudioListener輸出了 - 播放代碼還是老樣子,先賦值AudioClip,再GetComponent().Play();
滑動條控制部分:
1、控制的是每個AudioMixer音量大小,即可做到控制專案不同種類音樂大小的目的,
2、子節點AudioMixer受父節點AudioMixer控制,
因為我們的拖拽關系,其余AudioMixer都是MasterMixer的子節點,因此MasterMixer可控制全域音量,
控制代碼:
masterMixer.SetFloat("MasterMixer", volume);
該篇文章作為 《GameFramework》 框架的基礎知識,
想提升自己,學習Unity框架的可以了解一下 《GameFramework》 ~

如果你有 技術的問題 或 專案開發
都可以加我的vx(skode250)
和我聊一聊你的故事🧡
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296959.html
標籤:其他
下一篇:U3D逆向-Mono另類解密
