unity網路實戰開發(叢林戰爭)-正式開發階段(018-聲音管理器模組的完善)
使用工具:VS2017,unity3d
使用語言:c#
作者:Gemini_xujian
參考:siki老師-《叢林戰爭》視訊教程
上一篇文章中,已經完成了註冊事件的處理,接下來將完善聲音管理器模組。
01-開發聲音管理器
為了使遊戲執行起來更加富有活力,接下來,我將為遊戲新增音效部分,音效部分由AudioManager進行管理。
首先,將工程中的音效相關的檔案放到ReSources目錄下,目的是方便我們後面通過方法載入相關的音效;之後,開啟AudioManager指令碼,定義音效檔案的父級目錄名字,將所有的音效進行宣告。
public const string path_Prefix = "Sounds/"; public const string sound_ArrawShoot = "ArrawShoot"; public const string sound_Bg_fast = "Bg(fast)"; public const string sound_Bg_moderate = "Bg(moderate)"; public const string sound_ButtonClick = "ButtonClick"; public const string sound_Miss = "Miss"; public const string sound_ShootPerson = "ShootPerson"; public const string sound_Timer = "Timer";
完成上述操作後,重寫Init方法進行初始化相關操作:在方法中,首先建立一個空物體作為音訊源管理元件,之後宣告兩個AudioSource型別的元件,一個是背景音訊源,一個是普通音訊源,在Init方法中進行賦值,最後需要在方法中呼叫背景音訊源迴圈播放背景聲音,所以在這裡,我新建立了一個方法用於聲音播放的處理。
private AudioSource bgAudioSource; private AudioSource normalAudioSource; public override void OnInit() { GameObject audioSourceGo = new GameObject("AudioManager"); bgAudioSource = audioSourceGo.AddComponent<AudioSource>(); normalAudioSource = audioSourceGo.AddComponent<AudioSource>(); PlaySound(bgAudioSource, LoadSound(sound_Bg_moderate),0.5f, true); } public void PlaySound(AudioSource audioSource,AudioClip clip,float volume=1,bool loop=false) { audioSource.clip = clip; audioSource.volume = volume; audioSource.loop = loop; audioSource.Play(); } private AudioClip LoadSound(string soundName) { return Resources.Load<AudioClip>(path_Prefix + soundName); }
聲音播放處理方法中主要完成的是得到相應的音訊源,設定音訊源播放的音訊片段、聲音大小、迴圈模式、播放功能,設定這幾個選項即可完成背景聲音的播放,在Init方法中進行呼叫的時候,新定義了一個方法通過音訊名來得到相應的音訊片段,這就是剛開始將音訊檔案放到資原始檔夾特定目錄的原因。
最後,執行unity,音訊正常播放,完整程式碼如下:
AudioManager.cs:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class AudioManager : BaseManager { public AudioManager(GameFacade facade) : base(facade) { } public const string path_Prefix = "Sounds/"; public const string sound_ArrawShoot = "ArrawShoot"; public const string sound_Bg_fast = "Bg(fast)"; public const string sound_Bg_moderate = "Bg(moderate)"; public const string sound_ButtonClick = "ButtonClick"; public const string sound_Miss = "Miss"; public const string sound_ShootPerson = "ShootPerson"; public const string sound_Timer = "Timer"; private AudioSource bgAudioSource; private AudioSource normalAudioSource; public override void OnInit() { GameObject audioSourceGo = new GameObject("AudioManager"); bgAudioSource = audioSourceGo.AddComponent<AudioSource>(); normalAudioSource = audioSourceGo.AddComponent<AudioSource>(); PlaySound(bgAudioSource, LoadSound(sound_Bg_moderate),0.5f, true); } public void PlaySound(AudioSource audioSource,AudioClip clip,float volume=1,bool loop=false) { audioSource.clip = clip; audioSource.volume = volume; audioSource.loop = loop; audioSource.Play(); } private AudioClip LoadSound(string soundName) { return Resources.Load<AudioClip>(path_Prefix + soundName); } }
02-控制按鈕的點選聲音的播放
上次完成了對背景聲音的播放,接下來,對按鈕的點選聲音進行處理。
首先,AudioManager中新建兩個方法,一個是播放背景聲音方法,一個是播放普通聲音方法,兩個方法都呼叫了PlaySound方法,因為點選按鈕時發出的聲音不需要迴圈播放,所以在設定引數的時候設定loop為false。
public void PlayBgSound(string soundName)
{
PlaySound(bgAudioSource, LoadSound(soundName), 0.5f, true);
}
public void PlayNormalSound(string soundName)
{
PlaySound(normalAudioSource, LoadSound(soundName));
}
之後,在GameFacade指令碼中,建立兩個方法分別呼叫以上兩個方法,方便其他物件使用。
public void PlayBgSound(string soundName)
{
audioMng.PlayBgSound(soundName);
}
public void PlayNormalSound(string soundName)
{
audioMng.PlayNormalSound(soundName);
}
接下來,在BasePanel中定義一個按鈕點選聲音播放的方法,此方法呼叫中介類GameFacade中的PlayNormalSound方法用於按鈕點選聲音的播放,但在呼叫時會發現沒有宣告Gamefacade物件,所以這時可以仿照BasePanel類中已有的UIManager物件的獲取方式獲取GameFacade物件,獲取到之後即可呼叫。
UIManager.cs->GetPanel():
instPanel.GetComponent<BasePanel>().Facade = facade;
BasePanel.cs:
protected UIManager uiMng;
protected GameFacade facade;
public UIManager UIMng
{
set
{
uiMng = value;
}
}
public GameFacade Facade
{
set
{
facade = value;
}
}
protected void PlayClickSound()
{
facade.PlayNormalSound(AudioManager.sound_ButtonClick);
}
最後,分別在StartPanel、LoginPanel、RegisterPanel的按鈕點選事件中進行呼叫即可。
LoginPanel.OnCloseClick():
public void OnCloseClick()
{
PlayClickSound();
transform.DOScale(0, 0.4f);
transform.DOLocalMove(new Vector3(800,0,0), 0.4f).OnComplete(()=> { uiMng.PopPanel(); });
}