163 lines
5.1 KiB
C#
163 lines
5.1 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using Sirenix.OdinInspector;
|
|
using SLSUtilities.WwiseAssistance;
|
|
using UnityEngine;
|
|
using Event = AK.Wwise.Event;
|
|
|
|
namespace Ichni
|
|
{
|
|
public class SongPlayer : SerializedMonoBehaviour
|
|
{
|
|
public bool isLoading = true;
|
|
public bool isStarting = false;
|
|
public bool isDelaying = false;
|
|
public bool isPlaying = false; // 是否正在播放音乐
|
|
public bool isPausing = false; // 是否正在暂停音乐
|
|
public bool isFinished = false;
|
|
public bool isUpdating => isStarting || isDelaying || isPlaying;
|
|
|
|
public Event PlayMusicEvent; // 播放背景音乐的事件
|
|
public Event ResumeMusicEvent; // 恢复播放背景音乐的事件
|
|
public Event PauseMusicEvent; // 暂停播放背景音乐的事件
|
|
public Event StopMusicEvent; // 停止播放背景音乐的事件
|
|
|
|
private uint _playingId;
|
|
public float songTimeSegment = 0;
|
|
public float pauseTimeSegment;
|
|
private float duration;
|
|
private float recordedSongSeg;
|
|
|
|
public float judgeOffset = 0;
|
|
|
|
private void Start()
|
|
{
|
|
InformationTransistor.instance.chapterSwitch.SetValue(gameObject);
|
|
InformationTransistor.instance.songSwitch.SetValue(gameObject);
|
|
isLoading = true;
|
|
isStarting = false;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (isLoading)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (isDelaying)
|
|
{
|
|
songTimeSegment += Time.deltaTime;
|
|
//songTimeSegment = Mathf.Max(songTimeSegment, 0); // 确保时间段不为负数
|
|
|
|
if (songTimeSegment >= 0)
|
|
{
|
|
isDelaying = false;
|
|
songTimeSegment = 0; // 延迟结束后,时间段归零
|
|
PlaySong();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (GameManager.Instance.isDebugging)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (isFinished)
|
|
{
|
|
songTimeSegment = recordedSongSeg;
|
|
|
|
return;
|
|
}
|
|
|
|
if (isPlaying)
|
|
{
|
|
float currentSongSegment = PlaySegment() / 1000f - (judgeOffset / 1000f);
|
|
|
|
if (recordedSongSeg < currentSongSegment)
|
|
{
|
|
songTimeSegment = currentSongSegment;
|
|
recordedSongSeg = currentSongSegment;
|
|
}
|
|
}
|
|
else if (isPausing)
|
|
{
|
|
songTimeSegment = pauseTimeSegment;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
[Button]
|
|
public void PlaySong()
|
|
{
|
|
_playingId = PlayMusicEvent.Post(gameObject,
|
|
(uint)AkCallbackType.AK_EnableGetMusicPlayPosition |
|
|
(uint)AkCallbackType.AK_MusicSyncEntry |
|
|
(uint)AkCallbackType.AK_MusicSyncExit,
|
|
OnMusicEvent, null);
|
|
|
|
isPlaying = true;
|
|
isPausing = false;
|
|
isFinished = false;
|
|
}
|
|
|
|
[Button]
|
|
public void PauseSong()
|
|
{
|
|
pauseTimeSegment = songTimeSegment;
|
|
isPlaying = false;
|
|
isPausing = true;
|
|
PauseMusicEvent.Post(gameObject);
|
|
Time.timeScale = 0;
|
|
}
|
|
|
|
[Button]
|
|
public void ResumeSong()
|
|
{
|
|
Time.timeScale = 1;
|
|
isPlaying = true;
|
|
isPausing = false;
|
|
ResumeMusicEvent.Post(gameObject);
|
|
}
|
|
|
|
[Button]
|
|
public void StopSong()
|
|
{
|
|
isPlaying = false;
|
|
isPausing = false;
|
|
StopMusicEvent.Post(gameObject);
|
|
}
|
|
|
|
private void OnMusicEvent(object in_cookie, AkCallbackType in_type, AkCallbackInfo in_info)
|
|
{
|
|
Debug.Log(in_type + " " + in_info);
|
|
|
|
if (in_type == AkCallbackType.AK_MusicSyncEntry)
|
|
{
|
|
if (in_info is AkMusicSyncCallbackInfo musicInfo)
|
|
{
|
|
GameManager.Instance.songInformation.songLength = musicInfo.segmentInfo_iActiveDuration / 1000f;
|
|
InformationTransistor.instance.songLength = musicInfo.segmentInfo_iActiveDuration / 1000f;
|
|
InformationTransistor.instance.bpm = GameManager.Instance.songInformation.bpm;
|
|
}
|
|
}
|
|
|
|
if (in_type == AkCallbackType.AK_MusicSyncExit)
|
|
{
|
|
isFinished = true;
|
|
GameManager.Instance.summaryPageCanvas.SetUpSummary();
|
|
GameManager.Instance.summaryPageCanvas.FadeIn();
|
|
}
|
|
}
|
|
|
|
int PlaySegment()
|
|
{
|
|
AkSegmentInfo segmentInfo = new AkSegmentInfo();
|
|
AkSoundEngine.GetPlayingSegmentInfo(_playingId, segmentInfo,true);
|
|
|
|
return segmentInfo.iCurrentPosition;
|
|
}
|
|
}
|
|
} |