记录一下unity连接mysql数据库所遇到的大坑子
准备事项:
1、安装mysql、unity、visual studio,不再赘述。
2、MySql.Data.dll文件
MySql.Data.dll需要自己下载
链接 https://pan.baidu.com/s/1wR5YsMu08HA_wr4DbfFOHA 提取码6i18
网上很多人说还要其他文件,我测试时只需要这一个就行了
测试链接:
1、unity新建C#脚本,随便拖到一个物体上,用VS打开编辑
点击菜单栏 项目-管理NuGet,如下图
输入MySql.Data搜索安装源包
2、编代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MySql.Data.MySqlClient;
using System;
public class ConnTest: MonoBehaviour
{
// mysql连接字符串
static String ConnetStr = "Server=localhost;Database=simulation;User ID=root;Password=lalala123;Port=3306;";
MySqlConnection conn = null;
// Start is called before the first frame update
void Start()
{
// 创建连接
conn = new MySqlConnection(ConnetStr);
try
{
conn.Open(); // 打开通道,建立连接
Debug.Log("连接成功...");
// 增、删、改、查的操作
}
catch(MySqlException ex)
{
// 打印异常信息
Debug.Log(ex.Message);
}
finally
{
// 关闭连接
if (conn != null)
conn.Close();
}
}
// Update is called once per frame
void Update()
{
}
}
3、运行测试
额。。。
查找原因发现,连接字符串中用localhost不行,改成127.0.0.1,连接成功
参考博客 关于unity连接MySQL数据库做一个简单的登陆注册系统
【注意】
通过上面这种方式,发布到webGL后是不行的,这个问题我仍未解决,知道的大佬求告知。如果非要用webGL与数据库交互,只能另辟蹊径。我采用的这种方法:
unity向服务器发送请求,在服务器执行操作数据库的代码,然后将参数返回给unity,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using System;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
public class satellite_controller : MonoBehaviour
{
// 轨道6元素定义
private double a;
private double b;
private double e;
private double omega1;
private double omega2;
private double i;
private double flag;
// Start is called before the first frame update
void Start()
{
// 请求web服务器,获取返回参数。我这里是服务器查询数据库表的某条记录,返回json字符串给unity
StartCoroutine(GetSixElement()); // 要求实时性,用Update()里面的
}
// 解析http返回参数
IEnumerator GetSixElement()
{
UnityWebRequest www = UnityWebRequest.Get("http://127.0.0.1:8080/GetOrbitServlet");
yield return www.SendWebRequest();
if (www.isNetworkError || www.isHttpError)
{
Debug.Log(www.error); // 打印错误信息
}
else
{
// 获取返回参数
//Debug.Log(www.downloadHandler.text);
string result = www.downloadHandler.text;
// 解析json字符串
JObject jo = (JObject)JsonConvert.DeserializeObject(result);
a = Double.Parse((string)jo["a"]);
e = Double.Parse((string)jo["e"]);
b = a * Math.Sqrt(1 - e * e);
omega1 = Double.Parse((string)jo["RA"]);
omega2 = Double.Parse((string)jo["w"]);
i = Double.Parse((string)jo["i"]);
}
}
// Update is called once per frame
void Update()
{
//flag += Time.deltaTime * 18;
//if (flag >= 360)
//{
// flag = 0;
// StartCoroutine(GetSixElement());
//}
}
}
服务器处理请求,操作数据库的代码这里就就不贴出来了,网上一搜一大堆。