Files
ichni_Creator_Studio/Assets/Scripts/Manager/MusicPlayer.cs

94 lines
3.2 KiB
C#
Raw Normal View History

2025-02-14 22:04:21 -05:00
using System.Collections;
using Ichni.RhythmGame;
using UnityEngine;
2025-06-21 23:09:34 +08:00
using UnityEngine.InputSystem;
2025-02-14 22:04:21 -05:00
namespace Ichni.Editor
{
2026-03-14 02:30:26 -04:00
/// <summary>
/// 编辑器的音乐播放控制器。
/// 实现 ISongTimeProvider作为编辑器的标准时间来源
/// 在 EditorManager.Awake 中注册到 CoreServices.TimeProvider。
/// </summary>
public class MusicPlayer : MonoBehaviour, ISongTimeProvider
2025-02-14 22:04:21 -05:00
{
2026-03-14 02:30:26 -04:00
#region [ISongTimeProvider ] ISongTimeProvider Implementation
/// <summary>当前播放进度(秒),已扣除 offset供 CoreServices.TimeProvider 使用</summary>
public float SongTime => EditorManager.instance != null ? EditorManager.instance.songInformation.songTime : 0;
2026-03-14 02:30:26 -04:00
/// <summary>当前是否正在播放</summary>
public bool IsPlaying => isPlaying;
#endregion
#region [] Property Caches
2025-05-04 03:29:23 -04:00
public bool isDebugging;
2025-02-14 22:04:21 -05:00
public bool isPlaying;
public AudioSource audioSource;
2025-07-12 18:56:10 +08:00
private float DspTime => (float)AudioSettings.dspTime;
public AudioHighPassFilter highPassFilter;
public AudioLowPassFilter lowPassFilter;
2026-03-14 02:30:26 -04:00
#endregion
#region [] Lifecycle
private void Update()
2025-02-14 22:04:21 -05:00
{
2025-05-04 03:29:23 -04:00
if (isDebugging)
{
EditorManager.instance.songInformation.songTime += Time.deltaTime;
return;
}
2025-05-30 19:37:54 +08:00
if (isPlaying)
{
2026-03-14 02:30:26 -04:00
EditorManager.instance.songInformation.songTime =
audioSource.time - EditorManager.instance.songInformation.offset;
}
2025-02-14 22:04:21 -05:00
}
2026-03-14 02:30:26 -04:00
#endregion
2025-02-14 22:04:21 -05:00
2026-03-14 02:30:26 -04:00
#region [] Playback Control
2025-02-14 22:04:21 -05:00
public void PlayMusic()
{
isPlaying = !isPlaying;
2026-03-14 02:30:26 -04:00
audioSource.time = EditorManager.instance.songInformation.songTime +
EditorManager.instance.songInformation.offset;
if (isPlaying)
{
Trail.FreezeAllTrails(!isPlaying);
audioSource.Play();
}
2025-05-30 19:37:54 +08:00
else PauseMusic();
2025-02-14 22:04:21 -05:00
}
2026-03-14 02:30:26 -04:00
2025-06-21 23:09:34 +08:00
public IEnumerator PlayBackMusic()
{
float startt = audioSource.time - EditorManager.instance.songInformation.offset;
2025-06-21 23:09:34 +08:00
PlayMusic();
yield return new WaitUntil(() => Keyboard.current.rightAltKey.wasReleasedThisFrame);
audioSource.time = startt + EditorManager.instance.songInformation.offset;
2025-06-21 23:09:34 +08:00
PauseMusic();
}
2026-03-14 02:30:26 -04:00
2025-02-14 22:04:21 -05:00
public void PauseMusic()
{
2026-03-14 02:30:26 -04:00
if (isPlaying)
{
EditorManager.instance.songInformation.songTime =
audioSource.time - EditorManager.instance.songInformation.offset;
}
2025-02-14 22:04:21 -05:00
isPlaying = false;
audioSource.Pause();
Trail.FreezeAllTrails(!isPlaying);
2025-02-14 22:04:21 -05:00
}
2025-02-28 20:08:00 +08:00
2025-02-14 22:04:21 -05:00
public void StopMusic()
{
isPlaying = false;
EditorManager.instance.songInformation.songTime = 0;
audioSource.Stop();
}
2026-03-14 02:30:26 -04:00
#endregion
2025-02-14 22:04:21 -05:00
}
}