unity连接mysql

记录一下unity连接mysql数据库所遇到的大坑子

准备事项:
1、安装mysql、unity、visual studio,不再赘述。
2、从unity安装目录(unity安装目录\Editor\Data\Mono\lib\mono\2.0),找到这几个文件,拷贝至unity项目Assets文件夹下。
unity连接mysql_第1张图片

其中的MySql.Data.dll需要自己下载
链接https://pan.baidu.com/s/1wR5YsMu08HA_wr4DbfFOHA 提取码6i18
我测试的时候没拷System.Data.dll和System.Drawing.dll,拷了会报错

测试链接:
1、unity新建C#脚本,随便拖到一个物体上,用VS打开编辑
点击菜单栏 项目-管理NuGet,如下图
unity连接mysql_第2张图片
输入MySql.Data搜索安装源包
unity连接mysql_第3张图片
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、运行测试
unity连接mysql_第4张图片

连接失败,完美拉稀!GOOD!

查找原因发现,连接字符串中用localhost不行,改成127.0.0.1,连接成功
unity连接mysql_第5张图片

参考博客 关于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());
        //}
    }
}

服务器处理请求,操作数据库的代码这里就就不贴出来了,网上一搜一大堆。

你可能感兴趣的:(Unity3D)