使用工具: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();
normalAudioSource = audioSourceGo.AddComponent();
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(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();
normalAudioSource = audioSourceGo.AddComponent();
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(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().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(); });
}