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; } } }