irpas技术客

unity -- asset配置 & SQLite数据库_babywang0

网络 603

简介

将可序列化的类的数据保存为asset资源

优缺点

摘自:https://jingyan.baidu.com/article/a3f121e4abbe6afc9052bb29.html

.asset:

1)优点: 可以保存数据类型多样(int、string、Vector3、GameObject、Transform、Texture等)如关联预设,关联图片等资源数据,而XML、TXT等只能保存(int、string、Vector3等基本数据类型)。 2)缺点: 如果配置数据中保存了(GameObject、Texture)等资源数据,当关联的资源被删除时,配置数据将丢失,需要重新将新的资源再次关联到配置数据上

ScriptableObject优点:

1)把数据真正存储在了资源文件中,可以像其他资源那样管理它,例如退出运行也一样会保持修改 2)可以在项目之间很好的复用,不用再制作Prefab那样导入导出 3)在概念上有很好的fit,强迫症患者的福音

操作步骤 1. 定义可序列化的类 public class Config : ScriptableObject { public ConfigItem[] Configs; } [Serializable] public class ConfigItem { [Column(Name = "ID", DataType = "int32", DefaultValue = "0", IsPrimaryKey = true)] public int Id; [Column(Name = "Position", DataType = "float", DefaultValue = "0")] public Vector3 Pos; } //转存到Excel时使用 [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false, Inherited = false)] public sealed class ColumnAttribute : Attribute { public string Name { get; set; } public string DataType {get; set; } public string DefaultValue { get; set; } public bool IsPrimaryKey { get; set; } public ColumnAttribute() { IsPrimaryKey = false; } } 2. 创建asset public static Config CreateAsset() { //实例化配置类 Config instance = ScriptableObject.CreateInstance<Config>(); instance.Configs = new ConfigItem[0]; //生成自定义资源到自定路径 var savepath = string.Format("Assets/_Res/Config/{0}.asset",typeof(Config).ToString()); AssetDatabase.CreateAsset(instance, savepath); } 3.更改配置并保存

在保存路径中打开双击配置文件 在Inspector窗口中更改配置数据 或代码更改

var configInstance = AssetDatabase.LoadAssetAtPath<Config>(savepath); List<ConfigItem> configList = new List<ConfigItem>(); var item = new ConfigItem() { Id = 1, Pos = new Vector3(1,1,1) }; configList.Add(item); configInstance.Configs = null; configInstance.Configs = configList.ToArray(); EditorUtility.SetDirty(configInstance); AssetDatabase.SaveAssets(); 4. 保存到SQLite数据库 SQLite3.Open(databasePathAsBytes, out handle, SQLiteOpenFlags.Create | SQLiteOpenFlags.ReadWrite, IntPtr.Zero);//与SQLite数据库建立连接 /*当temp_store设置为DEFAULT (0),使用编译时的C预处理宏 TEMP_STORE来定义储存临时表和临时索引的位置。 当设置为MEMORY (2)临时表和索引存放于内存中。 当设置为FILE (1)则存放于文件中。temp_store_directory pragma 可用于指定存放该文件的目录。 当改变temp_store设置,所有已存在的临时表,索引,触发器及视图将被立即删除。*/ var sql = "PRAGMA temp_store = MEMORY" //SQLite编译指令:临时表和索引存放于内存中 /* 执行操作语句 PRAGMA */ /* 删除所有旧表 */ var fields = ConfigItem.GetFields(BindingFlags.Instance | BindingFlags.Public);//获取数据的属性列表 var colList = new List<ColumnAttribute>();//组装建表SQL时用 foreach (var field in fields) { var col = field.GetCustomAttribute<ColumnAttribute>(false); //每个属性的字段信息 colList.add(col); } string sql = $"CREATE TABLE 'asset_config' (\n'{colList[i].Name}' {colList[i].DataType} NOT NULL DEFAULT '0',\n"....;//建表SQL /* 执行操作语句 CREATE TABLE */ /* 执行操作语句 BEGIN */ var configData = AssetDatabase.LoadAssetAtPath<MapAreaConfig>(savepath); //读取配置文件 var datas = configData.Configs; List<string> rowCellList = new List<string>(); foreach (var item in datas)//每条配置 { rowCellList.Clear(); foreach (var field in fields)//每条属性 { var col = field.GetCustomAttribute<ColumnAttribute>(false); //每个属性的字段信息 //将属性值转为string类型->cell rowCellList.Add(cell); } var rowValue = string.Join(",", valueList); var Names = string.Join(",", colList.Select(col => col.ColName)); string sql = $"INSERT INTO asset_config ({Names}) VALUES({rowValue})" /* 执行操作语句 INSERT */ } /* 执行操作语句 COMMIT */ SQLite3.Close(handle);//与数据库断开连接 AssetDatabase.Refresh(); /* 删除所有旧表 */ //遍历表名 var sql = "select name from sqlite_master where type='table'"; IntPtr stmt = SQLite3.Prepare2(handle, sql); var names = new List<string>(); //表名列表 try { while (SQLite3.Step(stmt) == SQLite3.Result.Row) { names.Add(SQLite3.ColumnString(stmt, 0)); } } finally { SQLite3.Finalize(stmt); } //根据表名删除指定表 for (int i = 0, n = names.Count; i < n; i++) { var name = names[i]; var sql = $"drop table if exists {name}"; /* 执行操作语句 drop table */ } /* 执行操作语句 */ IntPtr stmt = SQLite3.Prepare2(handle, sql); try { var step = SQLite3.Step(stmt); if (step != SQLite3.Result.Done) { var error = SQLite3.GetErrmsg(handle); throw new InvalidOperationException($"{sql} error-{error}--step:{step}"); } } finally { SQLite3.Finalize(stmt); } 5. 从SQLite数据库读取配置 //ConfigItem对应的配置项数据类 public class asset_config { public int id; public float pos_x; public float pos_y; public float pos_z; } //配置数据缓存 public class AssetConfig { private Dictionary<int, asset_config> _configMap; public void ReadFromDb(IntPtr stmt) { SQLite3.Open(databasePathAsBytes, out handle, (int) openFlags, IntPtr.Zero); var sql = $"select * from asset_config"; var stmt = SQLite3.Prepare2(handle, sql); try { while (SQLite3.Step(stmt) == SQLite3.Result.Row) { var obj = Activator.CreateInstance(asset_config); obj.id = SQLite3.ColumnInt(stmt, 0); obj.pos_x = (float) SQLite3.ColumnDouble(stmt, 1); obj.pos_y = (float) SQLite3.ColumnDouble(stmt, 2); obj.pos_z = (float) SQLite3.ColumnDouble(stmt, 3); _configMap.Add(obj.id, obj); } } finally { SQLite3.Finalize(stmt); } } public Vector3 GetPos(int id) { if (_configMap.TryGetValue(id, out asset_config cfg)) { return new Vector3(cfg.pos_x, cfg.pos_y, cfg.pos_z); } } }


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #Unity #asset配置 #amp #sqlite数据库