using System; using System.Threading; using Cysharp.Threading.Tasks; using Stary.Evo; using UnityEngine; using YooAsset; namespace Main { public interface IAudioTableData : IData { UniTask LoadData(string audiotabledata_asset, string uitabledata_asset); Stary.Evo.TableTextConversion.AudioTableData.MessageInfo GetAudioInfo(string auid); UniTask GetAudioClip(string auid); AudioTableData.AudioToUITableData GetAudioToUIInfo(string auid); UniTask GetAudioClipToUISprite(string auid); Stary.Evo.TableTextConversion.UITableData.MessageInfo GetUIInfo(string uiid); UniTask GetUISprite(string uiid); } public class AudioTableData : AbstractData, IAudioTableData { private Stary.Evo.TableTextConversion.AudioTableData audioTableData; private Stary.Evo.TableTextConversion.UITableData uiTableDatas; private CancellationTokenSource _cancellationTokenSource; protected override async void OnInit() { } public async UniTask LoadData(string audiotabledata_asset, string uitabledata_asset) { _cancellationTokenSource = new CancellationTokenSource(); var audioHandle = YooAssets.LoadAssetAsync(audiotabledata_asset); await audioHandle.WithCancellation(_cancellationTokenSource.Token); audioTableData = audioHandle.GetAssetObject(); var UIHandle = YooAssets.LoadAssetAsync(uitabledata_asset); await UIHandle.WithCancellation(_cancellationTokenSource.Token); uiTableDatas = UIHandle.GetAssetObject(); } /// /// 获取音频数据 /// /// /// public Stary.Evo.TableTextConversion.AudioTableData.MessageInfo GetAudioInfo(string auid) { var info = audioTableData.infos.Find(x => x.auid == auid); if (info != null && !info.filename.Contains("Audios")) { info.filename = "Audios_" + info.filename; } return info; } /// /// 获取音频 /// /// /// public async UniTask GetAudioClip(string auid) { var info=GetAudioInfo(auid); var handle = YooAssets.LoadAssetAsync(info.filename); await handle.WithCancellation(_cancellationTokenSource.Token); if (handle.Status == EOperationStatus.Succeed) { return handle.GetAssetObject(); } else { Debug.LogError( $"加载音频失败,错误的id为:{auid},错误的音频名称为:{info.filename},错误的错误信息为:{handle.LastError}"); return null; } } /// /// 获取音频数据获取UI数据 /// /// /// public AudioToUITableData GetAudioToUIInfo(string auid) { var info=GetAudioInfo(auid); Stary.Evo.TableTextConversion.UITableData.MessageInfo messageInfo = GetUIInfo(info.uirelated); if (messageInfo != null) { return new AudioToUITableData() { audioFileName = info.filename, UIMessageInfo = messageInfo }; } else { Debug.Log($"没有找到对应的uiid,错误的id为:{info.uirelated}"); return default; } } /// /// 获取音频数据获取UI数据 /// /// /// public async UniTask GetAudioClipToUISprite(string auid) { var info=GetAudioToUIInfo(auid); AudioClip audioClip = await GetAudioClip(auid); var audioTableData = new AudioToUIData(); if (audioClip != null) { audioTableData.audioClip = audioClip; } else { Debug.LogError($"没有找到对应的auid,错误的id为:{auid}"); } if (info.UIMessageInfo != null) { Sprite sprite = await GetUISprite(info.UIMessageInfo.uiid); if ( sprite != null) { audioTableData.sprite = sprite; } else { Debug.LogError($"没有找到对应的uiid,错误的id为:{info.UIMessageInfo.uiid}"); } } return audioTableData; } /// /// 获取UI数据 /// /// /// public Stary.Evo.TableTextConversion.UITableData.MessageInfo GetUIInfo(string uiid) { var info = uiTableDatas.infos.Find(x => x.uiid == uiid); if (info != null && !info.filename.Contains("Sprites_")) { info.filename = "Sprites_" + info.filename; } return info; } /// /// 获取UI /// /// /// public async UniTask GetUISprite(string uiid) { var info = GetUIInfo(uiid); var handle = YooAssets.LoadAssetAsync(info.filename); await handle.WithCancellation(_cancellationTokenSource.Token); if (handle.Status == EOperationStatus.Succeed) { return handle.GetAssetObject(); } else { Debug.LogError( $"加载ui失败,错误的id为:{uiid},错误的ui名称为:{info.filename},错误的错误信息为:{handle.LastError}"); return null; } } public override void Dispose() { try { if (_cancellationTokenSource != null && !_cancellationTokenSource.IsCancellationRequested) { _cancellationTokenSource.Cancel(); _cancellationTokenSource.Dispose(); } } catch (OperationCanceledException e) { Debug.Log("异步取消操作"); } } public struct AudioToUITableData { public string audioFileName; public Stary.Evo.TableTextConversion.UITableData.MessageInfo UIMessageInfo; } public struct AudioToUIData { public AudioClip audioClip; public Sprite sprite; } } }