402 lines
10 KiB
C#
402 lines
10 KiB
C#
|
using UnityEngine;
|
|||
|
using System.Collections;
|
|||
|
using System.Collections.Generic;
|
|||
|
using LuaInterface;
|
|||
|
using GameCore;
|
|||
|
namespace GameLogic
|
|||
|
{
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// <20><>չ<EFBFBD><D5B9>Դ
|
|||
|
/// </summary>
|
|||
|
public class ExtAudioClip {
|
|||
|
/// <summary>
|
|||
|
/// <20><>Ч<EFBFBD><D0A7>
|
|||
|
/// </summary>
|
|||
|
public string name {
|
|||
|
get {
|
|||
|
if (audioClip == null) return string.Empty;
|
|||
|
return audioClip.name;
|
|||
|
}
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// <20><>Ч<EFBFBD><D0A7>Դ
|
|||
|
/// </summary>
|
|||
|
public AudioClip audioClip;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// <20><>ʼ<EFBFBD><CABC>
|
|||
|
/// </summary>
|
|||
|
/// <param name="audioClip"></param>
|
|||
|
public void Init(AudioClip audioClip) {
|
|||
|
this.audioClip = audioClip;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// ж<><D0B6>
|
|||
|
/// </summary>
|
|||
|
public void UnLoad() {
|
|||
|
if (audioClip == null) return;
|
|||
|
App.ResMgr.UnLoadAsset(audioClip.name);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// <20><>չ<EFBFBD><D5B9><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
/// </summary>
|
|||
|
public class ExtAudioSource : MonoBehaviour
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// <20><><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD>Դ
|
|||
|
/// </summary>
|
|||
|
AudioSource audioSource;
|
|||
|
|
|||
|
public ExtAudioClip clip{get;set;}
|
|||
|
|
|||
|
public bool isPlaying {
|
|||
|
get {
|
|||
|
return audioSource.isPlaying;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public float volume {
|
|||
|
get
|
|||
|
{
|
|||
|
return audioSource.volume;
|
|||
|
}
|
|||
|
set {
|
|||
|
audioSource.volume = value;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public bool loop {
|
|||
|
get
|
|||
|
{
|
|||
|
return audioSource.loop;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
audioSource.loop = value;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void Awake()
|
|||
|
{
|
|||
|
audioSource = this.gameObject.AddComponent<AudioSource>();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public void Play() {
|
|||
|
audioSource.Play();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// <20><><EFBFBD><EFBFBD>
|
|||
|
/// </summary>
|
|||
|
/// <param name="game"></param>
|
|||
|
/// <param name="audioClip"></param>
|
|||
|
public void Play(ExtAudioClip clip)
|
|||
|
{
|
|||
|
this.clip = clip;
|
|||
|
audioSource.clip = clip.audioClip;
|
|||
|
audioSource.Play();
|
|||
|
}
|
|||
|
|
|||
|
public void PlayOneShot(ExtAudioClip clip) {
|
|||
|
this.clip = clip;
|
|||
|
audioSource.clip = clip.audioClip;
|
|||
|
audioSource.PlayOneShot(clip.audioClip);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
|
|||
|
/// </summary>
|
|||
|
public void Stop()
|
|||
|
{
|
|||
|
audioSource.Stop();
|
|||
|
}
|
|||
|
}
|
|||
|
public class SoundManager : UnitySingleton<SoundManager>
|
|||
|
{
|
|||
|
GameCore.ObjectPool<ExtAudioClip> audioClipPool = new GameCore.ObjectPool<ExtAudioClip>(null, (toRealease) =>
|
|||
|
{
|
|||
|
toRealease.UnLoad();
|
|||
|
});
|
|||
|
/// <summary>
|
|||
|
/// <20><><EFBFBD>ֿ<EFBFBD><D6BF><EFBFBD>
|
|||
|
/// </summary>
|
|||
|
const string IsPlayMusicKey = "IsPlayMusicKey";
|
|||
|
/// <summary>
|
|||
|
/// <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
|
|||
|
/// </summary>
|
|||
|
const string IsPlayAudioKey = "IsPlayAudioKey";
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
/// </summary>
|
|||
|
const string MusicVolumeKey = "MusicVolumeKey";
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
|
|||
|
/// </summary>
|
|||
|
const string AudioVolumeKey = "AudioVolumeKey";
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// ͬʱ<CDAC><CAB1><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
|
|||
|
/// </summary>
|
|||
|
private int aduioCount = 5;
|
|||
|
/// <summary>
|
|||
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
/// </summary>
|
|||
|
private float musicVolume = 1f;
|
|||
|
/// <summary>
|
|||
|
/// <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
|
|||
|
/// </summary>
|
|||
|
private float aduioVolume = 1f;
|
|||
|
/// <summary>
|
|||
|
/// <20>Ƿ<EFBFBD><C7B7>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
/// </summary>
|
|||
|
private bool isPlayMusic = true;
|
|||
|
/// <summary>
|
|||
|
/// <20>Ƿ<EFBFBD><C7B7>ر<EFBFBD><D8B1><EFBFBD>Ч
|
|||
|
/// </summary>
|
|||
|
private bool isPlayAudio = true;
|
|||
|
/// <summary>
|
|||
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
/// </summary>
|
|||
|
ExtAudioSource audioSource;
|
|||
|
/// <summary>
|
|||
|
/// <20><>Ч<EFBFBD><D0A7>
|
|||
|
/// </summary>
|
|||
|
ExtAudioSource[] audioSources;
|
|||
|
/// <summary>
|
|||
|
/// <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
/// </summary>
|
|||
|
ExtAudioClip nextBGM;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// <20><>ʼ<EFBFBD><CABC>
|
|||
|
/// </summary>
|
|||
|
private void Awake()
|
|||
|
{
|
|||
|
Init();
|
|||
|
gameObject.AddComponent<AudioListener>();
|
|||
|
audioSources = new ExtAudioSource[aduioCount];
|
|||
|
for (int i = 0; i < aduioCount; i++)
|
|||
|
{
|
|||
|
audioSources[i] = gameObject.AddComponent<ExtAudioSource>();
|
|||
|
}
|
|||
|
audioSource = gameObject.AddComponent<ExtAudioSource>();
|
|||
|
audioSource.volume = 0f;
|
|||
|
audioSource.loop = true;
|
|||
|
nextBGM = null;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// <20><>ʼ<EFBFBD><CABC>
|
|||
|
/// </summary>
|
|||
|
private void Init()
|
|||
|
{
|
|||
|
isPlayMusic = PlayerPrefs.GetInt(IsPlayMusicKey, 1) == 1;
|
|||
|
isPlayAudio = PlayerPrefs.GetInt(IsPlayAudioKey, 1) == 1;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
private void Update()
|
|||
|
{
|
|||
|
if (nextBGM != null && isPlayMusic)
|
|||
|
{
|
|||
|
if (audioSource.clip == null || audioSource.volume <= 0)
|
|||
|
{
|
|||
|
if (audioSource.clip != null)
|
|||
|
{
|
|||
|
audioClipPool.Release(audioSource.clip);
|
|||
|
}
|
|||
|
audioSource.Play(nextBGM);
|
|||
|
nextBGM = null;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
audioSource.volume -= 0.02f;
|
|||
|
}
|
|||
|
}
|
|||
|
else if (audioSource.clip != null && audioSource.volume < musicVolume && isPlayMusic)
|
|||
|
{
|
|||
|
if (!audioSource.isPlaying) audioSource.Play();
|
|||
|
float volume = musicVolume - audioSource.volume;
|
|||
|
audioSource.volume += volume > 0.02f ? 0.02f : volume;
|
|||
|
}
|
|||
|
else if (!isPlayMusic && audioSource.volume > 0)
|
|||
|
{
|
|||
|
audioSource.volume -= 0.02f;
|
|||
|
if (audioSource.volume <= 0) audioSource.Stop();
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// <20><><EFBFBD>ű<EFBFBD><C5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
/// </summary>
|
|||
|
public void PlayMusic(string name)
|
|||
|
{
|
|||
|
try {
|
|||
|
if (string.IsNullOrEmpty(name))
|
|||
|
return;
|
|||
|
if (audioSource.clip != null && name == audioSource.clip.name)
|
|||
|
return;
|
|||
|
App.ResMgr.LoadAssetAsync<AudioClip>(name, (tmpName, clip) =>
|
|||
|
{
|
|||
|
if (clip == null || (nextBGM!=null && clip == nextBGM.audioClip))
|
|||
|
{
|
|||
|
App.ResMgr.UnLoadAsset(name);
|
|||
|
return;
|
|||
|
}
|
|||
|
nextBGM = GetClip(clip);
|
|||
|
});
|
|||
|
}
|
|||
|
catch(System.Exception e){
|
|||
|
Debug.LogErrorFormat("PlayMusic error:{0}",e.ToString());
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
|
|||
|
/// </summary>
|
|||
|
/// <param name="name">Name.</param>
|
|||
|
public void PlayAudio(string name)
|
|||
|
{
|
|||
|
if (string.IsNullOrEmpty(name))
|
|||
|
return;
|
|||
|
if (!isPlayAudio) return;
|
|||
|
App.ResMgr.LoadAssetAsync<AudioClip>(name,(tmpName,clip) =>
|
|||
|
{
|
|||
|
if (clip == null)
|
|||
|
{
|
|||
|
App.ResMgr.UnLoadAsset(name);
|
|||
|
return;
|
|||
|
}
|
|||
|
ExtAudioSource source = GetAudioSoure();
|
|||
|
if (source.isPlaying) source.Stop();
|
|||
|
source.volume = AduioVolume;
|
|||
|
source.PlayOneShot(GetClip(clip));
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// <20><>ȡһ<C8A1><D2BB>audioClip
|
|||
|
/// </summary>
|
|||
|
/// <param name="audioClip"></param>
|
|||
|
/// <returns></returns>
|
|||
|
private ExtAudioClip GetClip(AudioClip audioClip) {
|
|||
|
ExtAudioClip extAudioClip = audioClipPool.Get();
|
|||
|
extAudioClip.Init(audioClip);
|
|||
|
return extAudioClip;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>audioClip
|
|||
|
/// </summary>
|
|||
|
/// <param name="extAudioClip"></param>
|
|||
|
private void ReleaseClip(ExtAudioClip extAudioClip) {
|
|||
|
if (extAudioClip == null) return;
|
|||
|
audioClipPool.Release(extAudioClip);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
/// </summary>
|
|||
|
/// <returns>The audio soure.</returns>
|
|||
|
private ExtAudioSource GetAudioSoure()
|
|||
|
{
|
|||
|
ExtAudioSource source = null;
|
|||
|
for (int i = 0; i < audioSources.Length; i++)
|
|||
|
{
|
|||
|
if (!audioSources[i].isPlaying)
|
|||
|
source = audioSources[i];
|
|||
|
}
|
|||
|
source = source == null ? audioSources[0] : source;
|
|||
|
ReleaseClip(source.clip);
|
|||
|
return source;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
|
|||
|
/// </summary>
|
|||
|
public void StopAllAudio()
|
|||
|
{
|
|||
|
if (audioSources != null)
|
|||
|
{
|
|||
|
for (int i = 0; i < audioSources.Length; i++)
|
|||
|
{
|
|||
|
if (audioSources[i] != null)
|
|||
|
{
|
|||
|
audioSources[i].Stop();
|
|||
|
ReleaseClip(audioSources[i].clip);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public float MusicVolume
|
|||
|
{
|
|||
|
get {
|
|||
|
return musicVolume;
|
|||
|
}
|
|||
|
set {
|
|||
|
musicVolume = Mathf.Clamp01(value);
|
|||
|
PlayerPrefs.SetFloat(MusicVolumeKey, musicVolume);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public float AduioVolume
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return aduioVolume;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
aduioVolume = Mathf.Clamp01(value);
|
|||
|
PlayerPrefs.SetFloat(AudioVolumeKey, aduioVolume);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// <20>Ƿ<C7B7><F1B2A5B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
/// </summary>
|
|||
|
public bool IsPlayMusic
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return isPlayMusic;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
isPlayMusic = value;
|
|||
|
PlayerPrefs.SetInt(IsPlayMusicKey, isPlayMusic ? 1 : 0);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// <20>Ƿ<C7B7><F1B2A5B7><EFBFBD>Ч
|
|||
|
/// </summary>
|
|||
|
public bool IsPlayAudio
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return isPlayAudio;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
isPlayAudio = value;
|
|||
|
PlayerPrefs.SetInt(IsPlayAudioKey, isPlayAudio ? 1 : 0);
|
|||
|
if (!isPlayAudio)
|
|||
|
StopAllAudio();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|