Unity 制作登录功能02-创建和链接数据库(SQlite)
国际惯例:先看效果

1.SQlite是一种嵌入型数据库
在Unity开发游戏时使用SQLite有多种原因,以下是其中一些主要原因:
- 嵌入式数据库:SQLite是一个嵌入式数据库引擎,这意味着它不需要单独的服务器进程。这使得使用SQLite非常方便,并且可以轻松地在不同的平台和操作系统上使用。
- 易于使用:SQLite易于学习和使用,具有简洁的SQL语法和强大的功能。这使得开发者可以更快地构建和部署游戏,同时减少了对复杂的数据库系统的需求。
- 兼容性:SQLite具有跨平台的兼容性,可以在Windows、Mac、Linux、Android和iOS等不同平台上使用。这意味着使用SQLite可以减少游戏在不同平台上的差异,提高游戏的一致性。
- 安全性:SQLite支持事务和数据完整性,这使得它成为一种安全的数据库选择。它还提供了加密选项,可以保护存储在数据库中的敏感数据。
- 可扩展性、移植:SQLite具有很好的可扩展性,可以处理大量的数据和并发访问。这意味着使用SQLite可以满足游戏开发中的各种需求,包括存储大量的游戏数据和处理高并发的用户访问。
- 开源和免费:SQLite是开源的,可以免费使用和修改。此外,SQLite还具有很好的文档和社区支持,可以帮助开发者解决遇到的问
2.如何在服务器或者本地计算机安装SQLite
SQLite Download Page 官网下载
根据操作系统下载

C盘创建文件夹,把下载的文件解压放进去

sqlite3.def 只是为了支持本地计算机的CMD命令窗口可以访问的文件
3.如何在Unity中使用SQLite
创建文件夹 (自己命名,原则就是自己能找到)

在自己电脑上搜这两个文件,复制到自己刚刚创建的文件夹Plugins
-
Mono.Data.Sqlite.dll
-
sqlite3.dll

4.重启VS, 引用程序集即可!using Mono.Data.Sqlite;

5.学习该程序集的第一个类SQLiteConnection
SQLiteConnection是.NET Framework中的一个类,它是ADO.NET用于与SQLite数据库进行交互的主要接口之一。通过这个类,你可以执行SQL查询,修改数据库中的数据,处理数据库中的事务等等。
如果你需要使用SQLiteConnection,首先你需要确保你的项目已经引入了正确的SQLite .NET 包。你可以通过NuGet来添加这个包。在Visual Studio中,右击项目 -> "Manage NuGet Packages..." -> 搜索 "System.Data.SQLite" -> "Install"。
SQLiteConnection类的主要属性和方法有:
- ConnectionString:用于定义数据库连接的字符串。
- Open():打开数据库连接。
- Close():关闭数据库连接。
- Execute(SqlCommand command):执行一个SQL命令并返回受影响的行数。
- BeginTransaction():开始一个数据库事务。
- Commit():提交数据库事务。
- Rollback():回滚数据库事务。
实战案例:用户注册
用户注册并存储账号密码到数据库

两个脚本:
1.获取用户在UI界面输入的账号密码字符串
2.创建一个数据链接SQLite!创建一个表!把获取的账号密码插入数据库!
场景搭建:

1.获取用户在UI界面输入的账号密码字符串
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;public class UserLogin : MonoBehaviour
{// 该脚本获取场景中输入框组件2.获取用户输入内容 public TMP_InputField userInputFieldAccount;public TMP_InputField userInputFieldPassword;public GameObject inputkuang;public static string UserAccount;public static string UserPassword;void Start(){userInputFieldAccount.onEndEdit.AddListener(OnUserInputChanged);userInputFieldPassword = inputkuang.GetComponent<TMP_InputField>();userInputFieldPassword.onEndEdit.AddListener(OnUserInputPassword);}private void OnUserInputPassword(string password){Debug.Log("用户输入的密码是:" + password);UserPassword = password;}// Update is called once per frameprivate void OnUserInputChanged(string Account){// 当用户输入值发生改变时调用该方法Debug.Log("用户输入的注册:" + Account);UserAccount = Account;}public void Login()//该函数用来在外部登录按钮面板中触发{Debug.Log("面板上的函数触发成功,用户点击了注册按钮" + UserAccount + " " + UserPassword);do{ ConnectDataSQL.GetUserInput(UserAccount, UserPassword);//调用另一个类的方法:插入数据库并存储Debug.Log("注册成功"); } while (false);}
}
2.创建一个数据链接SQLite!创建一个表!把获取的账号密码插入数据库!
using UnityEngine;
using System.Data;
using Mono.Data.Sqlite;public class ConnectDataSQL : MonoBehaviour
{private const string databaseName = "leoyang.db"; // 数据库文件名称static SqliteConnection MyConnectionDB;//创建一个数据库链接事件对象string UserAccount;string UserPassword;private void Start(){// 定义数据库连接字符串string connectionString = "URI=file:" + Application.dataPath + "/" + databaseName;// 创建数据库连接//传入创建或者访问SQLITE数据库的路径MyConnectionDB = new SqliteConnection(connectionString);if (MyConnectionDB.State == ConnectionState.Closed)//检测当前数据库链接状态是否关闭{MyConnectionDB.Open();//打开数据库Debug.Log("数据库链接完毕已打开");}else{Debug.Log("数据库连接失败");}// 创建数据库用户表(如果不存在)CreateTable(MyConnectionDB); }// 创建用户表的方法private void CreateTable(SqliteConnection oneConnect){string sqlCreateTable = "CREATE TABLE IF NOT EXISTS UserTable (" +"Id INTEGER PRIMARY KEY AUTOINCREMENT," +"Username TEXT NOT NULL," +"Password TEXT NOT NULL" +");";SqliteCommand SQcommand = new SqliteCommand(sqlCreateTable, oneConnect);//数据库创建命令SQcommand.ExecuteNonQuery();SQcommand.Dispose();SQcommand = null;}public static void GetUserInput(string UserAccount, string UserPassword)//用户点击注册开始插入数据库{if (UserPassword!=null&&UserAccount!=null){InsertUser(UserAccount,UserPassword);}}// 插入用户输入的账号和密码的方法public static void InsertUser(string username, string password){string sqlCreateTable = "INSERT INTO UserTable (Username, Password) VALUES (@Username, @Password)";if (MyConnectionDB.State != ConnectionState.Open){MyConnectionDB.Open();Debug.Log("我为您重新打开了数据库");}else{SqliteCommand Insertuser = new SqliteCommand(sqlCreateTable, MyConnectionDB);Insertuser.Parameters.AddWithValue("@Username", username);Insertuser.Parameters.AddWithValue("@Password", password);//在 try 块中的代码执行期间,如果发生了异常,则会跳过后续的代码,并进入与异常类型匹配的 catch 块中进行处理。如果异常类型没有与任何 catch 块匹配,那么将会跳过所有的 catch 块,但仍然可以选择执行 finally 块。try{Insertuser.ExecuteNonQuery();Debug.Log("插入注册成功.");}catch (SqliteException yichang){Debug.LogError("插入注册失败 " + yichang.Message);}finally{// 释放资源和清理操作Insertuser.Dispose();Insertuser = null;MyConnectionDB.Close();}}Debug.Log("注册成功.");}// 读取用户表中的数据的方法// 每次执行完数据库命令后,通常需要调用 ExecuteNonQuery() 方法来执行命令,然后使用 Dispose() 方法释放相关资源,// 最后将对象置为 null。 public void ClearDB()//关闭数据库{MyConnectionDB.Close();MyConnectionDB = null;}
}
PS 用完数据库要关闭和清空====================

这段代码是用于关闭数据库连接的方法。具体来说,MyConnectionDB.Close()表示关闭当前数据库连接,并释放与该连接关联的任何资源。而MyConnectionDB = null;则将数据库连接对象置为null,以便垃圾回收器可以在适当的时候将其回收。
关闭数据库连接对于提高应用程序性能和防止资源泄漏非常重要。如果没有正确关闭数据库连接,可能会导致连接池被占用过多而影响应用程序性能,或者导致系统资源不足而导致应用程序出现异常。
在使用完数据库连接后,应该及时关闭它,以便让其他应用程序能够通过连接池访问数据库。同时,将对象置为null也有助于垃圾回收器及时回收不再使用的资源,以提高应用程序的性能和稳定性。
总之,本段代码的作用是在关闭数据库连接后,将连接对象置为null,以便垃圾回收器可以及时回收资源。
最终效果:


相关文章:
Unity 制作登录功能02-创建和链接数据库(SQlite)
国际惯例:先看效果 1.SQlite是一种嵌入型数据库 在Unity开发游戏时使用SQLite有多种原因,以下是其中一些主要原因: 嵌入式数据库:SQLite是一个嵌入式数据库引擎,这意味着它不需要单独的服务器进程。这使得使用SQLite非…...
算法 岛屿数量-(递归回溯)
牛客网 BM57. 二维矩阵,值为1表示岛屿,0表示海洋,求海洋中岛屿数量。 解题思路: 遍历二维数组,值为1增加岛屿数量记数,同时对此位置进行单独递归遍历上下左右4个方向,将数组坐标范围内同时值为1的元素置…...
安卓恶意应用识别(番外篇)(Python并行(多线程or多进程)执行cmd)
前言 本人为了批量反编译,不得不涉及到批量执行,之前没有彻底理解有关于多线程的概念和python方法,现在只能一步一步尝试,并且实践,写本文以记录。 1. 进程与线程 1.1 什么是进程? 1.1.1 概念 进程是一…...
基于大语言模型扬长避短架构服务
秘诀: 扬泛化之长, 避时延之短...
初识网络编程
一、概述 地球村:亦称世界村,是通过电子媒介将世界紧密联系起来的形象表达,是信息网络时代的集中体现 TCP和UDP: TCP:打电话 -->连接 -->接了 -->通话 UDP:发送完即可 -->接收 计算机网络&a…...
轻松使用androidstudio交叉编译libredwg库
对于安卓或嵌入式开发者而言,交叉编译是再熟悉不过的操作了,可是对于一些刚入门或初级开发者经常会遇到这样的问题:如何交叉编译C++库来生成安卓下的so库呢? 最近有一些粉丝找到我求救,那么我最近刚好有空大致研究了下,帮他们成功编译了其中一个libredwg的C++库,这篇文章…...
【C++杂货铺】一颗具有搜索功能的二叉树
文章目录 一、二叉搜索树概念二、二叉搜索树的操作2.1 二叉搜索树的查找2.2 二叉搜索树的插入2.3 二叉搜索树的删除 三、二叉搜索树的实现3.1 BinarySearchTreeNode(结点类)3.2 BinarySearchTree(二叉搜索树类)3.2.1 框架3.2.2 in…...
uni-app使用vue3,在元素或组件实例上添加ref,用this.$refs显示undefined
项目中引用了一个UI组件库,在表单上添加了ref属性,方便提交时验证。触发提交方法时显示不存在这个方法或this.$refs为undefined。 <u--form labelPosition"left" :model"userInfo" :rules"rules" ref"loginForm&…...
蜂蜜配送销售商城小程序的作用是什么
蜂蜜是农产品中重要的一个类目,其受众之广市场需求量大,但由于非人人必需品,因此传统线下门店经营也面临着痛点,线上入驻平台也有很多限制难以打造自有品牌,无法管理销售商品及会员、营销等,缺少自营渠道&a…...
大数据Flink(八十四):SQL语法的DML:窗口聚合
文章目录 SQL语法的DML:窗口聚合 一、滚动窗口(TUMBLE)...
系统集成|第十八章(笔记)
目录 第十八章 安全管理18.1 信息安全管理18.2 信息系统安全18.3 物理安全管理18.4 人员安全管理18.5 应用该系统安全管理18.6 信息安全等级保护18.7 拓展 上篇:第十七章、变更管理 下篇:第十九章、风险管理 第十八章 安全管理 18.1 信息安全管理 信息安…...
480万商品,如何架构商品治理平台?
说在前面 在40岁老架构师 尼恩的读者交流群(50)中,很多小伙伴拿高薪,完成架构的升级,进入架构师赛道,打开薪酬天花板。 最近有小伙伴拿到了一线互联网企业如京东、网易、微博、阿里、汽车之家、极兔、有赞、希音、百度、滴滴的架…...
【C++入门指南】C如何过渡到C++?祖师爷究竟对C++做了什么?
【C入门指南】C如何过渡到C?祖师爷究竟对C做了什么? 前言一、命名空间1.1 命名空间的定义1.2 命名空间使用 二、C输入、输出2.1 std命名空间的使用惯例 三、缺省参数3.1 缺省参数的定义3.2 缺省参数分类 四、函数重载4.1 函数重载概念4.2 C支持函数重载的…...
简易磁盘自动监控服务
本文旨在利用crontab定时任务(脚本请参考附件)来监控单个服务节点上所有磁盘使用情况,一旦超过既定阈值则会通过邮件形式告警相关利益人及时介入处理。 1. 开启SMTP服务 为了能够成功接收告警信息,需要邮件接收客户都安开启SMTP服务。简要流程请参考下…...
【100天精通Python】Day65:Python可视化_Matplotlib3D绘图mplot3d,绘制3D散点图、3D线图和3D条形图,示例+代码
1 mpl_toolkits.mplot3d 功能介绍 mpl_toolkits.mplot3d 是 Matplotlib 库中的一个子模块,用于绘制和可视化三维图形,包括三维散点图、曲面图、线图等。它提供了丰富的功能来创建和定制三维图形。以下是 mpl_toolkits.mplot3d 的主要功能和功能简介&am…...
十六,镜面IBL--预滤波环境贴图
又到了开心的公式时刻了。 先看看渲染方程 现在关注第二部分,镜面反射。 其中 这里很棘手,与输入wi和输出w0都有关系,所以,再近似 其中第一部分,就是预滤波环境贴图,形式上与前面的辐照度图很相似&#…...
信息安全:恶意代码防范技术原理.
信息安全:恶意代码防范技术原理. 恶意代码的英文是 Malicious Code, 它是一种违背目标系统安全策略的程序代码,会造成目标系统信息泄露、资源滥用,破坏系统的完整性及可用性。 目录: 恶意代码概述: (1&a…...
开源媒体浏览器Kyoo
什么是 Kyoo ? Kyoo 是一款开源媒体浏览器,可让您流式传输电影、电视节目或动漫。它是 Plex、Emby 或 Jellyfin 的替代品。Kyoo 是从头开始创建的,它不是一个分叉。一切都将永远是免费和开源的。 软件特性: 管理您的电影、电视剧…...
人脸解锁设备时出现相机报错
(1)背景分析 这是项目当中实际遇到的问题,如下代码仅用作分析和记录。 现在问题的现象是:刚亮屏大概在2s以内对着人脸一般是能解锁的,但是超过2s之后在对着人脸,是无法解锁成功的。 (2&#…...
【广州华锐互动】利用VR开展工业事故应急救援演练,确保救援行动的可靠性和有效性
在工业生产中,事故的突发性与不可预测性常常带来巨大的损失。传统的应急演练方式往往存在场地限制、成本高、效果难以衡量等问题。然而,随着虚拟现实(VR)技术的快速发展,VR工业事故应急救援演练应运而生,为…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...

