using System.Collections; using Ichni.RhythmGame; using UnityEngine; using UnityEngine.InputSystem; namespace Ichni.Editor { /// /// 编辑器的音乐播放控制器。 /// 实现 ISongTimeProvider,作为编辑器的标准时间来源, /// 在 EditorManager.Awake 中注册到 CoreServices.TimeProvider。 /// public class MusicPlayer : MonoBehaviour, ISongTimeProvider { #region [ISongTimeProvider 实现] ISongTimeProvider Implementation /// 当前播放进度(秒),已扣除 offset,供 CoreServices.TimeProvider 使用 public float SongTime => EditorManager.instance != null ? EditorManager.instance.songInformation.songTime : 0; /// 当前是否正在播放 public bool IsPlaying => isPlaying; #endregion #region [运行时缓存数据] Property Caches public bool isDebugging; public bool isPlaying; public AudioSource audioSource; private float DspTime => (float)AudioSettings.dspTime; public AudioHighPassFilter highPassFilter; public AudioLowPassFilter lowPassFilter; #endregion #region [生命周期] Lifecycle private void Update() { if (isDebugging) { EditorManager.instance.songInformation.songTime += Time.deltaTime; return; } if (isPlaying) { EditorManager.instance.songInformation.songTime = audioSource.time - EditorManager.instance.songInformation.offset; } } #endregion #region [播放控制] Playback Control public void PlayMusic() { isPlaying = !isPlaying; audioSource.time = EditorManager.instance.songInformation.songTime + EditorManager.instance.songInformation.offset; if (isPlaying) { Trail.FreezeAllTrails(!isPlaying); audioSource.Play(); } else PauseMusic(); } public IEnumerator PlayBackMusic() { float startt = audioSource.time - EditorManager.instance.songInformation.offset; PlayMusic(); yield return new WaitUntil(() => Keyboard.current.rightAltKey.wasReleasedThisFrame); audioSource.time = startt + EditorManager.instance.songInformation.offset; PauseMusic(); } public void PauseMusic() { if (isPlaying) { EditorManager.instance.songInformation.songTime = audioSource.time - EditorManager.instance.songInformation.offset; } isPlaying = false; audioSource.Pause(); Trail.FreezeAllTrails(!isPlaying); } public void StopMusic() { isPlaying = false; EditorManager.instance.songInformation.songTime = 0; audioSource.Stop(); } #endregion } }