using System; using System.Threading; using Cysharp.Threading.Tasks; using Main; using Stary.Evo; using Stary.Evo.UIFarme; using UnityEngine; using YooAsset; namespace Main { public interface IDigitalHumanVoiceSystem : ISystem { UniTask PlayVoice(string auid, Action callback = null); UniTask PlayTest(string auid, Action callback = null); void PlayImage(string uiid); } public class DigitalHumanVoiceSystem : AbstractSystem, IDigitalHumanVoiceSystem { private CancellationTokenSource tokenSource; public async UniTask PlayVoice(string auid, Action callback = null) { DisposeTokenSource(); tokenSource = new CancellationTokenSource(); var info = this.GetData().GetAudioToUIInfo(auid); var handle1 = YooAssets.LoadAssetAsync(info.audioFileName); await handle1.WithCancellation(tokenSource.Token); AudioClip audioClip = handle1.GetAssetObject(); var handle2 = YooAssets.LoadAssetAsync(info.UIMessageInfo.filename); await handle2.WithCancellation(tokenSource.Token); Sprite sprite = handle2.GetAssetObject(); MainArchitecture.Interface.GetSystem().SetTalkState(audioClip, sprite); await UniTask.Delay(TimeSpan.FromSeconds(audioClip.length+1f), cancellationToken: tokenSource.Token); callback?.Invoke(); } public async UniTask PlayTest(string auid, Action callback = null) { DisposeTokenSource(); tokenSource = new CancellationTokenSource(); var info = this.GetData().GetAudioToUIInfo(auid); var handle1 = YooAssets.LoadAssetAsync(info.audioFileName); await handle1.WithCancellation(tokenSource.Token); AudioClip audioClip = handle1.GetAssetObject(); MainArchitecture.Interface.GetSystem().SetTalkState(audioClip, info.UIMessageInfo.subtitle); await UniTask.Delay(TimeSpan.FromSeconds(audioClip.length), cancellationToken: tokenSource.Token); callback?.Invoke(); } public async void PlayImage(string uiid) { DisposeTokenSource(); tokenSource = new CancellationTokenSource(); var info =this.GetData().GetUIInfo(uiid); var handle1 = YooAssets.LoadAssetAsync(info.filename); await handle1.WithCancellation(tokenSource.Token); Sprite sprite = handle1.GetAssetObject(); MainArchitecture.Interface.GetSystem().SetTalkState( sprite); } protected override void OnInit() { } private void DisposeTokenSource() { if (tokenSource != null && !tokenSource.IsCancellationRequested) { tokenSource.Cancel(); tokenSource.Dispose(); tokenSource = null; } } public override void Dispose() { DisposeTokenSource(); } } }