【Unity+MySQL】实现注册登录系统(封装版)

这篇具有很好参考价值的文章主要介绍了【Unity+MySQL】实现注册登录系统(封装版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


接着 上篇文章的注册登录系统,这篇文章将MySQL相关操作封装,在Unity交互脚本中直接调用封装的方法。

1 MySQL封装

编写一个DBConnector脚本,封装MySQL中常用的操作,如连接数据库、关闭数据库、查询数据库、除查询外的插入、更新、删除等操作。

using System;
using System.Data;
using MySql.Data.MySqlClient;


namespace Utils
{
    public class DBConnector
    {
        private string connectionString; // 存储 MySQL 连接字符串
        private MySqlConnection connection; // 存储 MySQL 连接实例

        // 构造函数,接收 MySQL 连接参数
        public DBConnector(string server, string database, string uid, string password)
        {
            // 创建 MySQL 连接字符串
            connectionString = $"Server={server};Database={database};Uid={uid};Pwd={password};";
        }

        // 打开 MySQL 连接
        public bool OpenConnection()
        {
            try
            {
                // 创建 MySQL 连接实例
                connection = new MySqlConnection(connectionString);
                // 打开 MySQL 连接
                connection.Open();
                return true;
            }
            catch (MySqlException ex)
            {
                // 输出连接错误信息
                Console.WriteLine(ex.Message);
                return false;
            }
        }

        // 关闭 MySQL 连接
        public bool CloseConnection()
        {
            // 判断连接是否为空
            if (connection == null)
            {
                return false;
            }
            try
            {
                // 关闭 MySQL 连接
                connection.Close();
                return true;
            }
            catch (MySqlException ex)
            {
                // 输出错误信息
                Console.WriteLine(ex.Message);
                return false;
            }
        }

        /// <summary>
        /// 向指定的 MySQL 数据库发送 SQL 语句并返回结果
        /// </summary>
        /// <param name="query">接受一个字符串作为参数表示查询</param>
        /// <returns></returns>
        public DataTable SelectQuery(string query)
        {
            // 创建 empty DataTable,存储返回的结果
            var dataTable = new DataTable();
            // 创建一个命令对象,以便在数据库上执行查询
            var command = new MySqlCommand(query, connection);
            // 执行查询并返回结果
            var reader = command.ExecuteReader();
            // 将查询结果加载到 DataTable 中
            dataTable.Load(reader);
            // 关闭数据读取器对象
            reader.Close();
            // 返回查询结果
            return dataTable;
        }

        /// <summary>
        /// 执行非查询语句(如 Insert, Update, Delete)
        /// </summary>
        /// <param name="query">非查询语句</param>
        public void ExecuteNonQuery(string query)
        {
            // 创建命令对象
            var command = new MySqlCommand(query, connection);
            // 执行非查询语句
            command.ExecuteNonQuery();
        }
    }
}

2 用户注册、登录方法封装

编写一个User脚本用于封装用户注册、登录方法,供Unity交互脚本直接调用。

using System;
using Utils;

public class User
{
    private DBConnector dbConnector; // 数据库连接器

    // 构造函数,传入用于连接数据库的连接器
    public User(DBConnector dbConn)
    {
        dbConnector = dbConn; // 保存连接器对象
    }

    // 用户注册
    public int Register(string username, string password)
    {
        // 查询用户名的数量
        var query1 = $"SELECT COUNT(*) FROM usersinfo WHERE username = '{username}'";
        // 插入一条新用户记录
        var query2 = $"INSERT INTO usersinfo (username, password) VALUES ('{username}', '{password}')";

        // 尝试与数据库建立连接
        if (dbConnector.OpenConnection() == true)
        {
            try
            {
                // 执行查询用户名数量的语句
                var dataTable = dbConnector.SelectQuery(query1);
                // 从查询结果中获取数量
                int count = int.Parse(dataTable.Rows[0][0].ToString());

                if (count > 0) // 如果已存在同名用户
                {
                    dbConnector.CloseConnection(); // 关闭连接
                    return 2; // 用户名已存在
                }

                dbConnector.ExecuteNonQuery(query2); // 执行插入语句插入新用户记录
                dbConnector.CloseConnection(); // 关闭连接
                return 1; // 注册成功
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                dbConnector.CloseConnection();
                return 4; //插入数据失败
            }
        }
        else
        {
            return 3; //连接错误
        }
    }

    // 用户登录
    public int Login(string username, string password)
    {
        // 查询指定用户名的记录
        var query = $"SELECT * FROM usersinfo WHERE username = '{username}' LIMIT 1";

        // 尝试与数据库建立连接
        if (dbConnector.OpenConnection() == true)
        {
            // 执行查询指定用户名记录的语句
            var dataTable = dbConnector.SelectQuery(query);

            // 查询用户输入的用户名是否存在于数据库中
            if (dataTable.Rows.Count == 1)
            {
                // 获取查询结果中的用户密码
                string storedPassword = dataTable.Rows[0]["password"].ToString();
                // 如果密码与输入密码匹配
                if (storedPassword == password)
                {
                    dbConnector.CloseConnection(); // 关闭连接
                    return 1; // 登录成功
                }
                else
                {
                    dbConnector.CloseConnection(); // 关闭连接
                    return 2; // 密码错误
                }
            }
            else
            {
                dbConnector.CloseConnection(); // 关闭连接
                return 3; // 用户名不存在
            }
        }
        else
        {
            return 4; // 连接错误
        }
    }
}

其中,由于注册和登录时有各种不一样的情况,这里使用枚举将这些情况列出:

namespace Static
{
    public class StaticData
    {
        public enum RegisterCode
        {
            RegisterSuccess = 1, // 注册成功
            UsernameDoesExist = 2, // 用户名已存在
            ConnectionError = 3, // 连接错误
            InsertDataError = 4, // 插入数据失败
        };
        public enum LoginCode
        {
            LoginSuccess = 1, // 登录成功
            IncorrectPassword = 2, // 密码不正确
            UsernameDoesNotExist = 3, // 用户名不存在
            ConnectionError = 4, //连接错误
        };
    }
}

3 Unity交互

在与Unity交互时,UI界面沿用之前的不用做更改。
这里编写一个UsersManager脚本继承于MonoBehaviour,用于管理用户的注册登录。

using System.Security.Cryptography;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
using Utils;

public class UsersManager : MonoBehaviour
{
    // 注册UI和登录UI
    public GameObject RegisterUI;
    public GameObject LoginUI;

    // 用户名输入框和密码输入框
    public InputField usernameInputField;
    public InputField passwordInputfield;

    // 注册消息和登录消息
    public Text registerMessage;
    public Text loginMessage;

    // DBConnector类实例化
    public DBConnector connector = new DBConnector("localhost","unitygame","root","123456");

    // User类实例化
    public User user;
    void Start()
    {
        // 初始化UI状态
        LoginUI.SetActive(true);
        RegisterUI.SetActive(false);

        //连接数据库
        user = new User(connector);
    }

    // 加密密码
    private static string HashPassword(string password)
    {
        SHA256Managed crypt = new SHA256Managed();
        StringBuilder hash = new StringBuilder();
        byte[] crypto = crypt.ComputeHash(Encoding.UTF8.GetBytes(password));
        foreach (byte theByte in crypto)
        {
            hash.Append(theByte.ToString("x2"));
        }
        return hash.ToString();
    }

    // 注册逻辑
    public void OnRegister()
    {
        // 从输入框获取用户名和密码
        string username = usernameInputField.text;
        //使用哈希进行加密
        string password = HashPassword(passwordInputfield.text);

        if (username == "" || password == "")
        {
            registerMessage.text = "账号或密码不能为空";
        }

        else
        {
            int code = user.Register(username, password);
            if (code == 1)
            {
                Debug.Log("注册成功");
                registerMessage.text = "注册成功";
            }
            else if(code == 2)
            {
                Debug.Log("用户名已存在,请选择不同的用户名!");
                registerMessage.text = "用户名已存在,请选择不同的用户名!";
            }
            else
            {
                Debug.Log("注册失败");
                registerMessage.text = "注册失败";
            }
        }
        //清空输入框
        usernameInputField.text = "";
        passwordInputfield.text = "";
    }

    // 登录逻辑
    public void OnLogin()
    {
        // 从输入框获取用户名和密码
        string username = usernameInputField.text;
        //使用哈希进行加密
        string password = HashPassword(passwordInputfield.text);

        if (username == "" || password == "")
        {
            loginMessage.text = "账号或密码不能为空";
        }
        else
        {
            int code = user.Login(username, password);
            if (code == 1)
            {
                Debug.Log("登录成功");
                loginMessage.text = "登录成功";
            }
            else if(code == 2)
            {
                Debug.Log("登录失败:密码错误");
                loginMessage.text = "登录失败:密码错误";
            }
            else if(code == 3)
            {
                Debug.Log("登录失败:用户名不存在");
                loginMessage.text = "登录失败:用户名不存在";
            }
            else
            {
                Debug.Log("登录失败");
                loginMessage.text = "登录失败";
            }
        }
        //清空输入框
        usernameInputField.text = "";
        passwordInputfield.text = "";
    }
}

在Unity中新建一个空物体UsersManager,并将UsersManager脚本挂载在该物体上,将对应的变量拖拽即可:
unity 登录系统,Unity,数据库,笔记,mysql,unity,数据库
删除或隐藏之前的DataManager物体,并将注册和登录按钮上的事件绑定修改为UserManager中对应的注册和登录方法即可。
unity 登录系统,Unity,数据库,笔记,mysql,unity,数据库
unity 登录系统,Unity,数据库,笔记,mysql,unity,数据库
接下来,就可以测试运行了,结果与之前是一样的。

封装的写法让整个程序的逻辑结构更加清晰。

4 系列文章

  1. 【Unity+MySQL】实现简单的注册登录系统

  2. 【Unity+MySQL】实现注册登录系统(升级版)

  3. 【Unity+MySQL】实现注册登录系统(封装版)文章来源地址https://www.toymoban.com/news/detail-752699.html

到了这里,关于【Unity+MySQL】实现注册登录系统(封装版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity实现账号登录,注册功能

    制作了用户登录界面  关于弹窗使用了DOTween插件,实现渐隐渐显效果。 关于账号使用了本地Json读取, 默认账号:YSQS/YSQS1 密码:admin/admin1 注册功能其实应该重构的因为有二次读流的问题存在。 账号注册加入了邀请码(其实就一个if)  接下来就是我那臭死了的源码。 GameSt

    2024年02月11日
    浏览(42)
  • Unity3D制作注册登录界面,并实现场景跳转

    效果预览图片: 效果预览视频: 一、新建项目工程 1、打开Unity3D,新建一个项目,将其命名为“Login”。我这里用的版本是Unity2018.4.2f1,不同版本制作过程中的界面可能稍有不同,但是不影响具体功能的实现。 2、可以将样例场景SampleScene重命名为Login,最好做到见名知意。

    2024年02月03日
    浏览(76)
  • Unity进阶–通过PhotonServer实现联网登录注册功能(客户端)–PhotonServer(三)

    单例泛型类 ManagerBase 消息中心 manager下的组件基础 uiManager(绑在canvas上) PhotonManager 搭个页面 panel上挂上脚本 绑定对象,绑定事件

    2024年02月12日
    浏览(88)
  • 基于Unity客户端与服务端实现登录与注册以及多人在线聊天

    1.在Unity下,创建一个GameManager空对象,用于启动客户端连接以及实例化一个登录页面LoginView的Prefab,并将脚本LoginView挂载在上面。 2.创建一个Client类,用于客户端向服务端发起连接请求,并且发送给服务端消息以及接收服务端的响应 3.创建一个脚本LoginView挂载在LoginView对象上

    2024年04月16日
    浏览(49)
  • Unity进阶--通过PhotonServer实现联网登录注册功能(服务器端)--PhotonServer(二)

    如何配置PhotonServer服务器:https://blog.csdn.net/abaidaye/article/details/132096415 大体结构图 结构图示意 BLL层(控制层) 总管理类 控制层接口 登录注册控制类 DAL层(数据控制层) 总数据管理层 登录注册数据管理层 模型层 登录注册层 DLC 服务器配置类 发送消息类 以及消息类 服务器

    2024年02月14日
    浏览(42)
  • unity链接MySQL数据库,并实现游戏数据的存储和读取。(一)

    先说明一下,本次测试中MySQL是安装在本机上的,如果你要想实现在任何地方访问你的数据库建议使用阿里云的RDS云数据库,你需要注册一个阿里云的账号,然后购买实例等等,这些购买实例、创建白名单、创建数据库、创建账号等在阿里云的帮助文档里都写的很详细了,翻

    2024年02月07日
    浏览(45)
  • Java--用户登录/注册界面(连接Mysql数据库)并可以通过验证码登录

    1 效果展示 (1)登录界面 (2)注册界面 (3)动图展示 2 内容说明 (1)开发前,需引入一个连接Mysql 数据库驱动mysql-connector-java-5.1.30-bin.jar包 提取码:6666 (2)构建路径 (3)需要下载xampp软件 xampp软件下载 提取码:2255 xampp软件包含 Apache Web服务器、 Mysql Web服务器、Filezilla

    2024年02月09日
    浏览(60)
  • 【Unity之UI编程】如何用UGUI搭建一个登录注册面板

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : UI_Unity专栏 🅰️ **** 逻辑:没有输入账号密码按下登录的时候打开提示面板,按下确定后返回并移除面板(淡入淡出效果显示) 逻辑:

    2024年01月23日
    浏览(45)
  • (代码注释超详细)JavaWeb连接Mysql数据库完成登录注册业务

    登录:完成连接数据库判断登陆信息是否有误 注册:将信息填写完毕后点击注册,跳转到登陆页面 主页:展示项目信息并且可以在页面内进行增删改操作 完整文件目录如下: 文件目录: bean包中填写的代码为实体类 dao模型就是写一个类,把访问数据库的代码封装起来 serv

    2023年04月22日
    浏览(92)
  • Unity使用leancloud开发弱数据联网游戏(注册、登录和云端数据存读)

    最近,由于开发需要数据存储服务,就跑去Bmob看看,不看不要紧,发现自己以前创建的应用的数据存储服务居然变成非永久的了,只有一年的免费时间,而且还过期了。这对于我将要开发的软件时很不友好的;因此,我就只能去找与Bmob同类型的后端云服务,就是我接下来要

    2023年04月23日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包