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

2023-10-29

1 安装Unity引擎和Navicat软件

确保这两个软件都能够在你的计算机上良好地运行。

2 安装MySQL8.0数据库

2.1 下载msi文件

镜像地址:http://mirrors.sohu.com/mysql/MySQL-8.0/
在这里插入图片描述

2.2 安装MySQL Server 8.0

下载完成后双击运行msi文件。
Next→
在这里插入图片描述
Next→
在这里插入图片描述
选择自定义安装,
Next→
在这里插入图片描述
选择安装路径,
Next→
在这里插入图片描述
Install安装,
在这里插入图片描述
安装完成,Finish。

2.3 配置环境变量

此电脑→计算机→属性,
在这里插入图片描述
关于→高级系统设置,
在这里插入图片描述
高级→环境变量,
在这里插入图片描述
系统变量→双击Path,
在这里插入图片描述
新建→输入mysql安装目录\bin,
在这里插入图片描述
确定→确定→确定。

2.4 安装MySQL服务

现在如果使用以下命令连接数据库,会出现错误。

mysql -uroot -p

使用以下命令安装MySQL服务。

mysqld -install

在这里插入图片描述

2.5 开启MySQL服务

搜索“计算机管理”,
在这里插入图片描述
服务和应用程序→服务→MySQL→启动,
在这里插入图片描述
遇到如下问题:
在这里插入图片描述

  1. 找到 MySQL 的安装路径,看看有没有data文件夹,如果没有data文件夹,自己重新建一个;如果有的话,就把里面的内容全部清空,但保留该目录。

  2. 到安装路径下的bin路径下,使用如下命令初始化MySQL,并静待一段时间。

    mysqld --initialize
    
  3. 接着,输入如下命令启动MySQL:

    net start mysql
    

    在这里插入图片描述
    MySQL启动成功。

2.6 修改root密码

由于安装时没有设置密码,因此需要修改root密码。

  1. 以管理员身份运行 cmd,使用命令停止MySQL服务:
    net stop mysql
    
    在这里插入图片描述
  2. 执行以下命令进入安全模式,注意不要关掉此窗口 (窗口1),因为此时该CMD相当于开启了MySQL服务。
    mysqld --console --skip-grant-tables --shared-memory
    
    在这里插入图片描述
  3. 新开启一个CMD窗口(窗口2),执行下面的命令,表示切换至mysql数据库:
    mysql
    
    mysql> use mysql
    
    先将密码设置为空,刷新权限:
    update mysql.user set authentication_string="" where user="root";
    flush privileges;
    
    再修改密码为123456,更新刷新权限后退出mysql:
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
    flush privileges;
    quit
    
    在这里插入图片描述
  4. 关闭步骤2的CMD(窗口1),在当前CMD中(窗口2)中执行开启MySQL命令启动服务,接着就可以使用新密码登录数据库了。
    net start mysql
     mysql -u root -p
    
    在这里插入图片描述

3 Navicat中新建数据库

3.1 连接

打开Navicat软件,连接→MySQL…,
在这里插入图片描述
输入连接名和密码,
在这里插入图片描述

3.2 新建数据库

右键新建数据库,
在这里插入图片描述
填写数据库名,选择字符集与排序规则,
在这里插入图片描述
确定,新建数据库。

3.2 新建用户表

打开unitygame数据库,表→新建表,
在这里插入图片描述
点击添加字段,编辑表的各项字段和数据类型,
在这里插入图片描述
Ctrl+S保存该数据表,输入表名,

在这里插入图片描述

4 Unity中实现交互功能

4.1 Unity中使用UI搭建注册登录界面

在这里插入图片描述
两个输入框分别输入用户名和密码,两个按钮分别实现注册和登录。

4.2 DatabaseManager脚本实现注册登录功能

Unity中新建一个DatabaseManager脚本,双击打开该脚本。
写入代码如下:

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

public class DatabaseManager : MonoBehaviour
{
    private MySqlConnection connection;
    private string serverName = "localhost";
    private string dbName = "UnityGame";	//数据库名
    private string userName = "root";		//登录数据库的用户名
    private string password = "123456";		//登录数据库的密码
    private string port = "3306";			//MySQL服务的端口号

    public InputField InputUsername;
    public InputField InputPassword;

    void Start()
    {
        string connectionString = "Server=" + serverName + ";Database=" + dbName + ";Uid=" + userName
                                  + ";Pwd=" + password + ";Port=" + port + ";";
        connection = new MySqlConnection(connectionString);
        connection.Open();
        Debug.Log("连接数据库成功");
    }

    // 注册
    public void Register()
    {
        string username = InputUsername.text;
        string password = InputPassword.text;
        string query = "INSERT INTO usersinfo(username, password) VALUES (@username, @password)";
        MySqlCommand cmd = new MySqlCommand(query, connection);
        cmd.Parameters.AddWithValue("@username", username);
        cmd.Parameters.AddWithValue("@password", password);
        int rowsAffected = cmd.ExecuteNonQuery();

        if (rowsAffected > 0)
        {
            Debug.Log("注册成功!");
        }
        else
        {
            Debug.Log("注册失败!");
        }
    }

    // 登录
    public void Login()
    {
        string username = InputUsername.text;
        string password = InputPassword.text;
        string query = "SELECT COUNT(*) FROM usersinfo WHERE username=@username AND password=@password";
        MySqlCommand cmd = new MySqlCommand(query, connection);
        cmd.Parameters.AddWithValue("@username", username);
        cmd.Parameters.AddWithValue("@password", password);

		object result = cmd.ExecuteScalar();
        int count = Convert.ToInt32(result);

        if(count > 0)
        {
            Debug.Log("登录成功");
        }
        else
        {
            Debug.Log("登录失败");
        }
    }
}

该脚本定义了一个DatabaseManager类,在Start方法中创建了一个与数据库的连接,并提供了注册(Register)和登录(Login)方法。这些方法使用MySQL的参数化查询来保护用户的数据免受SQL注入攻击。登录方法使用ExecuteScalar()方法来检查用户名和密码是否匹配并返回一个整数结果。

4.2.1 环境配置

初次使用MySqlConnection会报找不到,这时需要引用MySql.Data.dll。

首先,确定MySQL版本为8.0.27,去官网此处下载MySQL Connector/NET,注意由于版本兼容问题,下载6.3.9版本:
在这里插入图片描述
下载完成后,双击安装:
在这里插入图片描述
Next→
在这里插入图片描述
Typical(默认安装在C盘的MySQL下,可以选择Custom自定义安装选择安装路径)→Next→
在这里插入图片描述
Install→
在这里插入图片描述
Finish完成安装。

接着,在Unity中File→Build Settings→Player Setting→Player,将Other Settings下的Configuration中的Api Compatibility Level修改为.NET Framework:

在这里插入图片描述
再在Assets下新建一个Plugins文件夹,将下载的MySQL Connector/NET文件夹如下位置(v4.0)的MySql.Data.dll复制到Plugins文件夹下。
在这里插入图片描述

4.3 绑定交互事件

在Unity中创建一个空的游戏物体,将DatabaseManager脚本添加到该游戏对象中,将输入用户名和密码的输入框拖拽到对应的变量中,并将注册与登录按钮绑定DatabaseManager脚本中对应的注册和登录方法以响应用户的注册和登录操作。
在这里插入图片描述
在这里插入图片描述

4.4 测试功能

UI界面输入:
在这里插入图片描述
系统输出信息:
在这里插入图片描述
数据库存储信息:
在这里插入图片描述
注意,如果之前Navicat已连接数据库,需要先关闭连接,再打开,在数据表中才能看见数据。

4.5 系统缺陷

  1. 缺陷:注册界面与登录界面是同一个界面,导致用户输入用户密码进行注册后,即可点击登录。
    解决方案:设计一个注册界面,一个登录界面,用户在注册界面注册成功后,再跳转到登录界面登录。
  2. 缺陷:用户注册时没有对用户信息进行校验,如一个用户用同一个用户名进行注册时应该进行提示、用户名或密码为空也应该进行提示。
    解决方案:使用Unity连接数据库实现对用户名的查询,如果数据库中不存在具有该用户名的用户记录,可以继续进行注册流程,否则提示用户名已被占用。
  3. 缺陷:用户注册时的注册时间没有加入用户表。
    解决方案:将注册时间列修改为时间戳类型,获取当前的时间戳或使用触发器实现在插入用户数据时自动更新注册时间列。
  4. 缺陷:用户注册时输入的密码以明文存储于数据库中,这是不安全的。
    解决方案:注册时将用户输入的未加密的密码进行哈希处理,并将哈希后的密码存储到数据库。登录时检查接收到的用户名和密码(加密后)是否与数据库中的匹配。
  5. 缺陷:用户登录时,没有针对特定错误进行提示,不论是因用户名密码错误还是该用户未注册都是提示“登录失败”。
    解决方案:根据不同的情况,对应给出不同的错误提示。

5 系列文章

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Unity+MySQL】实现简单的注册登录系统 的相关文章

  • 同一配置文件上的两个不同提供程序

    我在用着实体框架 6 1 0 I have 2 家提供者 MysqlClient 和 SQLServerCE 我需要创建2个不同的DBContext 这迫使我创造2个配置类因为mysql有一些不同的东西 但是当我初始化应用程序时 Datab
  • 一次从多个表中删除行

    我正在尝试将 2 个查询合并为一个这样的查询 result db gt query DELETE FROM menu WHERE name new or die db gt error result db gt query DELETE F
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希
  • 显示标准化数据

    跟进问题 添加 2 个不同表的总和 https stackoverflow com questions 39717541 adding sum from 2 different tables 我创建了3个表 members videos v
  • Galera 集群问题

    我想在我们的生产环境中使用Galera集群 但我有一些顾虑 每个表必须至少定义一个显式主键 每个表必须运行在InnoDB或XtraDB存储引擎下 分批处理您的大额交易 例如 不要让一个事务插入 100 000 行 而是将其分成更小的块 例如
  • Windows 8.1 升级后 Apache 无法工作 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 今天从 Windows 8 升级到 Windows 8 1 后 Apache 不再工作 我上次从 Windows 7 升级到 Window
  • 如何在 MySQL 中求和时间?

    正如您在图片中看到的 我有一份停机报告 显示了所选工厂在选定日期的停机时间 现在我想添加所有的值 Time Duration 列并将其显示在附近的单独显示中 TOTAL TIME DURATION 例如 在图像中 所选日期为 2015 年
  • db:schema:load 与 db:migrate 使用 capistrano

    我有一个 Rails 应用程序 我正在将其移动到另一台服务器 我认为我应该使用 db schema load 来创建 mysql 数据库 因为这是推荐的 我的问题是我正在使用 capistrano 进行部署 并且它似乎默认为 rake db
  • MySQL“LIKE”搜索不起作用

    我通过 LOAD DATA INFILE 在 MySQL 中导入了一个 txt 数据库 一切似乎都正常 唯一的问题是 如果我使用以下查询在数据库上搜索记录 SELECT FROM hobby WHERE name LIKE Beading
  • Google Cloud SQL 在重新启动时卡住

    我的云 sql 实例长时间处于重新启动状态 在操作窗格中 重新启动的状态显示为待处理 并且还发生了导出 其状态仍为Running 有没有办法可以强制重新启动或取消重新启动或从常规备份中恢复数据 不 没有办法 如果您向 Google 支付高级
  • 不带 GROUP BY 的聚合查询

    这个查询似乎在我的旧机器上完美运行 但是 在我的 MySQL 5 7 14 和 PHP 5 6 25 的新机器上 它会抛出错误 致命错误 未捕获异常 PDOException 并带有消息 SQLSTATE 42000 语法错误或访问冲突 1
  • PHP MYSQL文件内容转义问题

    我正在尝试使用 php 将 pdf 文件上传到 mysql 数据库中 除了文件内容之外 一切都很好 无论我如何尝试转义特殊字符 查询总是失败 主要是 未知命令 n 我使用过addslashes mysql real escape strin
  • libmysqlclient.a 和 libmysqlclient_r.a 有什么区别?

    我应该使用哪个来链接 mysqlclient 库 它们之间有什么区别 我似乎找不到答案 谢谢 较新版本的 MySQL 客户端发行版不包含 r 版本 有些可能有从 libmyqslclient r a 到 libmyqslclient a 的
  • SQL Join 列上类似于另一列[重复]

    这个问题在这里已经有答案了 可能的重复 mysql连接查询使用like https stackoverflow com questions 1930809 mysql join query using like 我想要进行连接 其中一列包含
  • 错误代码:1305。函数或过程不存在

    因此 我在 MySQL 中创建一个函数 然后尝试向用户授予使用该函数的权限 但我无法这样做 这就是我正在做的 DELIMITER USE rxhelp36 scbn DROP FUNCTION IF EXISTS businessDayDi
  • 用 pandas DataFrame 替换 mysql 数据库表中的行

    Python 版本 2 7 6 熊猫版本 0 17 1 MySQLdb 版本 1 2 5 在我的数据库中 PRODUCT 我有一张桌子 XML FEED 表 XML FEED 很大 数百万条记录 我有一个 pandas DataFrame
  • PHP MySql 百分比

    我的问题是关于百分比 我不是专家 所以我会尽力以更好的方式进行解释 我的 mysql 服务器中有一个表 假设有 700 条记录 如下所示 Name country language Birth Lucy UK EN 1980 Mari Ca
  • 删除行导致锁超时

    当我尝试从表中删除行时 我不断收到这些错误 这里的特殊情况是我可能同时运行5个进程 该表本身是一个 Innodb 表 约有 450 万行 我的 WHERE 子句中使用的列没有索引 其他指数按预期运行 这是在事务中完成的 首先删除记录 然后插
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • MYSQL从每个类别中随机选择一条记录

    我有一个数据库Items表看起来像这样 id name category int 有几十万条记录 每个item可以是 7 种不同的之一categories 对应于categories table id category 我想要一个从每个类别

随机推荐

  • 快速定位当前页面的Activity

    方法1 通过AndroidStudio的Terminal 利用一个指令可以快速定位当前页面的类名 1 把手机用数据线连到电脑 手机打开到需要的定位的页面 2 打开AndroidStudio 在AndroidStudio底部选择Termina
  • 实现一个简单的python小脚本的一些必要步骤

    1 编写python代码时在开头添上 python27 2 设置环境变量路径 在系统变量path中新建一个你要运行python脚本的文件夹的绝对路径 D python 3 运行方式 a 直接双击xx py文件 b 添加环境变量后 在cmd中
  • 工程有限元(1)

    有限法的基本思想 有限元概述 结构分析问题 有限元法的思路 有限元法的一般步骤 本文内容是整理的 工程有限元 课程内容 便于日后复习以及读者学习 有限元概述 有限元法 Finite Element Anaslysis FEM 是通过数学描述
  • c++继承下

    继承的方式主要分为单继承 多继承 菱形继承 普通单继承 指向派生类的基类指针或者引用 其类型仍然属于基类类型 而不是派生类类型 include
  • for(auto i : v)遍历容器元素

    for auto i v 遍历容器元素 1 auto 2 auto 3 const auto 4 const auto C 11 新增了一种循环 基于范围 range based 的 for 循环 这简化了一种常见的循环任务 对数组 或容器
  • 计算机重新如何连接网络打印机,电脑怎样连接打印机,小编教你电脑如何连接网络打印机...

    打印机是办公室里经常会用到的一种办公设备 由于工作性质的不同 以及其他原因 网络打印机可以实现多台电脑连接 实现资源共享 网络打印机自带ip 只需指定ip就可以快速连接 那电脑如何连接网络打印机 下面 小编给大家讲解电脑连接网络打印机的技巧
  • 基于类帕累托贯序抽样算法求解单目标优化问题附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab完整代码及仿真定制内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器
  • 智能合约平台开发指南

    随着区块链技术的普及 智能合约平台已经成为了这个领域的一个重要趋势 智能合约可以自动化执行合同条款 大大减少了执行和监督合同条款所需的成本和时间 那么 如何开发一个智能合约平台呢 以下是一些关键步骤 一 选择合适的区块链平台 智能合约通常运
  • pgsql数据库实现导入导出

    pgsql数据库实现导入导出 1 导出表 pg dump h 数据库ip U 用户名 数据库名 t 表名 gt 路径 例 pg dump h 127 0 0 1 U sysdba data center t book gt data boo
  • Prompt入门

    Prompt的范式大抵是两种 续写Prefix 用在GPT2 3那种单向LM预训练模型上 输入 好好学习 翻译成英文 输出 good good study 完形填空 用在BERT那种MLM式预训练模型上 比如情感分类任务可以输入 这个饼不错
  • Idea 中 Git 不提交当前分支修改代码并切换分支

    1 当前分支修改代码切换分支 日常开发中 我们可能会碰到我们正在修改当前 01 分支的代码 突然要去修改另外一个 02 分支的代码情况 而我们 01 分支写的代码还未经过测试 并不能马上提交 这个时候我们切换到 02 分支就会有问题 比如弹
  • dubbo中的Mock实现机制

    Mock是SOA之中的一个很有用的功能 不仅可以用来进行服务降级 也可以用来在测试中模拟服务调用的各种异常情况 dubbo框架里面的mock是在服务使用者这一端实现的 下面对实现机制进行分析 1 Mock的植入 很显然 既然提供了mock机
  • C++spdlog学习总结

    C Spdlog学习笔记 spdlog简介 spdlog优点 一般日志功能设计 spdlog安装 spdlog琐碎知识点总结 spdlog程序测试 一 日志输出控制台 1 数据全部输出到控制台 2 指定某个等级以上的数据到控制台 二 输出格
  • OC门与OD门

    OC门与OD门 OC Open Collector 集电极开路 OD Open Drain 漏极输出 集电极开路输出的结构如下图所示 右边的那个三极管集电极什么都不接 所以叫做集电极开路 左边的三极管为反相使用 使输入为 0 时 输出也为
  • 底层进阶

    在知乎上关注了好多图形学大佬 感觉现在知乎的技术氛围要比掘金推荐旧文好多了 经常会推送感兴趣的领域内容 而且还可以和作者私信交流 这段时间看到有大佬分享 GPU 架构相关的内容 做图像渲染的还是要懂 GPU 才行的 毕竟是和它打交道嘛 这位
  • springboot @CreatedDate @LastModifiedDate 自动生成创建时间,修改时间

    CreatedDate或 LastModifiedDate 在实体类的属性上加上上面的注解 即可不用处理时间的问题 在插入时会自动生成创建时间 修改时自动更新修改时间 搭配 Column updatable false 使用 注解起作用还需
  • C++ 随机数的制作

    include
  • Spring security安全登录-当AJAX遇上Redirect

    前言 最近做平台引入spring security做为安全认证框架 在登录的时候使用的ajax的请求方式 最开始的做法是调用登录的接口 成功后再前端使用window location href index html的方式跳转到希望的页面 考
  • kali linux 2020.4 自带浏览器英文改中文

    刚开始用kali linux 可能一些伙伴也会像我一样遇到英文不通的情况 比如 系统自带的火狐浏览器是英文的 要变成中文直接敲入 sudo apt install firefox esr l10n zh cn y 然后重启一下火狐浏览器就可
  • 【Unity+MySQL】实现简单的注册登录系统

    目录 1 安装Unity引擎和Navicat软件 2 安装MySQL8 0数据库 2 1 下载msi文件 2 2 安装MySQL Server 8 0 2 3 配置环境变量 2 4 安装MySQL服务 2 5 开启MySQL服务 2 6 修