unity — asset配置 & SQLite数据库

简介

将可序列化的类的数据保存为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;
}

[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.更改配置并保存

在保存路径中打开双击配置文件

unity -- asset配置 & SQLite数据库
在Inspector窗口中更改配置数据
unity -- asset配置 & SQLite数据库
或代码更改
        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);

    var sql = "PRAGMA temp_store = MEMORY"

    var fields = ConfigItem.GetFields(BindingFlags.Instance | BindingFlags.Public);
    var colList = new List<ColumnAttribute>();
    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"....;

    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);

            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})"

    }

    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}";

    }

    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数据库读取配置


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);
        }
    }
}

Original: https://blog.csdn.net/baixue0729/article/details/121997751
Author: babywang0
Title: unity — asset配置 & SQLite数据库

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/816017/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球