音效问题修复并增加音效对象池缓存

This commit is contained in:
wuwenbo 2025-07-11 19:40:08 +08:00
parent 19c56ecf8f
commit b4a4ab0a0b

View File

@ -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();
}