87 lines
3.2 KiB
C#
87 lines
3.2 KiB
C#
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<IAudioTableData>().GetAudioToUIInfo(auid);
|
|
var handle1 = YooAssets.LoadAssetAsync<AudioClip>(info.audioFileName);
|
|
await handle1.WithCancellation(tokenSource.Token);
|
|
AudioClip audioClip = handle1.GetAssetObject<AudioClip>();
|
|
|
|
var handle2 = YooAssets.LoadAssetAsync<Sprite>(info.UIMessageInfo.filename);
|
|
await handle2.WithCancellation(tokenSource.Token);
|
|
Sprite sprite = handle2.GetAssetObject<Sprite>();
|
|
|
|
MainArchitecture.Interface.GetSystem<IDigitalHuman>().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<IAudioTableData>().GetAudioToUIInfo(auid);
|
|
var handle1 = YooAssets.LoadAssetAsync<AudioClip>(info.audioFileName);
|
|
await handle1.WithCancellation(tokenSource.Token);
|
|
AudioClip audioClip = handle1.GetAssetObject<AudioClip>();
|
|
|
|
|
|
|
|
MainArchitecture.Interface.GetSystem<IDigitalHuman>().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<IAudioTableData>().GetUIInfo(uiid);
|
|
var handle1 = YooAssets.LoadAssetAsync<Sprite>(info.filename);
|
|
await handle1.WithCancellation(tokenSource.Token);
|
|
Sprite sprite = handle1.GetAssetObject<Sprite>();
|
|
|
|
MainArchitecture.Interface.GetSystem<IDigitalHuman>().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();
|
|
}
|
|
}
|
|
} |