Files
plugin-library/Assets/Main/HotfixUpdateScript/Runtime/HotUpdate/LasterDoMain/AudioTableData.cs
2025-07-02 10:05:26 +08:00

208 lines
7.1 KiB
C#

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<AudioClip> GetAudioClip(string auid);
AudioTableData.AudioToUITableData GetAudioToUIInfo(string auid);
UniTask<AudioTableData.AudioToUIData> GetAudioClipToUISprite(string auid);
Stary.Evo.TableTextConversion.UITableData.MessageInfo GetUIInfo(string uiid);
UniTask<Sprite> 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<Stary.Evo.TableTextConversion.AudioTableData>(audiotabledata_asset);
await audioHandle.WithCancellation(_cancellationTokenSource.Token);
audioTableData = audioHandle.GetAssetObject<Stary.Evo.TableTextConversion.AudioTableData>();
var UIHandle =
YooAssets.LoadAssetAsync<Stary.Evo.TableTextConversion.UITableData>(uitabledata_asset);
await UIHandle.WithCancellation(_cancellationTokenSource.Token);
uiTableDatas = UIHandle.GetAssetObject<Stary.Evo.TableTextConversion.UITableData>();
}
/// <summary>
/// 获取音频数据
/// </summary>
/// <param name="auid"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 获取音频
/// </summary>
/// <param name="auid"></param>
/// <returns></returns>
public async UniTask<AudioClip> GetAudioClip(string auid)
{
var info=GetAudioInfo(auid);
var handle = YooAssets.LoadAssetAsync<AudioClip>(info.filename);
await handle.WithCancellation(_cancellationTokenSource.Token);
if (handle.Status == EOperationStatus.Succeed)
{
return handle.GetAssetObject<AudioClip>();
}
else
{
Debug.LogError(
$"加载音频失败,错误的id为:{auid},错误的音频名称为:{info.filename},错误的错误信息为:{handle.LastError}");
return null;
}
}
/// <summary>
/// 获取音频数据获取UI数据
/// </summary>
/// <param name="auid"></param>
/// <returns></returns>
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;
}
}
/// <summary>
/// 获取音频数据获取UI数据
/// </summary>
/// <param name="auid"></param>
/// <returns></returns>
public async UniTask<AudioToUIData> 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;
}
/// <summary>
/// 获取UI数据
/// </summary>
/// <param name="uiid"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 获取UI
/// </summary>
/// <param name="auid"></param>
/// <returns></returns>
public async UniTask<Sprite> GetUISprite(string uiid)
{
var info = GetUIInfo(uiid);
var handle = YooAssets.LoadAssetAsync<Sprite>(info.filename);
await handle.WithCancellation(_cancellationTokenSource.Token);
if (handle.Status == EOperationStatus.Succeed)
{
return handle.GetAssetObject<Sprite>();
}
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;
}
}
}