Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI)

马肤

温馨提示:这篇文章已超过434天没有更新,请注意相关的内容是否还可用!

摘要:使用Unity连接MySQL数据库并显示表格内容(通过Simple TableUI)的过程涉及Unity应用程序与MySQL数据库之间的通信。这包括在Unity中设置数据库连接,查询MySQL中的表格数据,并在Simple TableUI中展示这些数据。整个过程旨在实现实时数据交互,让用户能在Unity环境中浏览和操作MySQL数据库中的表格信息。

目录

一、Unity 中 DataTable 的使用

二、Simple TableUI 的使用

三、Unity 读取 MySql 数据库

四、显示表格并实现分页功能

结束


效果:
Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第1张

一、Unity 中 DataTable 的使用

C# 中 DataTable 类位于命名空间 System.Data ,在 Winform、WPF 等开发中,用的非常多,在 Unity 5.6.X 或者更低的版本中,是无法直接使用的,也不要在 Visual Studio 中去引用 System.Data.dll,不然在 Unity 里会报错,错误比如:

InvalidProgramException: Invalid IL code in System.Data.DataTable:get_Columns (): IL_0000: ret

下面来介绍一下,在 Unity 里低版本中如何使用 DataTable,在后面的案例中,Unity 版本使用的是 Unity 2020.3.45f1 ,因为要用到 Simple TableUI 插件,在 5.x 版本并不支持,所以这里对 5.x 中如何使用 DataTable 做一个简单的介绍吧。

在 Unity 5.x 中,项目中必须要先添加 System.Data.dll,System.Data.dll 位置在 Unity 的安装目录,比如下图中的路径

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第2张

将 System.Data.dll 直接拖动到项目的 Plugins 目录中,打开 VS 后,如果自动添加了 System.Data 这个引用则为成功

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第3张

在 Unity 更高的版本中,不必主动添加 System.Data 这个DLL,默认就会有,为了更好的开发,将 .net 版本改为 .NET 4.x 写代码会更加的方便

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第4张

打开Visual Studio 2022 编辑器,就会看到默认已经添加了 System.Data

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第5张

 新建一个脚本 Test,用来测试是否可用

using System;
using System.Data;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour {
	void Start () {
        DataTable dt = new DataTable("Name");
        dt.Columns.Add(new DataColumn("ID", typeof(Int32)));
        dt.Columns.Add(new DataColumn("Name", typeof(string)));
        dt.Columns.Add(new DataColumn("Sex", typeof(string)));
        dt.Columns.Add(new DataColumn("Addr", typeof(string)));
        //添加一行数据到列中
        DataRow dr = dt.NewRow();
        dr["ID"] = 1;
        dr["Name"] = "张三";
        dr["Sex"] = "未知";
        dr["addr"] = "泰国";
        //添加一行数据到表单中
        dt.Rows.Add(dr);
        Debug.Log("列表行数:" + dt.Rows.Count);
        string sex = dt.Rows[0][2].ToString();
        Debug.Log("性别:" + sex);
    }
	
	void Update () {
		
	}
}

将其挂在一个游戏物体上,运行:

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第6张

 打印出来了,嘿嘿,这就说明 DataTable 可以使用了

二、Simple TableUI 的使用

Simple TableUI 插件是免费的,另外它还有一个付费版本叫 TableUI,当前的案例就用 Simple TableUI 作为示范,Unity 版本为  Unity 2020.3.45f1

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第7张

 将资源添加完成后,在项目里,我们导入插件,就会发现,插件会报错

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第8张

错误的是,没有找到对应的枚举

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第9张

解决这个问题很简单,去掉前面的下划线就行了,这样就不报错了

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第10张

导入后,先打开 官方的 Demo 看看

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第11张

这时,就会默认弹出一个框,询问你是否导入 TextMesh Pro ,因为 Simple TableUI 插件用到了 TextMesh Pro,所以点击 Import TMP Essentials 

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第12张

然后,项目会多出一个文件夹

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第13张

这时候,打开场景,在 Canvas 里就可以看到对应的表单了 

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第14张

使用起来也是比较简单的,我这里做一下介绍

+ row 给表格添加一行

- row 表格减少一行

+ column 给表格添加一列

- column 给表格减少一列

右边的三个输入框,加一个 apply 按钮,是改变哪一行,那一列的内容

官方的这个 demo 的场景我就不动了,我们打开 Unity 默认添加的场景

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第15张

默认位置有点偏,点击 Reset Position 重置位置

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第16张 Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第17张

如果这时候运行,依然会报错:

There is no 'CanvasRenderer' attached to the "Borders" game object, but a script is trying to access it.

You probably need to add a CanvasRenderer to the game object "Borders". Or your script needs to check if the component is attached before using it.

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第18张

下面,我们找到 Borders 游戏物体

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第19张

添加 Canvas Renderer 组件,将 Cull Transparent Mesh 的勾去掉

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第20张

这时候运行,就不会报错了

三、Unity 读取 MySql 数据库

在第一节中,使用的 DataTable 是自己添加的数据,其实更多的时候,数据是从数据库中读取出来的,下面就介绍,如何从 mysql 中读取数据,并在 unity 中打印出来。

如果你的电脑没有安装 mysql ,请先安装,再继续接下来的教程

mysql 数据库

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第21张

这个表在后面的源码中会有提供。或者你可以用自己的数据库,在后面的代码中,改下 SQL 语句就行了。

在 unity 里要想读取 mysql 数据库,配置还是非常的麻烦的,需要另外创建一个 C# Winfrom 项目,并在 NuGet 里面安装 Mysql.Data ,伴随着也是下载一大堆插件,我们需要做的就是复制这些相关的 dll 到 unity 中。

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第22张

安装完成后的插件有这么多

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第23张

在这个 winform 项目的根目录 packages 中,我们需要把对应的 dll 复制到 unity  中

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第24张

复制 dll 过来后的 Unity --> Plugins 目录

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第25张

将这些 dll 添加完成后,如果 unity 控制台没有报错,则为成功,不想这么麻烦也没关系,可以直接用我源码中的 dll 就好。

关于 C# 如何连接 MySql 数据库,我之前有写过教程,有兴趣的可以去试试。点击跳转 

另外,如果你想用 Unity 读取 SqlServer 数据库,我同样也写过类似的帖子,点击跳转

接下来,在 Unity 中创建一个脚本 MySqlHelper

using MySql.Data.MySqlClient;
using System.Data;
using System;
public class MySqlHelper
{
    private static string connstr = "server=127.0.0.1;database=world;username=root;password=123456;";
    #region 执行查询语句,返回MySqlDataReader
    /// 
    /// 执行查询语句,返回MySqlDataReader
    /// 
    /// 
    /// 
    public static MySqlDataReader ExecuteReader(string sqlString)
    {
        MySqlConnection connection = new MySqlConnection(connstr);
        MySqlCommand cmd = new MySqlCommand(sqlString, connection);
        MySqlDataReader myReader = null;
        try
        {
            connection.Open();
            myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            return myReader;
        }
        catch (System.Data.SqlClient.SqlException e)
        {
            connection.Close();
            throw new Exception(e.Message);
        }
        finally
        {
            if (myReader == null)
            {
                cmd.Dispose();
                connection.Close();
            }
        }
    }
    #endregion
    #region 执行带参数的查询语句,返回 MySqlDataReader
    /// 
    /// 执行带参数的查询语句,返回MySqlDataReader
    /// 
    /// 
    /// 
    /// 
    public static MySqlDataReader ExecuteReader(string sqlString, params MySqlParameter[] cmdParms)
    {
        MySqlConnection connection = new MySqlConnection(connstr);
        MySqlCommand cmd = new MySqlCommand();
        MySqlDataReader myReader = null;
        try
        {
            PrepareCommand(cmd, connection, null, sqlString, cmdParms);
            myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            cmd.Parameters.Clear();
            return myReader;
        }
        catch (System.Data.SqlClient.SqlException e)
        {
            connection.Close();
            throw new Exception(e.Message);
        }
        finally
        {
            if (myReader == null)
            {
                cmd.Dispose();
                connection.Close();
            }
        }
    }
    #endregion
    #region 执行sql语句,返回执行行数
    /// 
    /// 执行sql语句,返回执行行数
    /// 
    /// 
    /// 
    public static int ExecuteSql(string sql)
    {
        using (MySqlConnection conn = new MySqlConnection(connstr))
        {
            using (MySqlCommand cmd = new MySqlCommand(sql, conn))
            {
                try
                {
                    conn.Open();
                    int rows = cmd.ExecuteNonQuery();
                    return rows;
                }
                catch (MySql.Data.MySqlClient.MySqlException e)
                {
                    conn.Close();
                    //throw e;
                    Console.WriteLine(e.Message);
                }
                finally
                {
                    cmd.Dispose();
                    conn.Close();
                }
            }
        }
        return -1;
    }
    #endregion
    #region 执行带参数的sql语句,并返回执行行数
    /// 
    /// 执行带参数的sql语句,并返回执行行数
    /// 
    /// 
    /// 
    /// 
    public static int ExecuteSql(string sqlString, params MySqlParameter[] cmdParms)
    {
        using (MySqlConnection connection = new MySqlConnection(connstr))
        {
            using (MySqlCommand cmd = new MySqlCommand())
            {
                try
                {
                    PrepareCommand(cmd, connection, null, sqlString, cmdParms);
                    int rows = cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                    return rows;
                }
                catch (System.Data.SqlClient.SqlException E)
                {
                    throw new Exception(E.Message);
                }
                finally
                {
                    cmd.Dispose();
                    connection.Close();
                }
            }
        }
    }
    #endregion
    #region 执行查询语句,返回DataSet
    /// 
    /// 执行查询语句,返回DataSet
    /// 
    /// 
    /// 
    public static DataSet GetDataSet(string sql)
    {
        using (MySqlConnection conn = new MySqlConnection(connstr))
        {
            DataSet ds = new DataSet();
            try
            {
                conn.Open();
                MySqlDataAdapter DataAdapter = new MySqlDataAdapter(sql, conn);
                DataAdapter.Fill(ds);
            }
            catch (Exception ex)
            {
                //throw ex;
                Console.WriteLine(ex.Message);
            }
            finally
            {
                conn.Close();
            }
            return ds;
        }
    }
    #endregion
    #region 执行带参数的查询语句,返回DataSet
    /// 
    /// 执行带参数的查询语句,返回DataSet
    /// 
    /// 
    /// 
    /// 
    public static DataSet GetDataSet(string sqlString, params MySqlParameter[] cmdParms)
    {
        using (MySqlConnection connection = new MySqlConnection(connstr))
        {
            MySqlCommand cmd = new MySqlCommand();
            PrepareCommand(cmd, connection, null, sqlString, cmdParms);
            using (MySqlDataAdapter da = new MySqlDataAdapter(cmd))
            {
                DataSet ds = new DataSet();
                try
                {
                    da.Fill(ds, "ds");
                    cmd.Parameters.Clear();
                }
                catch (System.Data.SqlClient.SqlException ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    cmd.Dispose();
                    connection.Close();
                }
                return ds;
            }
        }
    }
    #endregion
    #region 执行带参数的sql语句,并返回 object
    /// 
    /// 执行带参数的sql语句,并返回object
    /// 
    /// 
    /// 
    /// 
    public static object GetSingle(string sqlString, params MySqlParameter[] cmdParms)
    {
        using (MySqlConnection connection = new MySqlConnection(connstr))
        {
            using (MySqlCommand cmd = new MySqlCommand())
            {
                try
                {
                    PrepareCommand(cmd, connection, null, sqlString, cmdParms);
                    object obj = cmd.ExecuteScalar();
                    cmd.Parameters.Clear();
                    if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                    {
                        return null;
                    }
                    else
                    {
                        return obj;
                    }
                }
                catch (System.Data.SqlClient.SqlException e)
                {
                    throw new Exception(e.Message);
                }
                finally
                {
                    cmd.Dispose();
                    connection.Close();
                }
            }
        }
    }
    #endregion
    /// 
    /// 执行存储过程,返回数据集
    /// 
    /// 存储过程名
    /// 存储过程参数
    /// DataSet
    public static DataSet RunProcedureForDataSet(string storedProcName, IDataParameter[] parameters)
    {
        using (MySqlConnection connection = new MySqlConnection(connstr))
        {
            DataSet dataSet = new DataSet();
            connection.Open();
            MySqlDataAdapter sqlDA = new MySqlDataAdapter();
            sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
            sqlDA.Fill(dataSet);
            connection.Close();
            return dataSet;
        }
    }
    /// 
    /// 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值)
    /// 
    /// 数据库连接
    /// 存储过程名
    /// 存储过程参数
    /// SqlCommand
    private static MySqlCommand BuildQueryCommand(MySqlConnection connection, string storedProcName,
        IDataParameter[] parameters)
    {
        MySqlCommand command = new MySqlCommand(storedProcName, connection);
        command.CommandType = CommandType.StoredProcedure;
        foreach (MySqlParameter parameter in parameters)
        {
            command.Parameters.Add(parameter);
        }
        return command;
    }
    #region 装载MySqlCommand对象
    /// 
    /// 装载MySqlCommand对象
    /// 
    private static void PrepareCommand(MySqlCommand cmd, MySqlConnection conn, MySqlTransaction trans, string cmdText,
        MySqlParameter[] cmdParms)
    {
        if (conn.State != ConnectionState.Open)
        {
            conn.Open();
        }
        cmd.Connection = conn;
        cmd.CommandText = cmdText;
        if (trans != null)
        {
            cmd.Transaction = trans;
        }
        cmd.CommandType = CommandType.Text; //cmdType;
        if (cmdParms != null)
        {
            foreach (MySqlParameter parm in cmdParms)
            {
                cmd.Parameters.Add(parm);
            }
        }
    }
    #endregion
}

创建一个 Test 脚本,用来调用数据库查询

using System.Data;
using UnityEngine;
public class Test : MonoBehaviour
{
   
    void Start()
    {
        string sql = "SELECT * FROM city LIMIT 10";
        DataSet dataSet = MySqlHelper.GetDataSet(sql);
        DataTable dt = dataSet.Tables[0];
        if (dt.Rows.Count > 0)
        {
            foreach (DataRow row in dt.Rows)
            {
                string columnStr = string.Empty;
                foreach (DataColumn column in dt.Columns)
                {
                    columnStr += row[column] + " | ";
                }
                Debug.Log(columnStr);
            }
        }
    }
    // Update is called once per frame
    void Update()
    {
        
    }
}

在场景中创建一个空物体 GameObject,将 Test 脚本挂在上面

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第26张

点击运行:

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第27张

我们看看数据库,可以看到,数据成功的读取了,这样就完成了读取数据库部分

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第28张

四、显示表格并实现分页功能

找到 Table 游戏物体

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第29张

这里我们将列表改为 5 列,6行,只要拖动滚动条,在 Scene 界面就能看到对应的效果了。

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第30张

 我们在 Canvas 中添加两个按钮,上一页和下一页

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第31张

Scene 界面效果

Unity 连接 MySql 显示表格(Simple TableUI),Unity连接MySQL并显示表格数据(Simple TableUI) 第32张

在之前创建的 Test 脚本中,加入下面代码

using System.Data;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.UI.TableUI;
public class Test : MonoBehaviour
{
    public Button Button_PageUp;
    public Button Button_PageDown;
    public TableUI TableUIs;
    //从数据库读取的数据
    private DataTable DT;
    //每页的行数
    private int RowsOfPage = 5;
    //总页数
    private int TotalPages = 0;
    //当前的页数
    private int Page = 1;
    //最后一页会空多少行
    private int Remainder;
    void Start()
    {
        Button_PageUp.onClick.AddListener(OnClick_PageUp);
        Button_PageDown.onClick.AddListener(OnClick_PageDown);
        string sql = "SELECT * FROM city LIMIT 15";
        DataSet dataSet = MySqlHelper.GetDataSet(sql);
        DT = dataSet.Tables[0];
        if (DT.Rows.Count > 0)
        {
            Debug.Log("总长度:" + DT.Rows.Count);
            TotalPages = (DT.Rows.Count + RowsOfPage -1) / RowsOfPage;
            Debug.Log("总页数:" + TotalPages);
            Remainder = DT.Rows.Count % RowsOfPage;
            if (Remainder > 0) Remainder -= 1;
            Debug.Log("余数:" + Remainder);
            //显示列名
            for (int i = 0; i 

0
收藏0
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

  • 【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法,Matlab/Simulink自动生成代码的五种选择结构实现方法(二),Matlab/Simulink自动生成代码的五种选择结构实现方法详解(二)
  • 超级好用的C++实用库之跨平台实用方法,跨平台实用方法的C++实用库超好用指南,C++跨平台实用库使用指南,超好用实用方法集合,C++跨平台实用库超好用指南,方法与技巧集合
  • 【动态规划】斐波那契数列模型(C++),斐波那契数列模型(C++实现与动态规划解析),斐波那契数列模型解析与C++实现(动态规划)
  • 【C++】,string类底层的模拟实现,C++中string类的模拟底层实现探究
  • uniapp 小程序实现微信授权登录(前端和后端),Uniapp小程序实现微信授权登录全流程(前端后端全攻略),Uniapp小程序微信授权登录全流程攻略,前端后端全指南
  • Vue脚手架的安装(保姆级教程),Vue脚手架保姆级安装教程,Vue脚手架保姆级安装指南,Vue脚手架保姆级安装指南,从零开始教你如何安装Vue脚手架
  • 如何在树莓派 Raspberry Pi中本地部署一个web站点并实现无公网IP远程访问,树莓派上本地部署Web站点及无公网IP远程访问指南,树莓派部署Web站点及无公网IP远程访问指南,本地部署与远程访问实践,树莓派部署Web站点及无公网IP远程访问实践指南,树莓派部署Web站点及无公网IP远程访问实践指南,本地部署与远程访问详解,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南。
  • vue2技术栈实现AI问答机器人功能(流式与非流式两种接口方法),Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法探究,Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法详解
  • 发表评论

    快捷回复:表情:
    评论列表 (暂无评论,0人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码