1. 程式人生 > >Unity連線MySql,做一個簡單的登入系統

Unity連線MySql,做一個簡單的登入系統

有過開發經驗的同學都應該知道,資料庫在與程式連線時,一般都需要相應的驅動包,這裡我們以MySql與Unity3D連線為例

一、準備所需要的全部程式集

1、首先從D:\Unity\Editor\Data\Mono\lib\mono\2.0(Unity安裝目錄)中找到以下5個dll檔案

2、下載所需要的MySql驅動包:(MySql驅動包需要與Unity版本對應,比如我用的Unity2017.1.1,只能支援.net 3.5及以下的版本,所以下載的時候,請讓MySql.Data.dll支援的版本小於或等於你的Unity支援的版本),另外MySql.Data.dll可以去MySql官網下載Connector安裝

下面是我整理的所需要的檔案:

3、建立Unity專案,建立所需要的介面(為了方便使用,此處我直接使用UGUI搭建):

4、將所需要的dll檔案全部放入Plugins資料夾中,並做好資料夾和場景物體的歸類

5、建立C#類,為了方便使用和管理,我們直接封裝一些Sql語句,在這裡,如果你在using MySql.Data.MySqlClient不成功時,再次確認你的MySql.Data檔案在Inspector面板下是否報錯!如果報錯,換個對應版本的dll

public class MySqlAccess {

    //連線類物件
    private static MySqlConnection mySqlConnection;
    //IP地址
    private static string host;
    //埠號
    private static string port;
    //使用者名稱
    private static string userName;
    //密碼
    private static string password;
    //資料庫名稱
    private static string databaseName;

    //string sqlCon = "server=localhost;user id=root;password=WANGshuai123...;data=userTable";

    /// <summary>
    /// 構造方法
    /// </summary>
    /// <param name="_host">ip地址</param>
    /// <param name="_userName">使用者名稱</param>
    /// <param name="_password">密碼</param>
    /// <param name="_databaseName">資料庫名稱</param>
    public MySqlAccess(string _host,string _port, string _userName, string _password, string _databaseName) {
        host = _host;
        port = _port;
        userName = _userName;
        password = _password;
        databaseName = _databaseName;
        OpenSql();
    }

    /// <summary>
    /// 開啟資料庫
    /// </summary>
    public void OpenSql() {
        try {
            string mySqlString = string.Format("Database={0};Data Source={1};User Id={2};Password={3};port={4}"
                , databaseName, host, userName, password, port);
            mySqlConnection = new MySqlConnection(mySqlString);
            //if(mySqlConnection.State == ConnectionState.Closed)
            mySqlConnection.Open();

        } catch (Exception e) {
            throw new Exception("伺服器連線失敗,請重新檢查MySql服務是否開啟。" + e.Message.ToString());
        }

    }

    /// <summary>
    /// 關閉資料庫
    /// </summary>
    public void CloseSql() {
        if (mySqlConnection != null) {
            mySqlConnection.Close();
            mySqlConnection.Dispose();
            mySqlConnection = null;
        }
    }

    /// <summary>
    /// 查詢資料
    /// </summary>
    /// <param name="tableName">表名</param>
    /// <param name="items">要查詢的列</param>
    /// <param name="whereColumnName">查詢的條件列</param>
    /// <param name="operation">條件操作符</param>
    /// <param name="value">條件的值</param>
    /// <returns></returns>
    public DataSet Select(string tableName, string[] items, string[] whereColumnName,
        string[] operation, string[] value) {

        if (whereColumnName.Length != operation.Length || operation.Length != value.Length) {
            throw new Exception("輸入不正確:" + "要查詢的條件、條件操作符、條件值 的數量不一致!");
        }
        string query = "Select " + items[0];
        for (int i = 1; i <items.Length; i++) {
            query += "," + items[i];
        }

        query += " FROM " + tableName + " WHERE " + whereColumnName[0] + " " + operation[0] + " '" + value[0] + "'";
        for (int i = 1; i < whereColumnName.Length; i++) {
            query += " and " + whereColumnName[i] + " " + operation[i] + " '" + value[i] + "'";
        }
        return QuerySet(query);

    }

    /// <summary>
    /// 執行SQL語句
    /// </summary>
    /// <param name="sqlString">sql語句</param>
    /// <returns></returns>
    private DataSet QuerySet(string sqlString) {
        if (mySqlConnection.State == ConnectionState.Open) {
            DataSet ds = new DataSet();
            try {
                MySqlDataAdapter mySqlAdapter = new MySqlDataAdapter(sqlString, mySqlConnection);
                mySqlAdapter.Fill(ds);
            } catch (Exception e) {
                throw new Exception("SQL:" + sqlString + "/n" + e.Message.ToString());
            } finally {
            }
            return ds;
        }
        return null;
    }
}

這裡我們只封裝一個查詢的方法,想寫註冊修改等功能的,可以自行封裝,不會Sql語句的請自行學習

6、建立Unity指令碼,這裡我通過實現介面來監聽點選事件

public class UserLogin : MonoBehaviour, IPointerClickHandler {

    public InputField userNameInput;

    public InputField passwordInput;
    //提示使用者登入資訊
    private Text loginMessage;

    //IP地址
    public string host;
    //埠號
    public string port;
    //使用者名稱
    public string userName;
    //密碼
    public string password;
    //資料庫名稱
    public string databaseName;
    //封裝好的資料庫類
    MySqlAccess mysql;


    private void Start() {
        loginMessage = GameObject.FindGameObjectWithTag("LoginMessage").GetComponent<Text>();
        mysql = new MySqlAccess(host, port, userName, password, databaseName);
    }

    public void OnPointerClick(PointerEventData eventData) {
        if (eventData.pointerPress.name == "loginButton") {     //如果當前按下的按鈕是註冊按鈕 
            OnClickedLoginButton();
        }
    }

    /// <summary>
    /// 按下登入按鈕
    /// </summary>
    private void OnClickedLoginButton() {
        mysql.OpenSql();
        string loginMsg = "";
        DataSet ds = mysql.Select("usertable", new string[] { "level" }, new string[] { "`" + "account" + "`", "`" + "password" + "`" }, new string[] { "=", "=" }, new string[] { userNameInput.text, passwordInput.text });
        if (ds != null) {
            DataTable table = ds.Tables[0];
            if (table.Rows.Count > 0) {
                loginMsg = "登陸成功!";
                loginMessage.color = Color.green;
                Debug.Log("使用者許可權等級:" + table.Rows[0][0]);
            } else {
                loginMsg = "使用者名稱或密碼錯誤!";
                loginMessage.color = Color.red;
            }
            loginMessage.text = loginMsg;
        }
        mysql.CloseSql();
    }

}

7、將指令碼掛到loginButton上,配置好ip地址與埠號等資料

如果你的資料庫在本機,ip地址可以寫localhost或者127.0.0.1或者你本機的私有ip地址都可以,MySql的預設埠號為3306,這樣,一個簡單的登入功能就做好了!

注:這裡有一個坑,就是為什麼我要在這裡用InputFiled而不是直接用它裡面的Text獲取:

這是因為,在inputField中有一個Content選項,可以選擇為Password型別,可以將你輸入的文字變為***,如果這裡你選擇了它,而你獲取的是它的節點Text.text,那麼,你得到的文字,也是***,所以,在獲取的時候,你需要從InputFiled.text中才能獲取到真正的值!

接下來!釋出到各個平臺,注意,釋出到Android平臺時,公司名、專案名的簽名要一致,另外,需要選.net 2.0,剩下的大家根據興趣來吧: