67 lines
2.5 KiB
C#
67 lines
2.5 KiB
C#
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;
|
|
|
|
/// <summary>在目标角色位置播放音效。</summary>
|
|
public Cmd_PlaySFX(string sfxClipID, CharacterBase target, Vector3 positionOffset = default,
|
|
bool willWaitUntilFinish = false, float volume = 1f, float overrideDuration = -1f)
|
|
{
|
|
this.sfxClip = ModManager.GetAsset<AudioClip>(sfxClipID);
|
|
this.target = target;
|
|
this.positionOffset = positionOffset;
|
|
this.fixedPosition = Vector3.zero;
|
|
this.volume = volume;
|
|
this.overrideDuration = overrideDuration;
|
|
this.willWaitUntilFinish = willWaitUntilFinish;
|
|
}
|
|
|
|
/// <summary>在世界坐标固定位置播放音效。</summary>
|
|
public Cmd_PlaySFX(string sfxClipID, Vector3 position = default,
|
|
bool willWaitUntilFinish = false, float volume = 1f, float overrideDuration = -1f)
|
|
{
|
|
this.sfxClip = ModManager.GetAsset<AudioClip>(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));
|
|
}
|
|
}
|
|
}
|
|
} |