Files
plugin-library/Assets/Main/Script/Runtime/kkController/fsm/KKTalkState.cs
2025-05-23 18:26:47 +08:00

128 lines
3.9 KiB
C#

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
{
/// <summary>
/// 讲解状态
/// </summary>
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, T2>(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<UITableData.SubtitleInfo>)
{
kkFsmSystem.CloseImage();
kkFsmSystem.OpenText();
List<UITableData.SubtitleInfo> infos = param2 as List<UITableData.SubtitleInfo>;
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();
}
}
}
}
}
}