using System;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.AddressableAssets;
using Typhoon.TableTool;
namespace Typhoon.Excel2Json.Export
{
///
/// 配置表工具类
///
public class TableHelper
{
private static AllTables _allTables = null;
public static AllTables AllTables
{
get
{
if (_allTables == null)
{
if (!Application.isPlaying)
{
#if UNITY_EDITOR
//如果在非运行状态下,从AssetDatabase加载
LoadFromAssetDatabase();
#endif
}
else
{
//尝试构建
Build();
}
}
if (_allTables == null)
{
throw new Exception("TableTool未构建,请先构建!");
}
return _allTables;
}
}
///
/// 主动构建
///
public static void Build()
{
if (_allTables != null)
{
return;
}
//resource加载路径
var rescourcePath = "TableTool/allInOne";
var addressablePath = Config.Address;
if (string.IsNullOrWhiteSpace(addressablePath))
{
//使用Addressable,加载table
if (Config.LoadMode == LoadMode.Addressable)
{
switch (Config.FileType)
{
case JsonFileType.Json:
addressablePath = "Assets/Typhoon_Gen/TableTool/Export/allInOne.json";
break;
case JsonFileType.Base64:
addressablePath = "Assets/Typhoon_Gen/TableTool/Export/allInOne.bytes";
break;
default:
throw new ArgumentOutOfRangeException();
}
}
}
//判断加载方式
switch (Config.LoadMode)
{
case LoadMode.Resource:
var json = Resources.Load(rescourcePath).text;
//构建
CreateAllTable(json, Config.FileType == JsonFileType.Base64);
break;
case LoadMode.Addressable:
throw new Exception("Addressable模式下请调用异步方法:BuildAsync()主动构建");
default:
throw new ArgumentOutOfRangeException();
}
}
public static async Task BuildAsync()
{
if (_allTables != null)
{
return;
}
var rescourcePath = "TableTool/allInOne";
var addressablePath = Config.Address;
if (string.IsNullOrWhiteSpace(addressablePath))
{
//使用Addressable,加载table
if (Config.LoadMode == LoadMode.Addressable)
{
switch (Config.FileType)
{
case JsonFileType.Json:
addressablePath = "Assets/Typhoon_Gen/TableTool/Export/allInOne.json";
break;
case JsonFileType.Base64:
addressablePath = "Assets/Typhoon_Gen/TableTool/Export/allInOne.bytes";
break;
default:
throw new ArgumentOutOfRangeException();
}
}
}
//判断加载方式
switch (Config.LoadMode)
{
case LoadMode.Resource:
{
var request = Resources.LoadAsync(rescourcePath);
while (true)
{
await Task.Yield();
if (request.isDone)
{
var json = (request.asset as TextAsset).text;
//构建
CreateAllTable(json, Config.FileType == JsonFileType.Base64);
break;
}
}
}
break;
case LoadMode.Addressable:
{
var result = await Addressables.LoadAssetAsync(addressablePath).Task;
var json = result.text;
CreateAllTable(json, Config.FileType == JsonFileType.Base64);
}
break;
default:
throw new ArgumentOutOfRangeException();
}
}
//创建AllTable实例
public static void CreateAllTable(string json, bool base64)
{
if (base64)
{
var bytes = Convert.FromBase64String(json);
var data = Encoding.UTF8.GetString(bytes);
_allTables = AllTables.Build(data);
}
else
{
_allTables = AllTables.Build(json);
}
}
///
/// 从AssetDatabase加载
///
private static void LoadFromAssetDatabase()
{
#if UNITY_EDITOR
string path = $"Assets/Typhoon_Gen/TableTool/Export";
switch (Config.LoadMode)
{
case LoadMode.Resource:
path += "/Resources/TableTool";
break;
}
switch (Config.FileType)
{
case JsonFileType.Json:
path += "/allInOne.json";
break;
case JsonFileType.Base64:
path += "/allInOne.bytes";
break;
}
try
{
var json = UnityEditor.AssetDatabase.LoadAssetAtPath(path).text;
CreateAllTable(json, Config.FileType == JsonFileType.Base64);
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
#endif
}
}
}