close

Unity 資料寫入MySql做法,大致上兩種做法,一種是透過PHP方式來當媒介方式,進行寫入。

另一種則是透過MySQL Community提供Dll 方式直接寫入。

此篇介紹就是以MySQL Community提供Dll方式來進行實踐,但是會有一些版本的問題存在,此篇 Unity 2018版本

MySQL Community 可到這個網站下載,但是要測試可以用的版本~

為了方面實踐,以下我提供兩個載點:

載點1

載點2  提取码:nunc (也可以掃以下二維碼下載)

CD9527EDCD234A2BC1CBE2FFC085627C

再來就是我們要下載 Xampp了,之記得安裝正確。

Xampp 載點

安裝結束後,打開軟體會呈現這個畫面

螢幕擷取畫面 2021-08-05 045747

再點Admin開啟Mysql 網頁版,建立資料庫與資料表,可以查看Mysql 指令方式來建立。

Mysql 指令許多網站都有整理出來:  凍仁大大整理的筆記之分享(MySql 指令)~~

再此 感謝整理Mysql指令大大的辛苦。

建立資料庫與資料表後,呈現以下圖片 (此篇只建立 ID與姓名)

螢幕擷取畫面 2021-08-05 045747

再來就是程式部分了。

本篇習慣介面物件,都以程式方式來撰寫,比較不會到介面下,進行操作調整。

ScriptName: InterfaceObj  介面物件設定

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;

public class InterfaceObj : MonoBehaviour
{
    // 輸入介面
    public InputField inputField(InputField inputField, float pointX, float pointY, float sizeX, float sizeY)
    {
        inputField.transform.position = new Vector2(Screen.width / 2 * pointX, Screen.height / 2 * pointY);
        inputField.image.rectTransform.sizeDelta = new Vector2(Screen.width / 2 * sizeX, Screen.height / 2 * sizeY);

        return inputField;
    }

    // 文字顯示
    public Text text(Text text, string message, float pointX, float pointY, float sizeX, float sizeY)
    {
        text.transform.position = new Vector2(Screen.width / 2 * pointX, Screen.height / 2 * pointY);
        text.rectTransform.sizeDelta = new Vector2(Screen.width/2 * sizeX, Screen.height /2 * sizeY);

        text.text = message;
        text.fontSize = 16;
        text.fontStyle = FontStyle.Normal;
        text.color = Color.black;

        return text;
    }

    // 按鈕
    public Button button(Button button, string btnMessage, UnityAction onClick, float pointX, float pointY, float sizeX, float sizeY)
    {
        button.transform.position = new Vector2(Screen.width / 2 * pointX, Screen.height / 2 * pointY);
        button.image.rectTransform.sizeDelta = new Vector2(Screen.width / 2 * sizeX, Screen.height / 2 * sizeY);

        Text buttonName = button.transform.GetChild(0).GetComponent<Text>();
        buttonName.name = "buttonName";
        buttonName.text = btnMessage;

        button.onClick.AddListener(onClick);

        return button;
    }
}

程式注意: 

using UnityEngine.Events; 要記得匯入,不然按鈕無法進行探聽事件。

  •   UnityAction onClick
  •   button.onClick.AddListener(onClick);

-------------------------------

Script Name: Layout 介面執行

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Layout : InterfaceObj
{
    // 介面物件
    public Button enter_btn;
    public InputField name_Input;
    public Text name_Text;
    public Text disPlayMessage;

    // 輸入數值
    private string name;

    // 查詢介面物件
    public InputField inquireName_Input;
    public Text inquireName_Text;
    public Button inquireEnter_Button;
    public Text inquireDisPlayerMessage;

    // 查詢名稱
    private string inquireName;

    // 資料表名稱
    private string tableName = "member";

    public float pointX, pointY;

    private void Start()
    {
        text(name_Text, "姓名", 0.16f, 1.78f, 0.1f, 0.1f);
        button(enter_btn, "確定", enter_OnClick, 0.79f, 1.8f, 0.3f, 0.15f);

        // 查詢
        text(inquireName_Text, "姓名", 0.16f, 1.23f, 0.1f, 0.1f);
        button(inquireEnter_Button, "查詢", inquireEnter_OnClick, 0.8f, 1.24f, 0.3f, 0.15f);
    }

    private void Update()
    {
        name = inputField(name_Input, 0.43f, 1.8f, 0.4f, 0.15f).text;
        
        // 判斷是否輸入
        if (name_Input.text == "")
            enter_btn.interactable = false;
        else enter_btn.interactable = true;
        
        text(disPlayMessage, "連接資料庫訊息: " + MySqlClass.result + ",  寫入訊息: " + MySqlClass.disPlayerRead, 1f, 1.55f,1.5f, 0.1f);


        // 查詢
        inquireName = inputField(inquireName_Input, 0.43f, 1.24f, 0.4f, 0.15f).text;

        if (inquireName_Input.text == "")
            inquireEnter_Button.interactable = false;
        else inquireEnter_Button.interactable = true;

        text(inquireDisPlayerMessage, "連接資料庫訊息: " + MySqlClass.result + ",  查詢訊息: " + MySqlClass.disPlayInquire, 1f, 1f, 1.5f, 0.1f);
    }

    // 查詢
    void inquireEnter_OnClick()
    {
        openDataBase();

        MySqlClass.INQUIRE_TABLE(tableName, inquireName);
        MySqlClass.closeSqlConnection();
    }

    void enter_OnClick()
    {
        openDataBase();

        MySqlClass.WriteTable(tableName, name);

        MySqlClass.closeSqlConnection();
    }

    private void OnApplicationQuit()
    {
        MySqlClass.closeSqlConnection();
    }

    void openDataBase()
    {
        string connectionString = string.Format("Server = {0}; Database = {1}; UserID = {2}; Password = {3};", MySqlClass.hostType, MySqlClass.dataBaseType, MySqlClass.idType, MySqlClass.passWordTpye);
        MySqlClass.openSqlConnection(connectionString);
        MySqlClass.myObjType = MySqlClass.GetDataSet(connectionString);
    }
}

程式注意:

OnApplicationQuit(); 關閉應用程式的,主要關閉Mysql 連接,如果有寫執行續(Thread)也需要用到。

------------------------------------

Script Name:  MySqlClass 執行資料庫動作

using System.Collections.Generic;
using System.Data;
using System;
using MySql.Data.MySqlClient;
using System.Text;
using UnityEngine;

public class MySqlClass
{
    // Just like MyConn.conn in Story Tolls before
    public static MySqlConnection dbConnection;

    // DataBase Ip
    private static string host = "127.0.0.1";
    public static string hostType
    {
        set { host = value; }
        get { return host; }
    }

    // DataBase user Id
    private static string id = "gsp40214";
    public static string idType
    {
        set { id = value; }
        get { return id; }
    }

    // DataBase Password
    private static string passWord = "123456";
    public static string passWordTpye
    {
        set { passWord = value; }
        get { return passWord; }
    }

    // DataBase Name
    private static string dataBase = "pixnet_test";
    public static string dataBaseType
    {
        set { dataBase = value; }
        get { return dataBase; }
    }

    // 連線結果
    public static string result = "";

    // 寫入結果
    public static string disPlayerRead = "";

    // 查詢結果
    public static string disPlayInquire = "";

    // DataSet
    private static DataSet myObj;
    public static DataSet myObjType
    {
        set { myObj = value; }
        get { return myObj; }
    }

    // Connect to database
    public static void openSqlConnection(string connectionString)
    {
        dbConnection = new MySqlConnection(connectionString);
        dbConnection.Open();
        result = dbConnection.ServerVersion;
    }

    // closeSql
    public static void closeSqlConnection()
    {
        dbConnection.Close();
        dbConnection = null;
    }

    // MySQL Query
    public static void doQuery(string sqlQuery)
    {
        IDbCommand dbCommand = dbConnection.CreateCommand();
        dbCommand.CommandText = sqlQuery;
        IDataReader reader = dbCommand.ExecuteReader();
        reader.Close();
        reader = null;
        dbCommand.Dispose();
        dbCommand = null;
    }

    #region Get DataSet
    public static DataSet GetDataSet(string sqlString)
    {
        DataSet ds = new DataSet();

        try
        {
            MySqlDataAdapter da = new MySqlDataAdapter(sqlString, dbConnection);
        }
        catch (Exception e)
        {
            throw new Exception("SQL:" + sqlString + "\n");
            e.Message.ToString();
        }
        return ds;
    }
    #endregion

    // 轉utf8
    public static string messageToUtf8(string message)
    {
        UTF8Encoding encoder = new UTF8Encoding();
        byte[] bytes = Encoding.UTF8.GetBytes(message);
        string utf8ReturnString = encoder.GetString(bytes);

        return utf8ReturnString;
    }

    static string ID;
    static string Message;

    // 寫入資料表
    public static void WriteTable(string DataBaseTable, string message)
    {
        MySqlCommand command = dbConnection.CreateCommand();

        string sqlText = "select count(1) from " + DataBaseTable + " where name=('" + message + "')";

        MySqlCommand cmd1 = new MySqlCommand(sqlText, dbConnection);
        int count = (int)(long)cmd1.ExecuteScalar();

        if (count > 0)
        {
            Debug.Log("已經有資料囉");
            disPlayerRead = "已經有資料囉";

        }
        else
        {         
            Message = messageToUtf8(message);

            command.CommandText = "Insert into " + DataBaseTable + "(id, name) value('" + ID + "','" + Message + "')";
            command.ExecuteNonQuery();

            disPlayerRead = "載入資料成功";
            Debug.Log("載入資料成功");
        }
    }

    // 資料庫查詢
    public static void INQUIRE_TABLE(string dataBaseTitle, string message)
    {
        string sqlText = "select * from " + dataBaseTitle + " where name='" + message + "'";

        MySqlCommand cmd = new MySqlCommand(sqlText, dbConnection);
        MySqlDataReader data = cmd.ExecuteReader();

        while (data.Read())
        {
            try
            {
                disPlayInquire = "資料庫裡面有資料: " + data[1];
            }
            catch (Exception e)
            {
                data.Close();
                closeSqlConnection();
            }
        }

        data.Close();
    }
}

程式注意:

"Insert into " + DataBaseTable + "(id, name) value('" + ID + "','" + Message + "')";  資料庫寫入語法

"select * from " + dataBaseTitle + " where name='" + message + "'";   資料庫查詢語法

 data[1]; 裡面數字代表資料表欄位編號。

如果MySQL有增加新的使用者記得設定權限,否則也會連接失敗。

----------------------------------

發佈後 執行結果: 

寫入資料庫,記得Mysql 網頁重新整理~

image

如果我們要查詢資料庫是否有小花結果:

image

 

如果發現到發佈之後,無法寫入資料庫,但是在Unity軟體上執行正常,表示缺少Dll 檔案。

缺少檔案: 可以到Unity安裝路徑下:

Unity → Editor → Data → Mono → lib → mono → 2.0 

I18N的相關檔案複製到Unity專案目錄下貼上試試。

 

arrow
arrow
    文章標籤
    unity教學 mysql教學
    全站熱搜
    創作者介紹
    創作者 Xauxas 的頭像
    Xauxas

    Xauxas 筆記

    Xauxas 發表在 痞客邦 留言(0) 人氣()