【服务器05】之【登录/注册账号成功转至游戏场景】

Unity登录注册数据库

打开【服务器01】的文章项目

导入新UI系统

点击2D

双击输入栏位置

修改输入框尺寸及位置

放大字体

修改默认输入文字 发现中文字变成了口口口口

原因是新UI系统不支持中文,解决这个问题需要更换字体

并且修改输入时字体大小

我们取电脑中找Font文件夹

首先在本机系统中查找对应包(比如Windows系统就查找c盘下的Windows文件包)

双击Windows找到Font文件夹

双击进去

里面装着这个系统的所有字体,勿删

复制一个黑体到unity文件中

在unity中创建好Fonts包 后拖拽即可

右键字体选择 Font Asset 创建

一个简易的字体就创建完成了,但这个字体还不能使用

将新创建的字体改为静态

ctrl + d 复制一份改为动态

此时选择静态字体 点击加号

将复制出来的动态字体拖拽到静态字体的 Fallback List中

输入时的Text也要换下字体

此时TMP可以正常显示中文了

然后创建一个旧版的Input Field

新版的 内容类型 设置成 标准Standard

旧版设置成 

这样运行后输入效果

接下来创建登录按钮

首先创建一个新版UI的Button ——用来做  登录

再创建一个旧版UI的Button ——用来做  注册

简单处理一下位置

导入资源

新导入的Plugins 是用来存储动态库的

动态库通常是.dll结尾的  应用程序扩展文件

这个东西就是一组被封装起来的API

有了它我们就可以连接数据库 使用数据库的类

这三个是库 也就是说当打包时没有这三个库的支持 是不能打包的

换句话说

只有MySql.Data这个东西zaiunity中运行是可以连接数据库的,

但是打包的话需要上面那三个库的支持

我们查看它的属性

接下来创建输入账号密码错误时的错误提示

将Image铺满

处理一下颜色 和 Button 的位置

接着设置一下右上角的button关闭提示页面

然后将Image(账号密码输入错误的提示界面)隐藏

接下来我们再unity脚本中创建   连接数据库的文件夹

创建脚本MySqlAccess.cs

双击点开数据库复制外网地址

复制外网地址

粘粘到代码上

登录阿里云

创建数据库

接下来创建navicat的数据库

打开连接后变绿色点击新建数据库

接下来创建表

点击保存 

输入表名

此时我们就可以查看创建的表了

回到unity继续编写代码

保存后在navicat数据库的表填写数据

创建空物体

然后将脚本挂载

现在开始测试一下,首先创建一个新版UIText 更改字体

创建一个测试代码

数据库输入值后需要点击√按钮进行保存

unity运行测试

测试成功

继续编写代码

试一下查询语句

复制以下代码

填入信息

点击运行看是否可以成功插入

继续编写代码

我们再做一次测试

复制

粘粘

更新成功

继续编写代码

此时增删改查方法就已经完成了就不做测试

现在开始编写登陆脚本:

首先在Navicat中新建一个表

保存

打开表

我们想再添加一个解释属性

我们回到上步骤添加一下

顺便修改个表名

现在继续编写代码实现登录

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

public class MySqlAccess : MonoBehaviour{
    //定义一个连接字符串
    string connStr = "server=" +
        "rm-cn-83l3seehd00091po.rwlb.zhangbei.rds.aliyuncs.com;" +
        "user = hanyunhanData;" +
        "database = water;" +
        "port = 3306;" +
        "password = 13512647882hH;" +
        "Charset = utf8";
    //unity与数据库的连接方法 - 需要连接数据库时调用
    MySqlConnection ConectToDataBase() {
        //实例化数据库连接对象 并传入连接信息
        MySqlConnection conn = new MySqlConnection(connStr);
        conn.Open();
        return conn;
    }
    //定义一个公共的查询方法
    public string QueryData(string tableName, string condition) {
        #region -相当于把语句沾沾到navicat中
        //数据库查询语句在unity的使用
        string query = $"select * from {tableName} where {condition}";
        //使用连接方法ConectToDataBase()连接数据库
        MySqlConnection conn = ConectToDataBase();
        //构造查询条件 依据query中的SQL语句查询
        MySqlCommand cmd = new MySqlCommand(query, conn);
        #endregion
        #region 相当于点开始查询的按钮
        //执行查询语句的条件
        MySqlDataReader reader = cmd.ExecuteReader();
        //获取数据库读取到的数据
        string myString = "未获得数据库数据";
        //循环读取数据库中的数据
        while (reader.Read()) {
            int id = reader.GetInt32("id");
            string name = reader.GetString("name");
            string password = reader.GetString("password");
            myString = string.Format("{0}{1}{2}", id, name, password);
            Debug.Log("数据库中循环读取的数据{0}{1}{2}");

        }
        #endregion
        //关闭数据库
        conn.Close();
        return myString;
    }
    public void InsertData(string tableName, string columns, string valuers) {
        //插入的SQL语句
        string query = $"Insert into {tableName} ({columns}) values ({valuers})";
        //使用连接方法ConectToDataBase()连接数据库
        MySqlConnection conn = ConectToDataBase();
        //构造插入条件 依据query中的SQL语句插入
        MySqlCommand cmd = new MySqlCommand(query, conn);
        //执行SQL语句插入
        cmd.ExecuteNonQuery();
        //关闭数据库
        conn.Close();
    }
    //更新语句
    public void UpdateData(string tableName, string setStatement, string condition) {
        //更新的Sql语句
        string query = $"Update {tableName} set {setStatement} where {condition}";
        //使用连接方法ConectToDataBase()连接数据库
        MySqlConnection conn = ConectToDataBase();
        //构造更新条件 依据query中的SQL语句更新
        MySqlCommand cmd = new MySqlCommand(query, conn);
        //执行SQL语句更新
        cmd.ExecuteNonQuery();
        //关闭数据库
        conn.Close();
    }
    //删除数据的方法
    public void DeleteData(string tableName, string condition) {
        //删除的Sql语句
        string query = $"Delete from {tableName} where {condition}";
        //使用连接方法ConectToDataBase()连接数据库
        MySqlConnection conn = ConectToDataBase();
        //构造删除条件 依据query中的Sql语句删除
        MySqlCommand cmd = new MySqlCommand(query, conn);
        //执行SQL语句删除
        cmd.ExecuteNonQuery();
        //关闭数据库
        conn.Close();
    }
    //登陆方法 游戏内消耗物品的二级密码
    public bool CheckLogin(string tableName, string username, int password) {
        //建立查询条件
        string condition = $"name = '{username}' and password = {password}";
        //使用条件字符串查询
        string query = $"select * from {tableName} where {condition}";
        //使用连接方法ConectToDataBase()连接数据库
        MySqlConnection conn = ConectToDataBase();
        //构造擦汗寻条件 依据query中的SQL语句查询
        MySqlCommand cmd = new MySqlCommand(query, conn);
        //执行查询语句的条件
        MySqlDataReader reader = cmd.ExecuteReader();

        //判断账户密码是否存在
        bool loginSuccess = reader.HasRows;
        //关闭数据库
        conn.Close();

        //返回账户结果
        return loginSuccess;
    }
    //登陆方法 检测登陆界面用户名和密码
    public bool CheckLogin(string username, int password){
        //建立查询条件
        string condition = $"name = '{username}' and password = {password}";
        //使用条件字符串查询
        string query = $"select * from userinfo where {condition}";
        //使用连接方法ConectToDataBase()连接数据库
        MySqlConnection conn = ConectToDataBase();
        //构造擦汗寻条件 依据query中的SQL语句查询
        MySqlCommand cmd = new MySqlCommand(query, conn);
        //执行查询语句的条件
        MySqlDataReader reader = cmd.ExecuteReader();

        //判断账户密码是否存在
        bool loginSuccess = reader.HasRows;
        //关闭数据库
        conn.Close();

        //返回账户结果
        return loginSuccess;
    }
    //注册方法
    public void RegisterUser(string username, int password) {
        //准备插入条件
        string columns = "name,password";
        string values = $"'{username}',{password}";
        //插入到表格中
        InsertData("userinfo",columns,values);
    }
}
 

现在回到Unity中再创建一个脚本来使用一下登陆与注册

在Unity中做一个登陆失败的提示页面

打开隐藏的错误提示页面

修改之后取消激活

编写代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using TMPro;
public class LogUI : MonoBehaviour{
    //获取MySqlAccess类 在LogUI类中使用MySql类中的成员和方法
    private MySqlAccess mySqlAccess;

    //获取登陆失败提示文本
    public GameObject errorUI;

    //获取账户输入框——新版UI
    public TMP_InputField inputUsername;
    //获取密码输入框——旧版UI
    public InputField inputPassword;

    private void Start(){
        mySqlAccess = GameObject.Find("DataBaseConnection").GetComponent<MySqlAccess>();
    }
    //登录检测 点击按钮时运行
    public void OnLoginButtonClick() {
        //获取输入账号框中的内容
        string username = inputUsername.text;
        //获取输入密码框的密码 并强制转换为int
        int password = int.Parse(inputPassword.text);

        //调用MySqlAccess类中登陆检测方法 判断账号是否合法
        //合法允许登录 否则提示错误
        if (mySqlAccess.CheckLogin(username, password)){
            //登陆成功 切换场景
            SceneManager.LoadScene(1);
        }
        else {
            //登录失败提示
            errorUI.SetActive(true);
        }
    }
}
现在回到Unity中挂载脚本测试

之后设置登录按钮的点击函数

现在我们开始测试

首先点击Build Settings

将UI登陆界面和游戏开始场景放在Build Settings中

再看navicat上的账号和密码

我们首先登陆一个错误的账号和密码

输入正确的账号密码

成功跳转连接数据库成功

接下来我们编写注册的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using TMPro;
public class LogUI : MonoBehaviour{
    //获取MySqlAccess类 在LogUI类中使用MySql类中的成员和方法
    private MySqlAccess mySqlAccess;

    //获取登陆失败提示文本
    public GameObject errorUI;

    //获取账户输入框——新版UI
    public TMP_InputField inputUsername;
    //获取密码输入框——旧版UI
    public InputField inputPassword;

    private void Start(){
        mySqlAccess = GameObject.Find("DataBaseConnection").GetComponent<MySqlAccess>();
    }
    //登录检测 点击按钮时运行
    public void OnLoginButtonClick() {
        //获取输入账号框中的内容
        string username = inputUsername.text;
        //获取输入密码框的密码 并强制转换为int
        int password = int.Parse(inputPassword.text);

        //调用MySqlAccess类中登陆检测方法 判断账号是否合法
        //合法允许登录 否则提示错误
        if (mySqlAccess.CheckLogin(username, password)){
            //登陆成功 切换场景
            SceneManager.LoadScene(1);
        }
        else {
            //登录失败提示
            errorUI.SetActive(true);
        }
    }
    //注册功能 点击按键时执行
    public void OnRegisterButtonClick() {
        //获取注册框上的注册信息
        string username = inputUsername.text;
        //获取密码框上的密码
        int password = int.Parse(inputPassword.text);
        //调用我们的注册方法
        mySqlAccess.RegisterUser(username, password);
    }
}
回到Unity中

开始测试注册

看一下navicat账号密码信息

点击注册之后

注册成功可点击登陆进入Game场景

End.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/33444.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2k240hz显示器推荐 - 精选10款 - 高能评测

今天给大家精选了10款2k240hz显示屏&#xff0c;欢迎大家了解。 1.HKC G25H4 - 2k240hz显示器推荐 售价&#xff1a;1999 &#x1f440; 今天我要跟大家分享一款让我彻底被种草的显示器——HKC G25H4&#xff01;&#x1f389; 如果你跟我一样&#xff0c;对游戏和视觉体验有…

存储无界限:MK米客方德SD NAND系列,小容量到大容量的全方位覆盖

在这个数字化飞速前进的时代&#xff0c;数据存储的需求日益增长&#xff0c;不同的应用场景对存储容量的要求也各不相同。MK米客方德公司以其SD NAND系列产品&#xff0c;凭借其广泛的容量覆盖&#xff0c;从1Gb到512Gb&#xff0c;为各种应用场景提供了完美的存储解决方案。今…

代码随想录算法训练营第四十一天| 416. 分割等和子集

416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; class Solution {public boolean canPartition(int[] nums) {int sum 0;for (int i0;i<nums.length;i){sum nums[i];}if(sum%2!0){return false;}int weight sum /2;// int[][] dp new int[nums.length][weig…

java线程间的通信 - join 和 ThreadLocal

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

力扣1.两数之和

力扣1.两数之和 遍历每个元素 同时查找哈希表中数值存入哈希表 class Solution {public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int,int> cnt;for(int j0;;j){auto it cnt.find(target - nums[j]);if(it ! cnt.end()) r…

27、架构-技术方法论-向微服务迈进

微服务需要的条件 在决定采用微服务架构之前&#xff0c;需要明确其前提条件。微服务架构不仅仅是技术上的变革&#xff0c;更涉及组织结构和团队文化的调整。以下是微服务需要的几个关键条件&#xff1a; 1. 组织结构 微服务的成功实施依赖于组织结构的支持。根据康威定律&…

deepl翻译的PDF文档保护密码解除

1、首先将后缀名(.docx)修改为压缩包格式(.zip)。 2、修改解密word加密.py里zip的位置&#xff0c;和新生成的zip的位置和名称 import zipfile import xml.etree.ElementTree as ET import os import shutil# 定义文件路径 zip_file_path rC:\Users\Administrator\Desktop\新…

React的生命周期函数详解

import React,{Component} from "react";import SonApp from ./sonAppclass App extends Component{state{hobby:爱吃很多好吃的}// 是否要更新数据&#xff0c;这里返回true才会更新数据shouldComponentUpdate(nextProps,nextState){console.log("app.js第一步…

【计算机视觉】人脸算法之图像处理基础知识(六)

图像直方图 图像直方图是描述图像中像素强度分布的一种统计图表&#xff0c;它是图像处理和计算机视觉领域中一个非常基础且重要的概念。图像直方图通常用于分析图像的亮度、对比度特性&#xff0c;以及在图像增强、阈值分割、特征提取等多种图像处理任务。 import cv2 impor…

【C++】二叉搜索树|Key模型|key_value模型|基本操作

目录 ​编辑 二叉搜索树的定义&#xff0c;创建&#xff08;Key模型&#xff09; 定义 创建 基本操作 插入 查找 删除 Key模型和Key_Value模型 二叉搜索树&#xff08;Key_Value模型&#xff09; 定义 创建 基本操作 插入 应用 二叉搜索树的定义&#xff0c;创建&…

第二十九篇——交叉验证:电信诈骗为什么能成功?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 具体的应用中&#xff0c;让我理解了交叉验证的重要意义&#xff0c;他也…

【Altium】查找PCB上未连接的网络

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标&#xff1a; PCB设计后期检查中找出没有连接的网络 应用场景&#xff1a;PCB设计后期&#xff0c;需要检查是否所有网络都已连接布线。虽然未连接的网络会有飞线显示&#xff0c;但是由于布线后期整板布线密度较高&…

【加密与解密】【05】数据加密知识体系

常用加密算法 包括加密算法的分类&#xff0c;加密算法的作用&#xff0c;加密算法的优缺点&#xff0c;加密算法应用场景 加密算法实践 包括Java加密套件使用方式&#xff0c;BouncyCastle的CommonsCodec的使用 常见概念 公钥&#xff0c;私钥&#xff0c;对称秘钥&#xff…

如何优雅的删库跑路?

本文已收录于&#xff1a;https://github.com/danmuking/all-in-one&#xff08;持续更新&#xff09; 前言 哈喽&#xff0c;大家好&#xff0c;我是 DanMu。鲁迅说过&#xff1a;一个程序员成熟的标志是一次优雅是删库。&#xff08;鲁迅&#xff1a;这bi话我可没说过&#x…

LeetCode刷题之HOT100之排序链表

2024/6/24 周末两天没去实验室&#xff0c;可能跟天气有关&#xff0c;也可能跟我不想去有关。最近实在太热&#xff0c;不想出门。早上来&#xff0c;去二楼看了一下我的栀子花&#xff0c;长得很好&#xff0c;但是花苞都没了&#xff0c;只剩下唯一一颗&#xff0c;给它浇了…

vue3滚动日历选择器

倒叙日历&#xff1a; <template><div class"date-picker"><div class"column" wheel"onYearScroll"><div v-for"(year, index) in displayedYears" :key"index" :class"{current: year current…

Ubuntu下载QT5.8安装包-bestswinger课程

最近在看UP的QT开发课&#xff0c;真的找了巨久这个安装包&#xff0c;谁都不想在安装上花太多时间。。出一版小小教程吧&#xff5e; 首先打开qt download官网&#xff0c;5.8好像在镜像网站上没有看到&#xff0c;所以我最后还是老老实实官网了&#xff0c;而且5.8会小一点 …

Linux 运维 | 4.从零开始,文件目录特殊权限管理实践

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 0x00 前言简述 描述&#xff1a;前一章&#xff0c;学习了Linux系统中的用户与用户组的管理&#xff0c;此章节我们将继续学习Linux系统中比较基础且重要的文件权限设置与属性管理&#xff0c;在L…

Kubernetes面试攻略:揭秘企业最爱问的几个问题-必看!下

1. 什么是存储类&#xff08;Storage Class&#xff09;&#xff1f; 答&#xff1a;存储类&#xff08;Storage Class&#xff09;是用于动态配置存储卷的资源对象&#xff0c;它定义了存储卷的类型、存储提供商&#xff08;如 AWS EBS、GCE PD&#xff09;、以及卷配置参数。…