Unity 处理策划的 Excel

时间:2023-03-08 23:46:25
Unity 处理策划的 Excel

很多时候我们需要使用策划的Excel表来做游戏的静态数据配置, 而不是采用自己定义的xml或者U3D的scriptobject。

因为很多数据都是策划处理的,而策划最喜欢的就是excel,也只会用这个。如果不用excel,意味着数据需要你自己输入,纯属浪费时间。

所以很多时间我们和策划约定好VO类的字段,直接从Excel映射出VO类。

比如下面的这张表

Unity 处理策划的 Excel

另存为.csv 然后转换为.txt 注意编码都改为UTF-8

Unity 处理策划的 Excel

Unity 处理策划的 Excel

做好配置文件后,VO类映射就可以了,举个例子:

Vo 类

     public class HeroVo
{
public int heroId; public string heroName;///武将名称 //public int heroStar;///品质
public int bingZhongId;///职业 public string heroIcon;///icon(头像) public string heroFace;///face(形象) public string heroDescription;///描述 public float hp; public float grownHp; public float attack; public float grownAttack; public float defense; public float grownDefense; public float luckRate; /// 暴击率 public float missRate;///闪避 public int skill1_Id; public int skill2_Id; public HeroVo (Dictionary<string,string> paramters)
{
FieldInfo[] fields = this.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance); foreach (var item in paramters.Keys)
{
FieldInfo[] curfields = fields.Where(t => t.Name == item).ToArray(); if (curfields != null && curfields.Length == )
{
//Debug.Log("key:" + item + "value:" + paramters[item]); FieldInfo curField = curfields[]; if (curField.FieldType == typeof(int))
{
curField.SetValue(this, int.Parse(paramters[item]));
}
else if (curField.FieldType == typeof(string))
{
curField.SetValue(this, paramters[item]);
}
else if (curField.FieldType == typeof(float))
{
curField.SetValue(this, float.Parse(paramters[item]));
}
}
}
} public override string ToString()
{
StringBuilder builder = new StringBuilder(); FieldInfo[] fields = this.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
foreach (var item in fields)
{
builder.Append(" " + item.Name + " : " + item.GetValue(this) + " ");
} return builder.ToString();
}
}

Vo 类集合解析

 public class StaticHeroDataPool
{
public static string ResourceDataPath = "battle/Data/Hero/StaticHeroDataModel"; public List<HeroVo> heros = new List<HeroVo>(); static StaticHeroDataPool _instatnce = null;
public static StaticHeroDataPool Instatnce
{
get
{
if (_instatnce == null)
{
_instatnce = new StaticHeroDataPool(); _instatnce.AddData(LoadData(ResourceDataPath));
}
return _instatnce;
}
} private static string[] LoadData(string loadUrl)
{
TextAsset binAsset = Resources.Load(loadUrl, typeof(TextAsset)) as TextAsset; string[] lineArray = binAsset.text.Split("\n"[]); /// 去掉最后一空行
int length = lineArray.Length;
string[] newlineArray = lineArray.Where((t, index) => (index < length - )).ToArray(); return newlineArray;
} private void AddData(string[] lineArray)
{
string[] fieldNames = lineArray[].Replace("\r", "").Split(";"[]); for (int i = ; i < lineArray.Length; i++)
{
string[] Values = lineArray[i].Replace("\r", "").Split(";"[]); Dictionary<string, string> paramters = new Dictionary<string, string>();
for (int j = ; j < fieldNames.Length; j++)
{
paramters.Add(fieldNames[j], Values[j]);
} HeroVo heroVo = new HeroVo(paramters);
heros.Add(heroVo);
}
}
}