using System; using System.Collections.Generic; using System.Threading; using Cysharp.Threading.Tasks; using Stary.Evo; using Stary.Evo.AudioCore; using Stary.Evo.TableTextConversion; using UnityEngine; namespace Main { /// /// 讲解状态 /// public class KKTalkState : AbstractFSMIState { private string aniName = "anim_ip_explain_talk_loop"; private string aniMouthName = "anim_ip_talk"; private CancellationTokenSource cts; public KKTalkState(IFsmSystem system) : base(system) { } public override UniTask OnEnterAsync() { return UniTask.CompletedTask; } public override UniTask OnExitAsync() { if (cts.IsCancellationRequested) { cts?.Cancel(); cts?.Dispose(); } KKFsmSystem kkFsmSystem = FsmSystem as KKFsmSystem; if (kkFsmSystem != null) { // kkFsmSystem.CloseImage(); // kkFsmSystem.CloseText(); } kkFsmSystem.animator.CrossFade("defaultState", 0.2f, 1, 0f); return UniTask.CompletedTask; } public override async UniTask OnEnterAsync(T1 param1, T2 param2) { if (cts != null && !cts.IsCancellationRequested) { cts?.Cancel(); cts?.Dispose(); cts = null; } cts = new CancellationTokenSource(); KKFsmSystem kkFsmSystem = FsmSystem as KKFsmSystem; AudioClip clip = param1 as AudioClip; if (clip != null) { AudioCoreManager.PlayVoice(new AudioData() { clip = clip, delayOnCompleteTime = 1f, onComplete = async () => { kkFsmSystem.CloseImage(); float animProgress = 0; while (animProgress <= 0.99f) { animProgress = kkFsmSystem.GetAnimationProgress(0); await UniTask.Yield(); } FsmSystem.SetCurState(nameof(KKIdleState), (object)KKIdleStateParam.NotVoice); } }); } if (kkFsmSystem.animator != null) { kkFsmSystem.animator.CrossFade(aniName, 0.2f, 0, 0f); kkFsmSystem.animator.CrossFade(aniMouthName, 0.2f, 1, 0f); } else { Debug.LogError("UnityEvo:KKFsmSystem: animator is null"); } if (kkFsmSystem.image != null) { if (param2 != null && param2 is Sprite) { kkFsmSystem.image.sprite = param2 as Sprite; kkFsmSystem.image.SetNativeSize(); kkFsmSystem.CloseText(); kkFsmSystem.OpenImage(); } } if (kkFsmSystem.text != null) { if (param2 != null && param2 is List) { kkFsmSystem.CloseImage(); kkFsmSystem.OpenText(); List infos = param2 as List; if (infos.Count > 0) { for (int i = 0; i < infos.Count; i++) { kkFsmSystem.text.text = infos[i].subtitle; await UniTask.Delay(TimeSpan.FromSeconds(infos[i].end - infos[i].start), cancellationToken: cts.Token); } kkFsmSystem.CloseText(); } } } } } }