游戏开发平台:Unity 2019.4.23f1以上
编程平台:Visual Studio 2019
编程语言:C#

为什么选择使用数据库?

答:数据库作为数据管理的库,便于游戏开发者管理角色数据,如调整、增加、修改等操作,省去了繁琐的定位到某一脚本修改参数变量。对运维管理,利于保存玩家数据,如交易道具,仓库存储,身份UID。联网类游戏更是记录玩家的登录账号和密码检查登入者是否为玩家本人等情况。


扩展程序依赖

在Unity平台上连接使用SQL数据库,避免不了扩展程序的依赖。如下所示:

  • Microsoft.Data.Sqlite.dll
    由微软官方提供的针对数据库连接的程序包
  • Mono.Data.Sqlite.dll 点我官网下载 由Mono提供的针对数据库连接的程序包,于2018年停止更新。早期Unity版本使用的编译器为MonoBehavior平台,自2017版本以来,Unity与微软合作后推荐选用Visual Studio。
  • System.Data.Sqlite.dll
    由下载安装Visual Studio自动下载的

准备依赖工具

Vs内部下载:

  • Visual Studio 项目 -> 管理NuGet程序包 -> 搜索并下载对应.dll

外部导入:

  • Visual Studio 右键项目依赖项 -> 添加依赖项

使用SQLite

2.0 认识与准备SQLite字段

private SqliteConnection connection;
private SqliteCommand cmd;
private SqliteDataReader dataReader;
  • SqliteConnection:连接行为
  • SqliteCommand:SQLite命令内容,如 SELECT * FROM data
  • SqliteDataReader:数据库中的数据内容

2.1 连接数据库

public void OpenSQLConnection(string dbObject)
{
    try
    {
        connection = new SqliteConnection(dbObject);
        connection.Open();
        //Debug.Log("数据库:" + dbObject + "连接成功");
    }
    catch (Exception e)
    {
        //Debug.LogError("异常错误:" + e.ToString());
    }
}
  • SqliteConnection:连接数据库
  • Open():打开数据库
  • try...catch:捕获异常信息以助于更好了解

2.2 断开连接数据库

public void CloseSQLConnection()
{
	if (cmd != null)
	{
    	//清空cmd命令内容
        cmd.Dispose();
        cmd = null;
    }
    if (dataReader != null) 
    {
         dataReader.Dispose();
         dataReader = null;
    }
    if (connection != null)
    {
         connection.Dispose();
         connection = null;
    }
    Debug.Log("数据库已断开连接!");
}
  • Dispose():断开数据库连接(断开后不可再次连接,且需断开后设置对象为null)
  • Close():断开数据库连接(断开后可多次连接与断开,无需断开后设置对象null)
  • cmd命令、dataReader数据读取、connection数据库连接 是访问数据库数据不可缺少的对象。
    通过connection实现对数据库文件(.db)的连接服务;
    通过dataReader读取数据库的数据内容;
    通过cmd执行查询、增加、删除、更新数据库内数据;

2.3 执行SQL命令

public SqliteDataReader ExecuteCommand(string sqlQuery)
{
     cmd = connection.CreateCommand();
     cmd.CommandText = sqlQuery;
     dataReader = cmd.ExecuteReader();

     return dataReader;
}
  • SqliteDataReader:数据库数据读取
  • CreateCommand():创建SQL命令对象
  • CommandText:SQL命令内容,这里的指令来自于局部参数sqlQuery
  • ExecuteReader():执行SQL命令
  • dataReader:数据库数据,这里指通过SQL命令查询到的数据内容

2.4 读取SQL数据表

public SqliteDataReader QuaryData(string tableName)
    {
        string query = "SELECT * FROM " + tableName;

        return ExecuteCommand(query);
    }
  • tableName:SQLite数据表名
  • "SELECT * FROM " + tableName:SQLite命令格式,详细参考数据库相关书籍

2.5 读取SQL数据表某一数据

public SqliteDataReader QuaryData(string tableName, string fieldName)
    {
        string query = "SELECT " + fieldName + " FROM " + tableName;

        return ExecuteCommand(query);
    }
  • tableName:SQLite数据表名
  • fieldName:元素名

2.6 读取SQL数据表某一对象的全部数据

public SqliteDataReader QuaryData(string tableName, string[] fieldName)
    {
        string query = "SELECT ";
        for (int i = 0; i < fieldName.Length - 1; i++)
        {
            query += fieldName.ToString() + ", ";
        }
        query += fieldName[fieldName.Length - 1].ToString() + " From " + tableName.ToString();

        return ExecuteCommand(query);
    }

注:同2.5

其他问题

存在部分情况下端游无法正常读取Db数据库文件,目前作者正在寻找相关解决方法中。如有知晓解决方案,请不介意评论告诉作者以更好学习,谢谢。