1. 程式人生 > >unity網路實戰開發(叢林戰爭)-正式開發階段(018-聲音管理器模組的完善)

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(); });
    }