当前位置: 首页 > article >正文

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

一、概述

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

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

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

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

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

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

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

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

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

二、安装Unity-sqlite-net插件

安装方法有多种:

  • 使用openupm 注册表并使用openupm-cli安装此包:
openupm add com.gilzoide.sqlite-net
  • 使用Unity 包管理器进行安装,网址如下:
https://github.com/gilzoide/unity-sqlite-net.git#1.0.1
  • Assets克隆此存储库或直接在项目或文件夹中下载它的快照Packages

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

三、运行示例代码

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

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


http://www.kler.cn/news/326312.html

相关文章:

  • php-cgi漏洞利用
  • php 平滑重启 kill -SIGUSR2 <PID> pgrep命令查看进程号
  • SpinalHDL之结构(八)
  • 记一次pycharm在使用git提交时需要输入ssh key的密码的问题
  • 第十一届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)(大学组)
  • HTTPS协议详解:从原理到流程,全面解析安全传输的奥秘
  • 资产管理之源代码防泄密的挑战
  • Redis 简单的消息队列
  • 并发、并行和异步设计
  • Linux 信号保存
  • 【菜菜的sklearn机器学习】(4)随机森林
  • 六,MyBatis-Plus 扩展功能(逻辑删除,通用枚举,字段类型处理,自动填充功能,防全表更新与删除插件,MybatisX快速开发插件)
  • 探索基于知识图谱和 ChatGPT 结合制造服务推荐前沿
  • 【Android 14源码分析】WMS-窗口显示-流程概览与应用端流程分析
  • C语言中的日志机制:打造全面强大的日志系统
  • 翻译:Recent Event Camera Innovations: A Survey
  • 30秒内交易股票,程序化交易的定义与特点
  • 【Windows】自定义显示器的分辨率
  • @Transactional的实现原理
  • openKylin--安装 .net6.0
  • 【linux】gdb
  • 鸿蒙HarmonyOS之封装Http请求工具类
  • Spring Boot 进阶-第一个程序HelloWorld
  • C语言 | Leetcode C语言题解之第447题回旋镖的数量
  • knowLedge-Vue I18n 是 Vue.js 的国际化插件
  • SpringMVC源码-AbstractHandlerMethodMapping处理器映射器将@Controller修饰类方法存储到处理器映射器
  • 关于开发板与虚拟机网络不通问题排查
  • 在线点餐新体验:Spring Boot 点餐系统
  • excel不经过后台实现解析和预览(vue)
  • YOLOv8 Flask整合问题