Unity一键配置参数文件Game Config

首先是GameConfigEditor脚本,用于实现按下配置按钮来实现自动生产GameConfig脚本中的部分代码,

using UnityEngine;
using UnityEditor;
using System.IO;
public class GameConfigEditor
{
    [MenuItem("配置/解析GameConfig", false, 1)]
    static void AnalysisExcel()
    {
        string excelPath = Application.dataPath + "/Config/PropertyConfig.txt";
        if (!File.Exists(excelPath))
        {
            Debug.LogError(excelPath + "目录下没有对应文件");
            return;
        }
        string allText = File.ReadAllText(excelPath);
        if (allText == null || allText.Length == 0) return;
        string[] lines = allText.Split("\n");

        string defineStr = "", codeStr = "";
        //遍历每一行 第一行的信息不读取
        for (int i = 1; i < lines.Length; i++)
        {
            if (!string.IsNullOrEmpty(lines[i]))
            {
                string[] cell = lines[i].Split(',');
                if (cell.Length == 4)
                {
                    string describe = cell[0].Trim();
                    string name = cell[1].Trim();
                    string type = cell[2].Trim();
                    string value = cell[3].Trim();

                    defineStr += $"\n    /// <summary>";
                    defineStr += $"\n    /// {describe}";
                    defineStr += $"\n    /// <summary>";
                    defineStr += $"\n    [LabelText(\"{describe}\")]";
                    defineStr += $"\n    public {type} {name};";

                    //string/int/float/bool/int[]/float[]/string[]/List<int>/List<float>/List<string>
                    //List<int[]>/List<float[]>/List<string[]>/
                    switch (type)
                    {
                        case "string":
                            codeStr += $"\n        {name} = \"{value}\";";
                            break;
                        case "int":
                            codeStr += $"\n        {name} = ToInt(\"{value}\");";
                            break;
                        case "float":
                            codeStr += $"\n        {name} = ToFloat(\"{value}\");";
                            break;
                        case "bool":
                            codeStr += $"\n        {name} = ToBool(\"{value}\");";
                            break;
                        case "int[]":
                            codeStr += $"\n        {name} = ToIntArray(\"{value}\");";
                            break;
                        case "float[]":
                            codeStr += $"\n        {name} = ToFloatArray(\"{value}\");";
                            break;
                        case "string[]":
                            codeStr += $"\n        {name} = ToStringArray(\"{value}\");";
                            break;
                        case "List<int>":
                            codeStr += $"\n        {name} = ToIntList(\"{value}\");";
                            break;
                        case "List<float>":
                            codeStr += $"\n        {name} = ToFloatList(\"{value}\");";
                            break;
                        case "List<string>":
                            codeStr += $"\n        {name} = ToStringList(\"{value}\");";
                            break;
                        case "List<int[]>":
                            codeStr += $"\n        {name} = ToIntListArray(\"{value}\");";
                            break;
                        case "List<float[]>":
                            codeStr += $"\n        {name} = ToFloatListArray(\"{value}\");";
                            break;
                        case "List<string[]>":
                            codeStr += $"\n        {name} = ToStringListArray(\"{value}\");";
                            break;
                        default:break;
                    }
                    if (i == lines.Length - 1)
                    {
                        defineStr += $"\n";
                        codeStr += $"\n";
                    }
                }
            }
        }

        {
            string configPath = Path.Combine(Application.dataPath, "Config/GameConfig.cs");
            if (!File.Exists(configPath))
            {
                Debug.LogError("GameConfig.cs文件不存在!");
            }
            string originText=File.ReadAllText(configPath);
            string firstModule = "", secondModule = "";
            {
                string startDefineStr = "    //Property-start";
                string endDefineStr = "    //Property-end";
                var startIndex = originText.IndexOf(startDefineStr) + startDefineStr.Length;
                var endIndex=originText.IndexOf(endDefineStr);
                //先把//Property-start与//Property-end的内容删除
                firstModule=originText.Remove(startIndex, endIndex-startIndex);
                //在Property-end之前插入defineStr
                endIndex = firstModule.IndexOf(endDefineStr);
                firstModule = firstModule.Insert(endIndex, defineStr);
            }

            {
                string startInitStr = "        //InitPropertyData-start";
                string endInitStr = "        //InitPropertyData-end";
                var startIndex = firstModule.IndexOf(startInitStr) + startInitStr.Length;
                var endIndex = firstModule.IndexOf(endInitStr);
                //先把//Property-start与//Property-end的内容删除
                secondModule = firstModule.Remove(startIndex, endIndex - startIndex);
                //在Property-end之前插入defineStr
                endIndex = secondModule.IndexOf(endInitStr);
                secondModule = secondModule.Insert(endIndex, codeStr);
            }
            File.WriteAllText(configPath,secondModule);
            AssetDatabase.Refresh();
        }
    }
}

随后是利用Excel创建表格,第一行的内容不会进行解析,可以自己在第一行写一些备注内容,从第二行开始,第一个单元格填写某字段的描述,这里利用了Odin组件的LabelText来显示某段代码的描述,第二个单元格填写该参数的变量名,第三个单元格填写该参数的类型,包括//string/int/float/bool/int[]/float[]/string[]/List<int>/List<float>/List<string>//List<int[]>/List<float[]>/List<string[]>/等类型,第四个单元格填写该参数的value值,如果是数组就利用|符号分割,如果是类似List<int[]>这种类型的参数,就使用#与|去分隔,然后接下来的参数就以此类推,最后将该表格另存为.csv格式并且导入unity的asset目录下,目录可以根据自己的需求改。这里给一个实例.csv文件:

11111
我了个去,name,int,50
我了个去,name1,float,50
我了个去,name2,string,50
我了个去,name3,bool,1
我了个去哈,haha,string,5h哈
我了个去2,list,List<int>,1|2|6
二维数组int,ListArr,List<int[]>,1|2|6#4|7|6
一维数组,oneArr,float[],1|.2f|50

将该.csv文件导入unity后,记得改写一下GameConfigEditor里的读取excel文件的路径,默认是Asset/Config/PropertyConfig.txt。最后点击unity上方菜单栏里的配置/解析GameConfig 就会在Asset/Config/目录下找到GameConfig脚本并且自动生成一部分代码,如果没有这个GameConfig脚本记得创建一个该脚本,最后给出一个GameConfig的实例:

//using System.Collections;
//using System.Collections.Generic;
//using UnityEngine;
//using Sirenix.OdinInspector;

//public class GameConfig
//{
//    //Property-start
//    /// <summary>
//    /// 我了个去
//    /// <summary>
//    [LabelText("我了个去")]
//    public int name;
//    /// <summary>
//    /// 我了个去
//    /// <summary>
//    [LabelText("我了个去")]
//    public float name1;
//    /// <summary>
//    /// 我了个去
//    /// <summary>
//    [LabelText("我了个去")]
//    public string name2;
//    /// <summary>
//    /// 我了个去
//    /// <summary>
//    [LabelText("我了个去")]
//    public bool name3;
//    /// <summary>
//    /// 我了个去哈
//    /// <summary>
//    [LabelText("我了个去哈")]
//    public string haha;
//    /// <summary>
//    /// 我了个去2
//    /// <summary>
//    [LabelText("我了个去2")]
//    public List<int> list;
//    /// <summary>
//    /// 二维数组int
//    /// <summary>
//    [LabelText("二维数组int")]
//    public List<int[]> ListArr;
//    /// <summary>
//    /// 一维数组
//    /// <summary>
//    [LabelText("一维数组")]
//    public float[] oneArr;
//    //Property-end

//    public void InitConfigData()
//    {
//        //InitPropertyData-start
//        name = ToInt("50");
//        name1 = ToFloat("50");
//        name2 = "50";
//        name3 = ToBool("1");
//        haha = "5h哈";
//        list = ToIntList("1|2|6");
//        ListArr = ToIntListArray("1|2|6#4|7|6");
//        oneArr = ToFloatArray("1|.2f|50");
//        //InitPropertyData-end
//    }


//    #region string类型转其他类型
//    int ToInt(string value)
//    {
//        return int.Parse(value);
//    }

//    float ToFloat(string value)
//    {
//        if (value.EndsWith("f") || value.EndsWith("F"))
//            value = value.Substring(0, value.Length - 1);
//        if (float.TryParse(value, out float result)) { return result; }
//        Debug.LogError(value + "转换为float类型出错");
//        return 0f;
//    }

//    bool ToBool(string value)
//    {
//        if (value == "0" || value == "1") return value == "1";
//        return bool.Parse(value);
//    }

//    int[] ToIntArray(string value)
//    {
//        string[] cell = value.Split("|");
//        int[] result = new int[cell.Length];
//        for (int i = 0; i < cell.Length; i++)
//        {
//            result[i] = ToInt(cell[i]);
//        }
//        return result;
//    }

//    float[] ToFloatArray(string value)
//    {
//        string[] cell = value.Split("|");
//        float[] result = new float[cell.Length];
//        for (int i = 0; i < cell.Length; i++)
//        {
//            result[i] = ToFloat(cell[i]);
//        }
//        return result;
//    }

//    string[] ToStringArray(string value)
//    {
//        string[] result = value.Split("|");
//        return result;
//    }

//    List<int> ToIntList(string value)
//    {
//        List<int> result = new List<int>();
//        string[] cell = value.Split("|");
//        for (int i = 0; i < cell.Length; i++)
//        {
//            result.Add(ToInt(cell[i]));
//        }
//        return result;
//    }

//    List<float> ToFloatList(string value)
//    {
//        List<float> result = new List<float>();
//        string[] cell = value.Split("|");
//        for (int i = 0; i < cell.Length; i++)
//        {
//            result.Add(ToFloat(cell[i]));
//        }
//        return result;
//    }

//    List<string> ToStringList(string value)
//    {
//        List<string> result = new List<string>();
//        string[] cell = value.Split("|");
//        for (int i = 0; i < cell.Length; i++)
//        {
//            result.Add(cell[i]);
//        }
//        return result;
//    }

//    List<int[]> ToIntListArray(string value)
//    {
//        List<int[]> result = new List<int[]>();
//        string[] cell = value.Split("#");
//        for (int i = 0; i < cell.Length; i++)
//        {
//            result.Add(ToIntArray(cell[i]));
//        }
//        return result;
//    }

//    List<float[]> ToFloatListArray(string value)
//    {
//        List<float[]> result = new List<float[]>();
//        string[] cell = value.Split("#");
//        for (int i = 0; i < cell.Length; i++)
//        {
//            result.Add(ToFloatArray(cell[i]));
//        }
//        return result;
//    }

//    List<string[]> ToStringListArray(string value)
//    {
//        List<string[]> result = new List<string[]>();
//        string[] cell = value.Split("#");
//        for (int i = 0; i < cell.Length; i++)
//        {
//            result.Add(ToStringArray(cell[i]));
//        }
//        return result;
//    }
//    #endregion 
//}

上方的代码都是注释过的 记得拿到vs里面全选然后全部解开注释,vs快捷键ctrl+k ctrl+u 解开注释

OK!感谢大家的观看!祝大家越来越好!感谢观赏!

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值