这段时间为了大作业,作为一个菜鸟研究了好久的Unity连接数据库,那就整理一下然后写下来当作记录吧。
首先,unity连接MySQL要先在Assets板上创建pluging文件夹再导入一些必要的dll文件,大部分的资料都说要在unity的安装目录(Unity\Editor\Data\Mono\lib\mono\2.0)下找到以下5个ddl文件一起放进文件夹里。
还有对应的mysql.Data.dll,这个可以去MySql官网下载Connector安装,但是需要注意的是MySql.Data.dll支持的版本要小于或等于你的Unity支持的版本,否则会报错。
需要注意的是,在实际操作的过程中,如果我往pluging文件夹中导入System.data.dll时会报错重复,因为是从安装目录复制进去的。所以经实际操作验证,只需要放进MySQL.Data.dll就可以连接成功了,我猜是因为其余5个文件我这个版本的unity可以每个项目都自行调用。我用的unity是2019.2.6的版本。当然最好还是先全部放进去,然后看看报不报错,如果不报错那就没关系。
我的习惯是先铺设好UI界面再进行脚本的构写。这是我的登陆界面,后面的动画是用particle system挂在摄像机上面做的
然后开始构建我的数据库跟表,也可以在前面设置一个ID列,但是要注意的是必须要把ID列设置成自增,要不然注册的时候会报错因为没有值。我为了方便就只设了用户名跟密码。
好了接下来就可以开始写脚本了,参考了这个博主的脚本https://blog.csdn.net/qq_39646949/article/details/99334589
这是注册的脚本,可以自行学习以下mysql的基本语句和与c#的连接
using MySql.Data.MySqlClient;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class register : MonoBehaviour
{
// Start is called before the first frame update
public InputField userNameInput;
public InputField passwordInput;
public GameObject sueccedUI;
public GameObject failUI;
void Start()
{
}
public void OnClickedButton()
{
Register(new string[] { userNameInput.text, passwordInput.text });
}
private void Register(string[] strRegister)
{
string connStr = "Database=cubestreet;datasource=localhost;port=3306;user=root;pwd=123456;";
MySqlConnection conn = new MySqlConnection(connStr);
conn.Open();
Debug.Log("数据库连接成功");
//先要查询一下目前数据库是否有重复的数据。
MySqlCommand myCommand = new MySqlCommand("select*from user", conn);
MySqlDataReader reader = myCommand.ExecuteReader();
List user = new List();
while (reader.Read())
{
string username = reader.GetString("name");
string password = reader.GetString("password");
user.Add(username);
}
//**避免账号重复。**
foreach (var item in user)
{
if (user.Contains(strRegister[0]))
{
Debug.Log("账号已存在!");
failUI.SetActive(true);//这个是我的提示界面
break;
}
else
{
reader.Close();//**先将查询的功能关闭。**
MySqlCommand cmd = new MySqlCommand("insert into user set name ='" + strRegister[0] + "'" + ",password='" + strRegister[1] + "'", conn);
cmd.Parameters.AddWithValue("name", strRegister[0]);
cmd.Parameters.AddWithValue("password", strRegister[1]);
cmd.ExecuteNonQuery();
Debug.Log("注册成功!");
sueccedUI.SetActive(true);//也是提示界面
break;
}
}
}
}
把这个脚本挂在按钮上测试一下,欸成功了!太棒了!好的那我们开始登陆脚本吧
using MySql.Data.MySqlClient;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class logtest : MonoBehaviour
{
public InputField userNameInput;
public InputField passwordInput;
public GameObject failUI;
public GameObject loseUI;
private AsyncOperation async;
[HideInInspector] public static int count = 0;
// Start is called before the first frame update
void Start()
{
}
public void OnClickedButton()
{
Login(new string[] { userNameInput.text, passwordInput.text });
}
// Update is called once per frame
private void Login(string[] str)
{
Dictionary myDic = new Dictionary();
myDic.Clear();
string connStr = "Database=cubestreet;datasource=localhost;port=3306;user=root;pwd=123456;";
MySqlConnection conn = new MySqlConnection(connStr);
Debug.Log("数据库连接成功");
conn.Open();
#region 查询
MySqlCommand cmd = new MySqlCommand("select * from user", conn);
MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
string username = reader.GetString("name");
string password = reader.GetString("password");
myDic.Add(username, password);
}
if (myDic.ContainsKey(str[0]))
{
Debug.Log("账号存在!");
string vale;
if (myDic.TryGetValue(str[0], out vale))
{
if (vale == str[1])
{
Debug.Log("登录成功!");
PlayerPrefs.SetString("username", userNameInput.text);
Debug.Log(PlayerPrefs.GetString("username"));
//判断是否跳转成功还有记录次数,不需要的可以不写下面直接用SceneManager.loadlevel来跳转
async = SceneManager.LoadSceneAsync("LevelMenu");
if (async.isDone)
{
count++;
}
PlayerPrefs.SetInt("menuload", count);
Debug.Log(PlayerPrefs.GetInt("menuload"));
}
else
{
Debug.Log("密码错误,请重新输入!");
failUI.SetActive(true);
}
}
}
else
{
Debug.Log("账号不存在!");
loseUI.SetActive(true);
}
#endregion
reader.Close();//关闭读取
conn.Close();//关闭与数据库的连接
}
}
挂在注册按钮上试一下,又成功了!太开心了吧
这样就完成了一个很简单的登陆注册功能,其实可以用另外的类来封装MySQL的语句,需要的时候直接调用也行。
用了之后才发现用mySql来做这个其实并不好,游戏如果发给别人,要是其他人没有mysql或者他的连接密码不一样,那这个功能也是无法实现的。
如果我的记录还能帮到别人那就太棒啦