From b4a4ab0a0bdd2a34d70aed04eb5357a9c24ecfb5 Mon Sep 17 00:00:00 2001 From: wuwenbo Date: Fri, 11 Jul 2025 19:40:08 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9F=B3=E6=95=88=E9=97=AE=E9=A2=98=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=B9=B6=E5=A2=9E=E5=8A=A0=E9=9F=B3=E6=95=88=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E6=B1=A0=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets/Scripts/TH1Audio/AudioManager.cs | 101 +++++++++++++----- 1 file changed, 72 insertions(+), 29 deletions(-) diff --git a/My project/Assets/Scripts/TH1Audio/AudioManager.cs b/My project/Assets/Scripts/TH1Audio/AudioManager.cs index cfd25ad47..222fd1094 100644 --- a/My project/Assets/Scripts/TH1Audio/AudioManager.cs +++ b/My project/Assets/Scripts/TH1Audio/AudioManager.cs @@ -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 _allPlayer; - private Dictionary _clips; + private Dictionary> _clips; private GameObject AudioRoot; public float MusicVolume @@ -42,45 +43,74 @@ namespace Logic.Audio public void Init() { _allPlayer = new List(); - _clips = new Dictionary(); - _clips["Main"] = Resources.Load("Audio/Main"); - _clips["RemiliaEgyptian"] = Resources.Load("Audio/RemiliaEgyptian"); - _clips["SatoriIndian"] = Resources.Load("Audio/SatoriIndian"); - _clips["KanakoGermany"] = Resources.Load("Audio/KanakoGermany"); - _clips["KaguyaFrench"] = Resources.Load("Audio/KaguyaFrench"); - _clips["SFX/UI_buttonHover"] = Resources.Load("Audio/SFX/UI_buttonHover"); - _clips["SFX/UI_buttonClick"] = Resources.Load("Audio/SFX/UI_buttonClick"); - _clips["SFX/UNIT_click"] = Resources.Load("Audio/SFX/UNIT_click"); - _clips["SFX/UNIT_bomb"] = Resources.Load("Audio/SFX/UNIT_bomb"); - _clips["SFX/UNIT_archer"] = Resources.Load("Audio/SFX/UNIT_archer"); - _clips["SFX/UNIT_hurt"] = Resources.Load("Audio/SFX/UNIT_hurt"); - _clips["SFX/UNIT_move"] = Resources.Load("Audio/SFX/UNIT_move"); - _clips["SFX/UNIT_attack"] = Resources.Load("Audio/SFX/UNIT_attack"); - - _clips["SFX/ENV_sea"] = Resources.Load("Audio/SFX/ENV_sea"); - _clips["SFX/ENV_forest"] = Resources.Load("Audio/SFX/ENV_forest"); - - + _clips = new Dictionary>(); + var path = new Dictionary(); + 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(); + _clips[kv.Key].Add(Resources.Load(kv.Value)); + } if (!AudioRoot) AudioRoot = new GameObject(); AudioRoot.name = "AudioRoot"; var cfg = Object.FindObjectOfType(); - 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(); + _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(); + _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(); }