【Unity基础】Unity中跨平台使用SQLite

一、概述

游戏中数据存储方案众多,在进行选择时,除了要考虑数据类型外,还要考虑对于跨平台的支持。

对于数据存储方案将在单独文章里介绍,下面只是总结了不同方案的特点。

|------------------------|-----------|----------|-------------------|-----------------|
| 方法 | 跨平台支持 | 读写能力 | 适合场景 | 特点 |
| Resources | 优秀 | 只读 | 小型项目,静态资源加载 | 简单方便,Unity 自动管理 |
| StreamingAssets | 中等 | 只读 | 大型文件(音频、视频、配置文件等) | 保留原始文件格式,路径平台相关 |
| PersistentDataPath | 优秀 | 读写 | 用户数据、存档、设置 | 持久化存储,适合存档和用户数据 |
| ScriptableObject | 优秀 | 只读 | 配置数据、静态游戏数据 | Unity 原生支持,内存优化 |
| SQLite/数据库 | 中等 | 读写 | 大量结构化数据管理,复杂查询 | 强大数据管理功能,需第三方支持 |
| REST API / 云存储 | 优秀 | 读写 | | |

本系列文章将重点介绍如何在跨平台项目中使用SQLite做为数据存储方案。

这里的跨平台指的是Windows, Mac, Linux, iOS, Android,WebGL,基本上覆盖主流平台。

在查找过程中,AssetStore上有一些支持SQLite的插件,但都是收费的,而许多文章里提到的SQLite4Unity3dSQLiteUnityKitsqlite-unity-plugin等已经许多年不更新维护了。

现在在Github上找到最新的一个插件是unity-sqlite-net,这是一位巴西的游戏开发者在维护。

本系列文章就是基于这个插件进行介绍的。

这个插件支持的平台包括Windows, Linux, macOS, iOS, tvOS, visionOS, Android 和WebGL。

二、安装Unity-sqlite-net插件

安装方法有多种:

https://github.com/gilzoide/unity-sqlite-net

三、运行示例代码

在Unity项目中添加下面的脚本,并在场景中创建一个空对象并挂载这个脚本,运行后可以通过Log查看运行记录。

cs 复制代码
using SQLite;
using UnityEngine;

// 该库包含一些简单的属性,您可以使用它们来控制表的构造,ORM 样式
public class Player
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string Name { get; set; }
}

public class TestSQLite : MonoBehaviour
{
    void Start()
    {
        // 1. 创建与数据库的连接。
        // 特殊的":memory:"内存数据库
        // 还支持"file:///somefile"等 URI
        var db = new SQLiteConnection($"{Application.persistentDataPath}/MyDb.db");

        // 2. 定义实体后,您可以通过调用 CreateTable 自动在数据库中生成表
        db.CreateTable<Player>();

        // 3. 您可以使用 Insert 在数据库中插入行
        // Insert 调用填充 Id,该 Id 标记为 [AutoIncremented]
        var newPlayer = new Player
        {
            Name = "gilzoide",
        };

        db.Insert(newPlayer);
        Debug.Log($"Player new ID: {newPlayer.Id}");
        // 对于更新和删除也存在类似的方法。

        // 4.a 查询数据的最直接方法
        // 是使用 Table 方法。这可以使用谓词
        // 通过 WHERE 子句进行约束和/或添加 ORDER BY 子句
        var query = db.Table<Player>().Where(p => p.Name.StartsWith("g"));

        foreach (Player player in query)
        {
            Debug.Log($"Found player named {player.Name} with ID {player.Id}");
        }

        // 4.b 您还可以使用 Query 方法进行低级查询
        var players = db.Query<Player>("SELECT * FROM Player WHERE Id = ?", 1);

        foreach (Player player in players)
        {
            Debug.Log($"Player with ID 1 is called {player.Name}");
        }

        // 5. 您可以使用 Execute方法对数据库执行低级更新,例如运行 PRAGMA 或 VACUUM
        db.Execute("VACUUM");
    }
}

这段示例代码展示了如何在Unity中使用SQLite进行简单的数据库操作。具体来说:

  1. Player类:定义了一个Player实体,包括一个自增的主键Id和一个Name属性。

  2. TestSQLite类:在Start方法中创建数据库连接,路径为持久数据路径下的"MyDb.db"。

  3. 创建表 :使用CreateTable<Player>()自动生成Player表。

  4. 插入数据:创建一个新玩家并插入数据库,自动填充Id。

  5. 查询数据

    • 使用Table方法通过条件查询玩家,输出符合条件的玩家信息。
    • 使用Query方法进行更低级的查询,获取Id为1的玩家。
  6. 执行命令 :最后使用Execute方法执行VACUUM命令,优化数据库。

参考:

  1. https://github.com/gilzoide/unity-sqlite-net

  2. https://github.com/praeclarum/sqlite-net

相关推荐
CandyU28 小时前
Cursor AI Unity
unity
LF男男8 小时前
Bullect.cs(bullet)——子弹基类
unity
mxwin1 天前
unity shader中 ddx ddy是什么
unity·游戏引擎·shader
郝学胜-神的一滴1 天前
[简化版 GAMES 101] 计算机图形学 08:三角形光栅化上
c++·unity·游戏引擎·godot·图形渲染·opengl·unreal
nnsix1 天前
Unity ILRuntime 笔记
unity·游戏引擎
nnsix1 天前
Unity API 兼容的 .NET Standard 2.1 和 .NET Framework 区别
unity·游戏引擎·.net
mxwin1 天前
Unity Shader 制作半透明物体 使用多Pass提前写入深度的方式 避免穿模
unity·游戏引擎
nnsix1 天前
Unity HybridCLR 笔记
笔记·unity·游戏引擎
nnsix1 天前
Unity Addressables 笔记
unity·游戏引擎
RReality1 天前
【Unity Shader URP】视差贴图 实战教程
ui·平面·unity·游戏引擎·图形渲染·贴图