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>
|
||
/// 윈嵐稜都
|
||
/// </summary>
|
||
public class ExtAudioClip {
|
||
/// <summary>
|
||
/// 稜槻츰
|
||
/// </summary>
|
||
public string name {
|
||
get {
|
||
if (audioClip == null) return string.Empty;
|
||
return audioClip.name;
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 稜槻栗都
|
||
/// </summary>
|
||
public AudioClip audioClip;
|
||
|
||
/// <summary>
|
||
/// 놓迦뺏
|
||
/// </summary>
|
||
/// <param name="audioClip"></param>
|
||
public void Init(AudioClip audioClip) {
|
||
this.audioClip = audioClip;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 菌潼
|
||
/// </summary>
|
||
public void UnLoad() {
|
||
if (audioClip == null) return;
|
||
App.ResMgr.UnLoadAsset(audioClip.name);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 윈嵐稜있꺄렴포
|
||
/// </summary>
|
||
public class ExtAudioSource : MonoBehaviour
|
||
{
|
||
/// <summary>
|
||
/// 稜있꺄렴都
|
||
/// </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>
|
||
/// 꺄렴
|
||
/// </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>
|
||
/// 界岺꺄렴
|
||
/// </summary>
|
||
public void Stop()
|
||
{
|
||
audioSource.Stop();
|
||
}
|
||
}
|
||
public class SoundManager : UnitySingleton<SoundManager>
|
||
{
|
||
GameCore.ObjectPool<ExtAudioClip> audioClipPool = new GameCore.ObjectPool<ExtAudioClip>(null, (toRealease) =>
|
||
{
|
||
toRealease.UnLoad();
|
||
});
|
||
/// <summary>
|
||
/// 稜있역밑
|
||
/// </summary>
|
||
const string IsPlayMusicKey = "IsPlayMusicKey";
|
||
/// <summary>
|
||
/// 稜槻역밑
|
||
/// </summary>
|
||
const string IsPlayAudioKey = "IsPlayAudioKey";
|
||
|
||
/// <summary>
|
||
/// 稜있稜좆
|
||
/// </summary>
|
||
const string MusicVolumeKey = "MusicVolumeKey";
|
||
|
||
/// <summary>
|
||
/// 稜槻稜좆
|
||
/// </summary>
|
||
const string AudioVolumeKey = "AudioVolumeKey";
|
||
|
||
/// <summary>
|
||
/// 谿珂꺄렴돨稜槻鑒좆
|
||
/// </summary>
|
||
private int aduioCount = 5;
|
||
/// <summary>
|
||
/// 교쒼稜좆
|
||
/// </summary>
|
||
private float musicVolume = 1f;
|
||
/// <summary>
|
||
/// 稜槻稜좆
|
||
/// </summary>
|
||
private float aduioVolume = 1f;
|
||
/// <summary>
|
||
/// 角뤠밑균<EBB091>稜
|
||
/// </summary>
|
||
private bool isPlayMusic = true;
|
||
/// <summary>
|
||
/// 角뤠밑균稜槻
|
||
/// </summary>
|
||
private bool isPlayAudio = true;
|
||
/// <summary>
|
||
/// 교쒼稜
|
||
/// </summary>
|
||
ExtAudioSource audioSource;
|
||
/// <summary>
|
||
/// 稜槻稜
|
||
/// </summary>
|
||
ExtAudioSource[] audioSources;
|
||
/// <summary>
|
||
/// 苟寧몸교쒼稜
|
||
/// </summary>
|
||
ExtAudioClip nextBGM;
|
||
|
||
/// <summary>
|
||
/// 놓迦뺏
|
||
/// </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>
|
||
/// 놓迦뺏
|
||
/// </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>
|
||
/// 꺄렴교쒼稜있
|
||
/// </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>
|
||
/// 꺄렴稜槻
|
||
/// </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>
|
||
/// 삿혤寧몸audioClip
|
||
/// </summary>
|
||
/// <param name="audioClip"></param>
|
||
/// <returns></returns>
|
||
private ExtAudioClip GetClip(AudioClip audioClip) {
|
||
ExtAudioClip extAudioClip = audioClipPool.Get();
|
||
extAudioClip.Init(audioClip);
|
||
return extAudioClip;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 쀼澗寧몸audioClip
|
||
/// </summary>
|
||
/// <param name="extAudioClip"></param>
|
||
private void ReleaseClip(ExtAudioClip extAudioClip) {
|
||
if (extAudioClip == null) return;
|
||
audioClipPool.Release(extAudioClip);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 삿혤離빈寧몸稜槻꺄렴포
|
||
/// </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>
|
||
/// 界岺杰唐稜槻
|
||
/// </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>
|
||
/// 角뤠꺄렴稜있
|
||
/// </summary>
|
||
public bool IsPlayMusic
|
||
{
|
||
get
|
||
{
|
||
return isPlayMusic;
|
||
}
|
||
set
|
||
{
|
||
isPlayMusic = value;
|
||
PlayerPrefs.SetInt(IsPlayMusicKey, isPlayMusic ? 1 : 0);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 角뤠꺄렴稜槻
|
||
/// </summary>
|
||
public bool IsPlayAudio
|
||
{
|
||
get
|
||
{
|
||
return isPlayAudio;
|
||
}
|
||
set
|
||
{
|
||
isPlayAudio = value;
|
||
PlayerPrefs.SetInt(IsPlayAudioKey, isPlayAudio ? 1 : 0);
|
||
if (!isPlayAudio)
|
||
StopAllAudio();
|
||
}
|
||
}
|
||
}
|
||
} |