读取文件并解析 是项目里常用到的,如果需要多次读取不同的表格,我们就可以使用下面封装的方式来处理。
脚本是主程封装好的,我只是搬运工~~
为了方便测试,需要按照我教给大家的步骤进行操作。
第一步 将“脚本一”和“脚本二”、“脚本三” 放到项目里,目录可以自己定
第二步 将“InstallError.txt”文件放在项目的Resources/Table目录下
第三步 将“脚本四” 挂载到摄像机,然后运行。
脚本一:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Reflection; /// <summary> /// 子类可以添加Init方法进行初始化 /// </summary> public interface ITableItem { int Key(); } public interface ITableManager { string TableName(); object TableData { get; } } public abstract class TableManager<T, U> : ITableManager where T : ITableItem { // abstract functions need tobe implements. public abstract string TableName(); public object TableData { get { return mItemArray; } } // the data arrays. T[] mItemArray; Dictionary<int, int> mKeyItemMap; // constructor. protected TableManager() { // load from excel txt file. mItemArray = TableManagerHelper.ParseTable<T>(TableName()); // build the key-value map. mKeyItemMap = new Dictionary<int, int>(); TableManagerHelper.InitItemMap(mKeyItemMap, mItemArray); } // get a item base the key. public T GetItem(int key) { int itemIndex; if (mKeyItemMap.TryGetValue(key, out itemIndex)) return mItemArray[itemIndex]; return default(T); } // get the item array. public T[] GetAllItem() { return mItemArray; } } public class TableManagerHelper { static public T[] ParseTable<T>(string tableName) { T[] items = TableParser.Parse<T>(tableName); Type type = typeof(T); var method = type.GetMethod("Init", BindingFlags.Instance | BindingFlags.NonPublic); if (method != null) { for (int i = 0; i < items.Length; i++) { method.Invoke(items[i], null); } } return items; } static public void InitItemMap<T>(Dictionary<int, int> dict, T[] items) where T : ITableItem { for (int i = 0; i < items.Length; i++) dict[items[i].Key()] = i; } } |
脚本二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
using System; using System.Collections.Generic; using System.Reflection; using UnityEngine; public static class TableParser { static void ParsePropertyValue<T>(T obj, FieldInfo fieldInfo, string valueStr) { System.Object value = valueStr; if (fieldInfo.FieldType.IsEnum) value = Enum.Parse(fieldInfo.FieldType, valueStr); else { if (fieldInfo.FieldType == typeof(int)) value = int.Parse(valueStr); else if (fieldInfo.FieldType == typeof(byte)) value = byte.Parse(valueStr); else if (fieldInfo.FieldType == typeof(short)) value = short.Parse(valueStr); else if (fieldInfo.FieldType == typeof(float)) value = float.Parse(valueStr); else if (fieldInfo.FieldType == typeof(double)) value = double.Parse(valueStr); else { if (valueStr.Contains("\"\"")) valueStr = valueStr.Replace("\"\"", "\""); if (valueStr.Length > 2 && valueStr[0] == '\"' && valueStr[valueStr.Length - 1] == '\"') valueStr = valueStr.Substring(1, valueStr.Length - 2); value = valueStr; } } if (value == null) return; fieldInfo.SetValue(obj, value); } static T ParseObject<T>(string[] lines, int idx, Dictionary<int, FieldInfo> propertyInfos) { T obj = Activator.CreateInstance<T>(); string line = lines[idx]; string[] values = line.Split('\t'); foreach (KeyValuePair<int, FieldInfo> pair in propertyInfos) { if (pair.Key >= values.Length) continue; string value = values[pair.Key]; if (string.IsNullOrEmpty(value)) continue; try { ParsePropertyValue(obj, pair.Value, value); } catch (Exception ex) { Debug.LogError(string.Format("ParseError: Row={0} Column={1} Name={2} Want={3} Get={4}", idx + 1, pair.Key + 1, pair.Value.Name, pair.Value.FieldType.Name, value)); throw ex; } } return obj; } static Dictionary<int, FieldInfo> GetPropertyInfos<T>(string memberLine) { Type objType = typeof(T); string[] members = memberLine.Split("\t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); Dictionary<int, FieldInfo> propertyInfos = new Dictionary<int, FieldInfo>(); for (int i = 0; i < members.Length; i++) { FieldInfo fieldInfo = objType.GetField(members[i]); if (fieldInfo == null) continue; propertyInfos[i] = fieldInfo; } return propertyInfos; } public static T[] Parse<T>(string name) { TextAsset textAsset = Resources.Load("Table/" + name) as TextAsset; // 这里指定表格文本文件的所在位置 if (textAsset == null) { Debug.LogError("无法加载表格文件:" + name); return null; } // try parse the table lines. string[] lines = textAsset.text.Split("\n\r".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); if (lines.Length < 2) { Debug.LogError("表格文件行数错误,【1】属性名称【2】变量名称【3-...】值:" + name); return null; } // fetch all of the field infos. Dictionary<int, FieldInfo> propertyInfos = GetPropertyInfos<T>(lines[1]); // parse it one by one. T[] array = new T[lines.Length - 2]; for (int i = 0; i < lines.Length - 2; i++) array[i] = ParseObject<T>(lines, i + 2, propertyInfos); return array; } } |
InstallError.txt文件内容如下
这是我用到的表,是以Tab进行空行分隔的。注意表前两行分别为 描述和 键值。一定要留着哈。
1 2 3 4 5 6 7 |
安装失败原因列表 失败描述 是否需要删除安装包 提示内容 error_code error_des delete msg INSTALL_FAILED_ALREADY_EXISTS 应用已存在 0 您已经安装过该应用。 INSTALL_FAILED_INVALID_APK 无效的APK 1 安装包无效。 INSTALL_FAILED_INVALID_URI 无效的链接 1 您的设备缺乏必要的支持库来运行游戏。 INSTALL_FAILED_INSUFFICIENT_STORAGE 没有足够的存储空间 0 您的设备没有足够的储存空间,请尝试清理后再试。 INSTALL_FAILED_DUPLICATE_PACKAGE 已存在同名程序 0 您已经安装过该应用。 |
脚本三:
下面这个脚本,就是我们自己的文件(在这里我用的是InstallError.txt)的数据类。已经写好注释了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
using System; using System.Collections.Generic; /// <summary> /// 该类 定义的变量是文本里 对应的 "error_code error_des delete msg" 这些内容。除此之外 还要指定Key方法 /// </summary> public class InstallErrorTable : ITableItem { public string error_code; public int delete; public string msg; public int Key() // 如果key为string类型,则 使用其HashCode 作为key { return error_code.GetHashCode(); } } /// <summary> /// 该类 为外部调用类,单例类。 可以通过该类获取表里的内容 /// </summary> public class InstallError : TableManager<InstallErrorTable, InstallError> { private static InstallError instance; public static InstallError Instance { get { if (instance == null) { instance = new InstallError(); } return instance; } } /// <summary> /// 如果key为string类型,则 使用其HashCode 作为key /// </summary> public InstallErrorTable GetItem(string key) { return GetItem(key.GetHashCode()); } /// <summary> /// 执行表的名称 是在Table目录下的文件名称 /// </summary> /// <returns></returns> public override string TableName() { return "InstallError"; } } |
脚本四:
以上工作准备好,就可以运行测试一下啦。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using UnityEngine; using System.Collections; public class Test : MonoBehaviour { // Use this for initialization void Start () { InstallErrorTable error = InstallError.Instance.GetItem("INSTALL_FAILED_ALREADY_EXISTS"); InstallErrorTable[] errors = InstallError.Instance.GetAllItem(); Debug.Log(error.msg); } } |
项目文件下载链接: https://pan.baidu.com/s/1dE79rpf 密码: cb41
不懂得同学可以评论问我,希望对大家有帮助。
- 本文固定链接: http://www.u3d8.com/?p=877
- 转载请注明: 网虫虫 在 u3d8.com 发表过