From d824d65549a5140f830719fab9aa1d5974c3245b Mon Sep 17 00:00:00 2001 From: Oliver Wong Date: Fri, 27 Mar 2026 17:57:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8DoTween=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=B7=A1=E5=8F=98=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Resources/DOTweenSettings.asset | 2 +- .../HandWritten/LongAudio/ChannelFader.cs | 46 +++++++++++++++---- .../LongAudio/MusicChannelPlayer.cs | 1 - ProjectSettings/ProjectSettings.asset | 34 +++++++------- 4 files changed, 54 insertions(+), 29 deletions(-) diff --git a/Assets/Resources/DOTweenSettings.asset b/Assets/Resources/DOTweenSettings.asset index 3300455..eee77e5 100644 --- a/Assets/Resources/DOTweenSettings.asset +++ b/Assets/Resources/DOTweenSettings.asset @@ -49,7 +49,7 @@ MonoBehaviour: tk2DEnabled: 0 deAudioEnabled: 0 deUnityExtendedEnabled: 0 - epoOutlineEnabled: 1 + epoOutlineEnabled: 0 createASMDEF: 1 showPlayingTweens: 0 showPausedTweens: 0 diff --git a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/ChannelFader.cs b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/ChannelFader.cs index b393b21..5f3e2d6 100644 --- a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/ChannelFader.cs +++ b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/ChannelFader.cs @@ -2,6 +2,7 @@ using System; using System.Collections; using System.Collections.Generic; using UnityEngine; +using DG.Tweening; namespace OCES.Audio { @@ -106,39 +107,64 @@ namespace OCES.Audio { if (handle.Cancelled) break; elapsed += Time.deltaTime; - float t = Mathf.Clamp01(elapsed / duration); - float vol = Mathf.Lerp(fromVolume, 0f, t); + // 为每个 source 创建 DOFade(仅创建一次) + sources.Clear(); + handle.CollectActiveSources(sources); + foreach (AudioSource src in sources) - if (src) src.volume = vol; + { + if (!src) continue; + + if (DOTween.IsTweening(src)) + continue; + + src.volume = fromVolume; + src.DOFade(0f, duration - elapsed).SetEase(Ease.Linear); + } yield return null; } + // 确保最终状态 + sources.Clear(); + handle.CollectActiveSources(sources); + foreach (AudioSource src in sources) + if (src) src.volume = 0f; + StopHandle(handle); } IEnumerator FadeIn(ContainerPlayHandle handle, float duration) { - //Debug.Log($"Fading In {duration} seconds."); if (handle == null || handle.Cancelled) yield break; - float elapsed = 0f; List sources = new(); + float elapsed = 0f; while (elapsed < duration) { if (handle.Cancelled) yield break; - elapsed += Time.deltaTime; - float t = Mathf.Clamp01(elapsed / duration); - // 每帧重新收集(Blend 模式下新 source 可能中途加入) + elapsed += Time.deltaTime; + + // 每帧收集当前活跃的 sources,并为新加入的 source 创建 tween sources.Clear(); handle.CollectActiveSources(sources); + foreach (AudioSource src in sources) - if (src) src.volume = Mathf.Lerp(0f, 1f, t); + { + if (!src) continue; + + // 如果这个 source 还没被 tween 过,则创建一个 DOFade + if (DOTween.IsTweening(src)) + continue; + src.volume = 0f; + src.DOFade(1f, duration - elapsed).SetEase(Ease.Linear); + } + yield return null; } - // 确保最终音量准确 + // 确保最终音量 sources.Clear(); handle.CollectActiveSources(sources); foreach (AudioSource src in sources) diff --git a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicChannelPlayer.cs b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicChannelPlayer.cs index 1fe6b19..f2574cb 100644 --- a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicChannelPlayer.cs +++ b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicChannelPlayer.cs @@ -20,7 +20,6 @@ namespace OCES.Audio // 当前正在播放的句柄 ContainerPlayHandle m_currentHandle; uint m_currentContainerId; - float m_currentVolume = 1f; // 当前播放的 Container(用于读取 bpm/timeSig 做节拍对齐) MusicContainer m_currentContainer; diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 1636780..8ef5e6c 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -760,23 +760,23 @@ PlayerSettings: webGLMemoryGeometricGrowthCap: 96 webGLPowerPreference: 2 scriptingDefineSymbols: - Android: DOTWEEN;DOTWEEN_EPO - EmbeddedLinux: DOTWEEN;DOTWEEN_EPO - GameCoreScarlett: DOTWEEN;DOTWEEN_EPO - GameCoreXboxOne: DOTWEEN;DOTWEEN_EPO - LinuxHeadlessSimulation: DOTWEEN;DOTWEEN_EPO - Nintendo Switch: DOTWEEN;DOTWEEN_EPO - PS4: DOTWEEN;DOTWEEN_EPO - PS5: DOTWEEN;DOTWEEN_EPO - QNX: DOTWEEN;DOTWEEN_EPO - Stadia: DOTWEEN;DOTWEEN_EPO - Standalone: DOTWEEN;DOTWEEN_EPO - VisionOS: DOTWEEN;DOTWEEN_EPO - WebGL: DOTWEEN;DOTWEEN_EPO - Windows Store Apps: DOTWEEN;DOTWEEN_EPO - XboxOne: DOTWEEN;DOTWEEN_EPO - iPhone: DOTWEEN;DOTWEEN_EPO - tvOS: DOTWEEN;DOTWEEN_EPO + Android: DOTWEEN + EmbeddedLinux: DOTWEEN + GameCoreScarlett: DOTWEEN + GameCoreXboxOne: DOTWEEN + LinuxHeadlessSimulation: DOTWEEN + Nintendo Switch: DOTWEEN + PS4: DOTWEEN + PS5: DOTWEEN + QNX: DOTWEEN + Stadia: DOTWEEN + Standalone: DOTWEEN + VisionOS: DOTWEEN + WebGL: DOTWEEN + Windows Store Apps: DOTWEEN + XboxOne: DOTWEEN + iPhone: DOTWEEN + tvOS: DOTWEEN additionalCompilerArguments: {} platformArchitecture: {} scriptingBackend: {}