using System; using Continentis.MainGame.Character; using Cysharp.Threading.Tasks; using SLSUtilities.General; using SLSUtilities.UModAssistance; using UnityEngine; namespace Continentis.MainGame.Commands { public class Cmd_PlaySFX : CommandBase { private readonly AudioClip sfxClip; private readonly CharacterBase target; private readonly Vector3 fixedPosition; private readonly Vector3 positionOffset; private readonly float volume; private readonly float overrideDuration; private readonly bool willWaitUntilFinish; /// 在目标角色位置播放音效。 public Cmd_PlaySFX(string sfxClipID, CharacterBase target, Vector3 positionOffset = default, bool willWaitUntilFinish = false, float volume = 1f, float overrideDuration = -1f) { this.sfxClip = ModManager.GetAsset(sfxClipID); this.target = target; this.positionOffset = positionOffset; this.fixedPosition = Vector3.zero; this.volume = volume; this.overrideDuration = overrideDuration; this.willWaitUntilFinish = willWaitUntilFinish; } /// 在世界坐标固定位置播放音效。 public Cmd_PlaySFX(string sfxClipID, Vector3 position = default, bool willWaitUntilFinish = false, float volume = 1f, float overrideDuration = -1f) { this.sfxClip = ModManager.GetAsset(sfxClipID); this.target = null; this.fixedPosition = position; this.positionOffset = Vector3.zero; this.volume = volume; this.overrideDuration = overrideDuration; this.willWaitUntilFinish = willWaitUntilFinish; } protected override async UniTask ExecuteAsync(CommandContext outerContext) { if (sfxClip == null) { Debug.LogWarning("[Cmd_PlaySFX] SFX Clip 为空。"); return; } Vector3 playPosition = target != null ? target.characterView.centerPoint.transform.position + positionOffset : fixedPosition; AudioManager.PlaySFX(sfxClip, playPosition, volume); if (willWaitUntilFinish) { float duration = overrideDuration > 0f ? overrideDuration : sfxClip.length; await UniTask.Delay(TimeSpan.FromSeconds(duration)); } } } }