Files
ichni_Official/Assets/Scripts/Wwise/SongPlayer.cs
SoulliesOfficial bae0bfbc20 perf
2025-07-21 05:42:20 -04:00

144 lines
4.5 KiB
C#

using System.Collections;
using System.Collections.Generic;
using Sirenix.OdinInspector;
using UnityEngine;
using Event = AK.Wwise.Event;
namespace Ichni
{
public class SongPlayer : SerializedMonoBehaviour
{
public AudioManager audioManager;
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 Update()
{
if (audioManager.isLoading)
{
return;
}
if (audioManager.isDelaying)
{
songTimeSegment += Time.deltaTime;
songTimeSegment = Mathf.Max(songTimeSegment, 0); // 确保时间段不为负数
if (songTimeSegment >= 0)
{
audioManager.isDelaying = false;
}
}
else
{
if (GameManager.instance.isDebugging)
{
return;
}
if (audioManager.isFinished)
{
songTimeSegment = recordedSongSeg;
return;
}
if (audioManager.isPlaying)
{
songTimeSegment = PlaySegment() / 1000f + (judgeOffset / 1000f);
if (songTimeSegment > 0)
{
recordedSongSeg = songTimeSegment;
}
else if (songTimeSegment == 0 && recordedSongSeg > 0)
{
audioManager.isFinished = true;
songTimeSegment = recordedSongSeg;
GameManager.instance.summaryPageCanvas.SetUpSummary();
GameManager.instance.summaryPageCanvas.FadeIn();
}
//Debug.Log($"Song Time Segment: {songTimeSegment}, Recorded Segment: {recordedSongSeg}");
}
else if (audioManager.isPausing)
{
songTimeSegment = pauseTimeSegment / 1000f + (judgeOffset / 1000f);
}
}
}
[Button]
public void PlaySong()
{
_playingId = PlayMusicEvent.Post(gameObject,
(uint)AkCallbackType.AK_EnableGetMusicPlayPosition | (uint)AkCallbackType.AK_MusicSyncAll,
OnMusicEvent, null);
audioManager.isPlaying = true;
audioManager.isPausing = false;
audioManager.isFinished = false;
}
[Button]
public void PauseSong()
{
pauseTimeSegment = PlaySegment();
audioManager.isPlaying = false;
audioManager.isPausing = true;
PauseMusicEvent.Post(gameObject);
Time.timeScale = 0;
}
[Button]
public void ResumeSong()
{
Time.timeScale = 1;
audioManager.isPlaying = true;
audioManager.isPausing = false;
ResumeMusicEvent.Post(gameObject);
}
[Button]
public void StopSong()
{
audioManager.isPlaying = false;
audioManager.isPausing = false;
StopMusicEvent.Post(gameObject);
}
private void OnMusicEvent(object in_cookie, AkCallbackType in_type, AkCallbackInfo in_info)
{
if (in_info is AkMusicSyncCallbackInfo)
{
if (in_type == AkCallbackType.AK_EndOfEvent)
{
audioManager.isFinished = true;
}
if (in_type is AkCallbackType.AK_MusicSyncExit)
{
//GameManager.gameManager.OpenSummary();
}
}
}
int PlaySegment()
{
AkSegmentInfo segmentInfo = new AkSegmentInfo();
AkSoundEngine.GetPlayingSegmentInfo(_playingId, segmentInfo,true);
return segmentInfo.iCurrentPosition;
}
}
}