Unity读写Excel表格及 C#反射的简单理解。

这个应该属于撸一个适合自己的小游戏框架的第四篇。上一篇是关于Unity中的C#构造函数与this关键词的使用。
这里在写游戏配置表的功能的时候遇到的问题。感觉很简单的逻辑写了很长的时间,等下再吐槽吧。

关于读写Excel表格
游戏配数据有很多种,这里写excel呢,是因为我这个略微熟悉一些。
关于Excel读取。读取网上有很多方法,都能达到效果。不再赘述。
吐槽一点:几乎所有的教程都告诉你要用到Excel.dll,ICSharpCode.SharpZipLib.dll,System.Data.dll这三个库,但如果你只是读Excel的话Excel.dll,System.Data.dll这两个库就可以了。ICSharpCode.SharpZipLib.dll这个库应该是用来压缩和解压文件的。不知道为啥非要加这个库。可能抄比较省力把。
写Excel文件。 需要EPPlus.dll 这个库。
写也很简单。也不赘述。
这里关于配数据这块只说一下我的思路和解决途径。
1:解决文件格式问题。快速配置表格。
解决: 通过C#对应的脚本自动生成默认Excel文件。然后直接在这个表格里填入数据。这样就可以避免格式问题,也不需要手动去按规则写对应的表格了。
3:支持1对1的数据和1对多的数据。
解决:写了两个格式的数据。1对1,和1对list。

关于反射
这个先吐槽把,看了很多教程和相关资料,都是抄来抄去,这个真的烦。翻来覆去都都是一样的还跟我的需求不匹配,CTMD。

我的需求是通过一个字符串,来实现一个下面这个实例化一个组的操作。

public class AllConfigInfo: ScriptableObject
{
    public TestDicExcel[] TestDicExcel;
}

public class TestExcel1`在这里插入代码片`
{   
}

AllConfigInfo.TestDicExcel = new TestDicExcel[dic.Count];

就是我现在只知道一个字符串“TestExcel1”和一个类AllConfigInfo,想要实现这个方法的AllConfigInfo.TestDicExcel = new TestDicExcel[dic.Count];效果。
看网上的教程都是反射实现之类的样子,然后试了几种方法,都不能实现,(最后只能换成了另外一种方法,题外话。)
下面回到反射,是我看了很多教程整理出来的新手可能需要用的方法。
1:通过名字获取类以及该类中的属性,当然获取到了也可以操作,自己可以试试;

    public void GetClassAttribute(string prefabName)
    {
        //通过名称获取到一个类
        Type tempClass = Assembly.Load("Assembly-CSharp").GetType(prefabName);
        //获取到这个类中的所有属性
        FieldInfo[] fields = tempClass.GetFields();
        foreach (var item in fields)
        {
            Debug.LogError(item.Name);
        }
    }

2:通过类名以及方法名的字符串来获得方法并执行。

 public static void AutoReadExcelInfo()
    {
       //AllReadExcel为一个类名
        Type t = typeof(AllReadExcel);
        //根据string获得对应的方法
        // MethodInfo mts = t.GetMethod("String", BindingFlags.Public | BindingFlags.Static);
        //执行该方法,第一个参数是static类型可以填Null,不是的话需要填对应的实例化对象obj 
        // object obj = Activator.CreateInstance(t);
        //第二个参数可以传方法对应的参数。
        //mts.Invoke(null, null);
        MethodInfo[] mt = t.GetMethods(BindingFlags.Public | BindingFlags.Static);
        if (mt != null)
        {
            for (int i = 0; i < mt.Length; i++)
            {
                Debug.LogError(mt[i].Name);
                mt[i].Invoke(null, null);
            }
        }
    }

问题:我知道类名直接点出来不就完了,还用这么麻烦的方法干嘛?
答:我也不知道,我以前也这么认为的,直到我需要用到这种方法的时候才…
正经的讲,我是为了提高效率,因为我之前读表格
1:需要先写C#的类。
2:然后再根据这个类创建表格。
3:然后再写读这个表格的方法。即便读表格的方法都差不多。但类名和对应的属性名是不同的。你只能写一个对应的方法来读取这种类型的表格,但具体读哪个还得传另外一些参数,比如,类型,属性名等等。
但是通过这种操作的话我可以一键生成默认的Excel表格。填完表格可以一键读取表格和生成对应的数据而不需要进行额外的操作。
比如最后的那个方法。我想要执行那个脚本中的所有方法。按道理讲我可以通过类名点出来所有方法并执行。那如果有几百和上千的方法呢?

以上。

发布了27 篇原创文章 · 获赞 26 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_39860954/article/details/104055879