Unity 处理策划的 Excel

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

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

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

   

   比如下面的这张表

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

 

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

Vo 类

 1     public class HeroVo
 2     {
 3         public int heroId;
 4 
 5         public string heroName;///武将名称
 6 
 7         //public int heroStar;///品质
 8         public int bingZhongId;///职业
 9 
10         public string heroIcon;///icon(头像)
11 
12         public string heroFace;///face(形象)
13 
14         public string heroDescription;///描述
15 
16         public float hp;
17 
18         public float grownHp;
19 
20         public float attack;
21 
22         public float grownAttack;
23 
24         public float defense;
25 
26         public float grownDefense;
27 
28         public float luckRate; /// 暴击率
29 
30         public float missRate;///闪避
31 
32         public int skill1_Id;
33 
34         public int skill2_Id;
35 
36         public HeroVo (Dictionary<string,string> paramters)
37         {
38             FieldInfo[] fields = this.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
39 
40             foreach (var item in paramters.Keys)
41             {
42                 FieldInfo[] curfields =  fields.Where(t => t.Name == item).ToArray();
43                 
44                 if (curfields != null && curfields.Length == 1)
45                 {
46                     //Debug.Log("key:" + item + "value:" + paramters[item]);
47 
48                     FieldInfo curField = curfields[0];
49 
50                     if (curField.FieldType == typeof(int))
51                     {
52                         curField.SetValue(this, int.Parse(paramters[item]));
53                     }
54                     else if (curField.FieldType == typeof(string))
55                     {
56                         curField.SetValue(this, paramters[item]);
57                     }
58                     else if (curField.FieldType == typeof(float))
59                     {
60                         curField.SetValue(this, float.Parse(paramters[item]));
61                     }
62                 }
63             }
64         }
65 
66 
67         public override string ToString()
68         {
69             StringBuilder builder = new StringBuilder();
70 
71             FieldInfo[] fields = this.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
72             foreach (var item in fields)
73             {
74                 builder.Append(" " + item.Name + " : " + item.GetValue(this) + " ");
75             }
76 
77             return builder.ToString();
78         }
79     }

 

Vo 类集合解析

 1 public class StaticHeroDataPool
 2 {
 3     public static string ResourceDataPath = "battle/Data/Hero/StaticHeroDataModel";
 4 
 5     public List<HeroVo> heros = new List<HeroVo>();
 6 
 7     static StaticHeroDataPool _instatnce = null;
 8     public static StaticHeroDataPool Instatnce
 9     {
10         get
11         {
12             if (_instatnce == null)
13             {
14                 _instatnce = new StaticHeroDataPool();
15 
16                 _instatnce.AddData(LoadData(ResourceDataPath));
17             }
18             return _instatnce;
19         }
20     }
21 
22     private static string[] LoadData(string loadUrl)
23     {
24         TextAsset binAsset = Resources.Load(loadUrl, typeof(TextAsset)) as TextAsset;
25         
26         string[] lineArray = binAsset.text.Split("\n"[0]);
27       
28         /// 去掉最后一空行
29         int length = lineArray.Length;
30         string[] newlineArray = lineArray.Where((t, index) => (index < length - 1)).ToArray();
31 
32         return newlineArray;
33     }
34 
35     private void AddData(string[] lineArray)
36     {
37         string[] fieldNames = lineArray[0].Replace("\r", "").Split(";"[0]);
38 
39         for (int i = 1; i < lineArray.Length; i++)
40         {
41             string[] Values = lineArray[i].Replace("\r", "").Split(";"[0]);
42 
43             Dictionary<string, string> paramters = new Dictionary<string, string>();
44             for (int j = 0; j < fieldNames.Length; j++)
45             {
46                 paramters.Add(fieldNames[j], Values[j]);
47             }
48 
49             HeroVo heroVo = new HeroVo(paramters);
50             heros.Add(heroVo);
51         }
52     }
53 }

 

posted @ 2015-04-24 18:53  灵魂重新  阅读(1806)  评论(0编辑  收藏  举报