using System.Collections.Generic;  
 | 
using UnityEngine;  
 | 
using Cysharp.Threading.Tasks;  
 | 
using System.IO;  
 | 
using System;  
 | 
  
 | 
  
 | 
public class ConfigBase<U, T> where T : ConfigBase<U, T>, new()  
 | 
{  
 | 
    public static Dictionary<U, T> dic = new Dictionary<U, T>();  
 | 
  
 | 
    public static bool isInit = false;  
 | 
  
 | 
    public static T Get(U id)  
 | 
    {  
 | 
        if (!isInit)  
 | 
        {  
 | 
            Debug.LogError("ConfigBase 没有初始化");  
 | 
            return null; // 或者抛出异常,视情况而定  
 | 
        }  
 | 
  
 | 
        if (dic.ContainsKey(id))  
 | 
        {  
 | 
            return dic[id];  
 | 
        }  
 | 
  
 | 
        return null;  
 | 
    }  
 | 
  
 | 
    public List<T> GetValues()  
 | 
    {  
 | 
        if (!isInit)  
 | 
        {  
 | 
            Debug.LogError(typeof(T).Name + " 没有初始化 GetValues");  
 | 
            return null; // 或者抛出异常,视情况而定  
 | 
        }  
 | 
        List<T> result = new List<T>();  
 | 
        result.AddRange(dic.Values);  
 | 
        return result;  
 | 
    }  
 | 
  
 | 
    public static bool HasKey(U key)  
 | 
    {  
 | 
        if (!isInit)  
 | 
        {  
 | 
            Debug.LogError(typeof(T).Name + " 没有初始化 HasKey");  
 | 
            return false; // 或者抛出异常,视情况而定  
 | 
        }  
 | 
  
 | 
        return dic.ContainsKey(key);  
 | 
    }  
 | 
  
 | 
    public static void Init(string[] lines)  
 | 
    {  
 | 
        dic.Clear();  
 | 
          
 | 
        Dictionary<string, string> rawDatas = new Dictionary<string, string>();  
 | 
  
 | 
        for (int i = 3; i < lines.Length; i++)  
 | 
        {  
 | 
            string line = lines[i];  
 | 
            var index = line.IndexOf("\t");  
 | 
            if (index == -1)  
 | 
            {  
 | 
                continue;  
 | 
            }  
 | 
  
 | 
            string strKey = line.Substring(0, index);  
 | 
            T config = new T();  
 | 
            U key = config.LoadKey(strKey);  
 | 
            config.LoadConfig(line);  
 | 
            #if UNITY_EDITOR  
 | 
            try  
 | 
            {  
 | 
            #endif  
 | 
            dic.Add(key, config);  
 | 
            #if UNITY_EDITOR  
 | 
            }  
 | 
            catch (ArgumentException exception)  
 | 
            {  
 | 
                Debug.LogError(typeof(T).Name  + " 重复的key " + key + " " + exception.Message);  
 | 
            }  
 | 
            #endif  
 | 
              
 | 
        }  
 | 
  
 | 
        isInit = true;  
 | 
    }  
 | 
  
 | 
    public virtual U LoadKey(string line)  
 | 
    {  
 | 
        return default(U);  
 | 
    }  
 | 
  
 | 
    public virtual void LoadConfig(string line)  
 | 
    {  
 | 
          
 | 
    }  
 | 
      
 | 
    protected int ParseInt(string str)  
 | 
    {  
 | 
        int result = 0;  
 | 
        int.TryParse(str, out result);  
 | 
        return result;  
 | 
    }  
 | 
  
 | 
    protected float ParseFloat(string str)  
 | 
    {  
 | 
        float result = 0f;  
 | 
        float.TryParse(str, out result);  
 | 
        return result;  
 | 
    }  
 | 
  
 | 
    protected string[] Split(string str, char split)  
 | 
    {  
 | 
        return str.Split(split);  
 | 
    }  
 | 
  
 | 
    protected List<string> ParseStrList(string str, char split)  
 | 
    {  
 | 
        List<string> result = new List<string>();  
 | 
        string[] strs = Split(str, split);  
 | 
        for (int i = 0; i < strs.Length; i++)  
 | 
        {  
 | 
            result.Add(strs[i]);  
 | 
        }  
 | 
  
 | 
        return result;  
 | 
    }  
 | 
  
 | 
    protected List<int> ParseIntList(string str, char split)  
 | 
    {  
 | 
        List<int> result = new List<int>();  
 | 
        string[] strs = Split(str, split);  
 | 
        for (int i = 0; i < strs.Length; i++)  
 | 
        {  
 | 
            result.Add(ParseInt(strs[i]));  
 | 
        }  
 | 
        return result;  
 | 
    }  
 | 
  
 | 
    protected U GetKey(string key)  
 | 
    {  
 | 
        if (typeof(U) == typeof(string))  
 | 
        {  
 | 
            return (U)(object)key;  
 | 
        }  
 | 
        else if (typeof(U) == typeof(int))  
 | 
        {  
 | 
            return (U)(object)ParseInt(key);  
 | 
        }  
 | 
        else  
 | 
        {  
 | 
            Debug.LogError("GetKey 意外的key类型 类型错误 " + typeof(U).Name);  
 | 
            return default(U);  
 | 
        }  
 | 
    }  
 | 
} 
 |