using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading;
using Excel2Json;
using Fort23.Core;
using Fort23.GameData;
using Utility;
#if !COMBAT_SERVER
using UnityEditor;
using UnityEngine;
#endif
namespace Fort23.UTool
{
///
/// 配置表组件
///
public class ConfigComponent : Singleton
{
private Dictionary _allConfigHolders = new Dictionary();
#if COMBAT_SERVER
private bool init;
public void SetConfig(Dictionary allConfigHolders)
{
if (init)
{
return;
}
init = true;
_allConfigHolders.Clear();
_allConfigHolders = allConfigHolders;
}
public override void Dispose()
{
_allConfigHolders.Clear();
base.Dispose();
}
#endif
#if !COMBAT_SERVER
#if UNITY_EDITOR
///
/// 预先加载所有配置文件
///
/// 登录的时候只加载指定列表里面的数据,这样可以减少加载时间
public void EditorPreload(bool isLogin = false)
{
_allConfigHolders.Clear();
ConfigHolder configHolder = null;
Assembly gameDataAssembly = EventSystem.Instance.GetAssembly("Fort23.GameData.dll");
if (gameDataAssembly == null)
{
LogTool.Error("Fort23.GameData资源加载失败");
return;
}
CTaskAwaitBuffer cTaskAwaitBuffer = new CTaskAwaitBuffer();
foreach (Type type in gameDataAssembly.GetTypes())
{
object[] attrs = type.GetCustomAttributes(typeof(ConfigAttribute), false);
if (attrs.Length == 0)
{
continue;
}
try
{
ConfigAttribute configAttribute =
type.GetCustomAttribute(typeof(ConfigAttribute)) as ConfigAttribute;
if (configAttribute != null)
{
TextAsset ta =
AssetDatabase.LoadAssetAtPath(@"Assets\Res\Config\" + configAttribute.prefab);
configHolder = JsonHelper.FromJson(ta.text, type) as ConfigHolder;
if (configHolder != null)
{
configHolder.Init();
_allConfigHolders[configHolder.ConfigType] = configHolder;
}
else
{
LogTool.Error($"JSON转{type.Name}失败!");
}
}
else
{
LogTool.Error($"配置文件类{type.Name}没有添加ConfigAttribute!");
}
}
catch (Exception e)
{
LogTool.Error("导表错误" + type);
LogTool.Exception(e);
}
}
LogTool.Log("所有配置文件初始化完成");
}
#endif
///
/// 预先加载所有配置文件
///
/// 登录的时候只加载指定列表里面的数据,这样可以减少加载时间
public async CTask Preload()
{
_allConfigHolders.Clear();
ConfigHolder configHolder = null;
Assembly gameDataAssembly = EventSystem.Instance.GetAssembly("Fort23.GameData.dll");
if (gameDataAssembly == null)
{
LogTool.Error("Fort23.GameData资源加载失败");
return;
}
CTaskAwaitBuffer cTaskAwaitBuffer = new CTaskAwaitBuffer();
foreach (Type type in gameDataAssembly.GetTypes())
{
object[] attrs = type.GetCustomAttributes(typeof(ConfigAttribute), false);
if (attrs.Length == 0)
{
continue;
}
try
{
ConfigAttribute configAttribute = type.GetCustomAttribute(typeof(ConfigAttribute)) as ConfigAttribute;
if (configAttribute != null)
{
CTask cTask = AssetBundleLoadManager.Instance.LoadAssetAsyncTask(configAttribute.prefab, callBack: delegate(AssetHandle json)
{
if (json == null)
{
LogTool.Error("加载配置表错误"+configAttribute.prefab);
return;
}
configHolder = JsonHelper.FromJson(json.AssetObject().text, type) as ConfigHolder;
json.Release();
// TODO 验证服预留
try
{
if (configHolder != null)
{
configHolder.Init();
_allConfigHolders[configHolder.ConfigType] = configHolder;
}
else
{
LogTool.Error($"JSON转{type.Name}失败!");
}
}
catch (Exception e)
{
LogTool.Error(e);
LogTool.Error($"JSON转{type.Name}失败!");
}
#if !COMBAT_SERVER
});
cTaskAwaitBuffer.AddTask(cTask);
#endif
}
else
{
LogTool.Error($"配置文件类{type.Name}没有添加ConfigAttribute!");
}
}
catch (Exception e)
{
LogTool.Error("导表错误"+type);
LogTool.Exception(e);
}
}
await cTaskAwaitBuffer.WaitAll();
// tasks.Dispose();
LogTool.Log("所有配置文件初始化完成");
}
#endif
public T Get(int ID) where T : struct, IConfig
{
ConfigHolder configHolder;
if (!_allConfigHolders.TryGetValue(typeof(T), out configHolder))
{
LogTool.Exception(new Exception($"ConfigComponent not found key: {typeof(T).FullName}"));
return default;
}
IConfig iconfig = configHolder.TryGet(ID);
return iconfig is T ? (T)iconfig : default;
}
public T[] GetAll() where T : struct, IConfig
{
ConfigHolder configHolder;
if (!_allConfigHolders.TryGetValue(typeof(T), out configHolder))
{
throw new Exception($"ConfigComponent not found key: {typeof(T).FullName}");
}
List lists = configHolder.GetAll();
T[] configs = new T[configHolder.GetAll().Count];
for (int i = 0; i < configs.Length; i++)
{
IConfig iconfig = lists[i];
configs[i] = iconfig is T ? (T)iconfig : default;
}
return configs;
}
}
}