首先是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!感谢大家的观看!祝大家越来越好!感谢观赏!