Files
ichni_Creator_Studio/Assets/Scripts/Manager/MusicPlayer.cs
2026-03-21 02:18:50 -04:00

94 lines
3.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Collections;
using Ichni.RhythmGame;
using UnityEngine;
using UnityEngine.InputSystem;
namespace Ichni.Editor
{
/// <summary>
/// 编辑器的音乐播放控制器。
/// 实现 ISongTimeProvider作为编辑器的标准时间来源
/// 在 EditorManager.Awake 中注册到 CoreServices.TimeProvider。
/// </summary>
public class MusicPlayer : MonoBehaviour, ISongTimeProvider
{
#region [ISongTimeProvider ] ISongTimeProvider Implementation
/// <summary>当前播放进度(秒),已扣除 offset供 CoreServices.TimeProvider 使用</summary>
public float SongTime => EditorManager.instance != null ? EditorManager.instance.songInformation.songTime : 0;
/// <summary>当前是否正在播放</summary>
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
}
}