94 lines
3.2 KiB
C#
94 lines
3.2 KiB
C#
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
|
||
}
|
||
} |