Unity 資料寫入MySql做法,大致上兩種做法,一種是透過PHP方式來當媒介方式,進行寫入。
另一種則是透過MySQL Community提供Dll 方式直接寫入。
此篇介紹就是以MySQL Community提供Dll方式來進行實踐,但是會有一些版本的問題存在,此篇 Unity 2018版本
MySQL Community 可到這個網站下載,但是要測試可以用的版本~
為了方面實踐,以下我提供兩個載點:
載點2 提取码:nunc (也可以掃以下二維碼下載)
再來就是我們要下載 Xampp了,之記得安裝正確。
安裝結束後,打開軟體會呈現這個畫面
再點Admin開啟Mysql 網頁版,建立資料庫與資料表,可以查看Mysql 指令方式來建立。
Mysql 指令許多網站都有整理出來: 凍仁大大整理的筆記之分享(MySql 指令)~~
再此 感謝整理Mysql指令大大的辛苦。
建立資料庫與資料表後,呈現以下圖片 (此篇只建立 ID與姓名)
再來就是程式部分了。
本篇習慣介面物件,都以程式方式來撰寫,比較不會到介面下,進行操作調整。
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 網頁重新整理~
如果我們要查詢資料庫是否有小花結果:
如果發現到發佈之後,無法寫入資料庫,但是在Unity軟體上執行正常,表示缺少Dll 檔案。
缺少檔案: 可以到Unity安裝路徑下:
Unity → Editor → Data → Mono → lib → mono → 2.0
I18N的相關檔案複製到Unity專案目錄下貼上試試。