音效问题修复并增加音效对象池缓存
This commit is contained in:
parent
19c56ecf8f
commit
b4a4ab0a0b
@ -7,6 +7,7 @@
|
||||
|
||||
|
||||
using System.Collections.Generic;
|
||||
using Logic.CrashSight;
|
||||
using RuntimeData;
|
||||
using UnityEngine;
|
||||
|
||||
@ -19,7 +20,7 @@ namespace Logic.Audio
|
||||
|
||||
private AudioPlayer _musicPlayer;
|
||||
private List<AudioPlayer> _allPlayer;
|
||||
private Dictionary<string, AudioClip> _clips;
|
||||
private Dictionary<string, List<AudioClip>> _clips;
|
||||
private GameObject AudioRoot;
|
||||
|
||||
public float MusicVolume
|
||||
@ -42,45 +43,74 @@ namespace Logic.Audio
|
||||
public void Init()
|
||||
{
|
||||
_allPlayer = new List<AudioPlayer>();
|
||||
_clips = new Dictionary<string, AudioClip>();
|
||||
_clips["Main"] = Resources.Load<AudioClip>("Audio/Main");
|
||||
_clips["RemiliaEgyptian"] = Resources.Load<AudioClip>("Audio/RemiliaEgyptian");
|
||||
_clips["SatoriIndian"] = Resources.Load<AudioClip>("Audio/SatoriIndian");
|
||||
_clips["KanakoGermany"] = Resources.Load<AudioClip>("Audio/KanakoGermany");
|
||||
_clips["KaguyaFrench"] = Resources.Load<AudioClip>("Audio/KaguyaFrench");
|
||||
_clips["SFX/UI_buttonHover"] = Resources.Load<AudioClip>("Audio/SFX/UI_buttonHover");
|
||||
_clips["SFX/UI_buttonClick"] = Resources.Load<AudioClip>("Audio/SFX/UI_buttonClick");
|
||||
_clips["SFX/UNIT_click"] = Resources.Load<AudioClip>("Audio/SFX/UNIT_click");
|
||||
_clips["SFX/UNIT_bomb"] = Resources.Load<AudioClip>("Audio/SFX/UNIT_bomb");
|
||||
_clips["SFX/UNIT_archer"] = Resources.Load<AudioClip>("Audio/SFX/UNIT_archer");
|
||||
_clips["SFX/UNIT_hurt"] = Resources.Load<AudioClip>("Audio/SFX/UNIT_hurt");
|
||||
_clips["SFX/UNIT_move"] = Resources.Load<AudioClip>("Audio/SFX/UNIT_move");
|
||||
_clips["SFX/UNIT_attack"] = Resources.Load<AudioClip>("Audio/SFX/UNIT_attack");
|
||||
|
||||
_clips["SFX/ENV_sea"] = Resources.Load<AudioClip>("Audio/SFX/ENV_sea");
|
||||
_clips["SFX/ENV_forest"] = Resources.Load<AudioClip>("Audio/SFX/ENV_forest");
|
||||
|
||||
|
||||
_clips = new Dictionary<string, List<AudioClip>>();
|
||||
var path = new Dictionary<string, string>();
|
||||
path["Main"] = "Audio/Main";
|
||||
path["RemiliaEgyptian"] = "Audio/RemiliaEgyptian";
|
||||
path["SatoriIndian"] = "Audio/SatoriIndian";
|
||||
path["KanakoGermany"] = "Audio/KanakoGermany";
|
||||
path["KaguyaFrench"] = "Audio/KaguyaFrench";
|
||||
path["SFX/UI_buttonHover"] = "Audio/SFX/UI_buttonHover";
|
||||
path["SFX/UI_buttonClick"] = "Audio/SFX/UI_buttonClick";
|
||||
path["SFX/UNIT_click"] = "Audio/SFX/UNIT_click";
|
||||
path["SFX/UNIT_bomb"] = "Audio/SFX/UNIT_bomb";
|
||||
path["SFX/UNIT_archer"] = "Audio/SFX/UNIT_archer";
|
||||
path["SFX/UNIT_hurt"] = "Audio/SFX/UNIT_hurt";
|
||||
path["SFX/UNIT_move"] = "Audio/SFX/UNIT_move";
|
||||
path["SFX/UNIT_attack"] = "Audio/SFX/UNIT_attack";
|
||||
path["SFX/ENV_sea"] = "Audio/SFX/ENV_sea";
|
||||
path["SFX/ENV_forest"] = "Audio/SFX/ENV_forest";
|
||||
foreach (var kv in path)
|
||||
{
|
||||
_clips[kv.Key] = new List<AudioClip>();
|
||||
_clips[kv.Key].Add(Resources.Load<AudioClip>(kv.Value));
|
||||
}
|
||||
|
||||
if (!AudioRoot) AudioRoot = new GameObject();
|
||||
AudioRoot.name = "AudioRoot";
|
||||
var cfg = Object.FindObjectOfType<AudioClipConfig>();
|
||||
if (cfg != null) foreach (var clip in cfg.Clips) _clips[clip.name] = clip;
|
||||
if (cfg != null)
|
||||
{
|
||||
foreach (var clip in cfg.Clips)
|
||||
{
|
||||
_clips[clip.name] = new List<AudioClip>();
|
||||
_clips[clip.name].Add(clip);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Update()
|
||||
{
|
||||
foreach (var player in _allPlayer) player.Update();
|
||||
foreach (var player in _allPlayer)
|
||||
{
|
||||
player.Update();
|
||||
if (player.State != PlayerState.Finished) continue;
|
||||
if (!player.Clip) continue;
|
||||
if (!_clips.ContainsKey(player.MusicName)) _clips[player.MusicName] = new List<AudioClip>();
|
||||
_clips[player.MusicName].Add(player.Clip);
|
||||
player.Clip = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void PlayMusic(string musicName, float fadeIn, float fadeOut, bool isLoop)
|
||||
{
|
||||
if (!_clips.ContainsKey(musicName)) return;
|
||||
if (!_clips.ContainsKey(musicName) || _clips[musicName].Count == 0) return;
|
||||
if (_musicPlayer != null) _musicPlayer.Stop();
|
||||
_musicPlayer = GetPlayer();
|
||||
_musicPlayer.Clip = _clips[musicName];
|
||||
else _musicPlayer = GetPlayer();
|
||||
if (_clips[musicName].Count > 1)
|
||||
{
|
||||
_musicPlayer.Clip = _clips[musicName][1];
|
||||
_clips[musicName].RemoveAt(1);
|
||||
}
|
||||
else _musicPlayer.Clip = Object.Instantiate(_clips[musicName][0]);
|
||||
if (!_musicPlayer.Clip)
|
||||
{
|
||||
LogSystem.LogError($"音乐资源 {musicName} 未找到或加载失败!");
|
||||
return;
|
||||
}
|
||||
_musicPlayer.MusicName = musicName;
|
||||
_musicPlayer.IsLoop = isLoop;
|
||||
_musicPlayer.Length = _clips[musicName].length;
|
||||
_musicPlayer.Length = _musicPlayer.Clip.length;
|
||||
_musicPlayer.FadeInDuration = fadeIn;
|
||||
_musicPlayer.FadeOutDuration = fadeOut;
|
||||
_musicPlayer.VolumeRatio = MusicVolume;
|
||||
@ -96,9 +126,20 @@ namespace Logic.Audio
|
||||
{
|
||||
if (!_clips.ContainsKey(musicName)) return;
|
||||
var player = GetPlayer();
|
||||
player.Clip = _clips[musicName];
|
||||
if (_clips[musicName].Count > 1)
|
||||
{
|
||||
player.Clip = _clips[musicName][1];
|
||||
_clips[musicName].RemoveAt(1);
|
||||
}
|
||||
else player.Clip = Object.Instantiate(_clips[musicName][0]);
|
||||
if (!player.Clip)
|
||||
{
|
||||
LogSystem.LogError($"音频资源 {musicName} 未找到或加载失败!");
|
||||
return;
|
||||
}
|
||||
player.MusicName = musicName;
|
||||
player.IsLoop = isLoop;
|
||||
player.Length = _clips[musicName].length;
|
||||
player.Length = _musicPlayer.Clip.length;
|
||||
player.FadeInDuration = fadeIn;
|
||||
player.FadeOutDuration = fadeOut;
|
||||
_musicPlayer.VolumeRatio = AudioVolume;
|
||||
@ -175,6 +216,7 @@ namespace Logic.Audio
|
||||
|
||||
public class AudioPlayer
|
||||
{
|
||||
public string MusicName;
|
||||
public AudioSource Source;
|
||||
public AudioClip Clip;
|
||||
public bool IsLoop;
|
||||
@ -200,6 +242,7 @@ namespace Logic.Audio
|
||||
public void Play()
|
||||
{
|
||||
StartTime = Time.time;
|
||||
Source.time = 0;
|
||||
Source.clip = Clip;
|
||||
Source.volume = 0;
|
||||
Source.loop = IsLoop;
|
||||
@ -209,7 +252,7 @@ namespace Logic.Audio
|
||||
|
||||
public void Update()
|
||||
{
|
||||
if (Source == null || !Source.isPlaying) return;
|
||||
if (Source == null) return;
|
||||
UpdateSourceVolume();
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user