| | |
| | | { |
| | | return; |
| | | } |
| | | |
| | | PlaySound(audioId, pitchControl); |
| | | } |
| | | |
| | |
| | | { |
| | | source.pitch = 1.0f; |
| | | } |
| | | |
| | | |
| | | // 播放音效 |
| | | source.PlayOneShot(audioClip); |
| | | // 设置音频剪辑并播放(使用 Play() 而不是 PlayOneShot(),以便 isPlaying 状态正确) |
| | | source.clip = audioClip; |
| | | source.Play(); |
| | | |
| | | // 标记为活跃 |
| | | if (!activeAudioSources.Contains(source)) |
| | |
| | | if (config == null) |
| | | return null; |
| | | |
| | | // ===== 修复:添加 Audio/ 前缀 ===== |
| | | AudioClip audioClip = BattleResManager.Instance.GetAudioResource( |
| | | "Audio/" + config.Folder, // ← 修复:添加 Audio/ 前缀 |
| | | config.Audio, |
| | | battleField.guid |
| | | AudioClip audioClip = ResManager.Instance.LoadAsset<AudioClip>( |
| | | "Audio/" + config.Folder, |
| | | config.Audio, |
| | | false |
| | | ); |
| | | |
| | | return audioClip; |
| | | // ================================ |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | activeAudioSources.RemoveAt(i); |
| | | if (source != null) |
| | | { |
| | | // 清空 clip 引用,释放内存 |
| | | source.clip = null; |
| | | audioSourcePool.Enqueue(source); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 清理 audioIdToSources 中已停止播放的 AudioSource |
| | | var keysToRemove = new List<int>(); |
| | | foreach (var kvp in audioIdToSources) |
| | | { |
| | | kvp.Value.RemoveAll(s => s == null || !s.isPlaying); |
| | | if (kvp.Value.Count == 0) |
| | | { |
| | | keysToRemove.Add(kvp.Key); |
| | | } |
| | | } |
| | | |
| | | // 移除空的音效ID记录 |
| | | foreach (var key in keysToRemove) |
| | | { |
| | | audioIdToSources.Remove(key); |
| | | } |
| | | } |
| | | |
| | |
| | | { |
| | | if (source != null) |
| | | { |
| | | // 清空 clip 引用 |
| | | source.clip = null; |
| | | audioSourcePool.Enqueue(source); |
| | | } |
| | | } |