使用工具:VS,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(); });}