IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 【Unity项目】登录界面 -> 正文阅读

[游戏开发]【Unity项目】登录界面

数据库

登录时验证用户名和密码,使用MySQL数据库管理数据,类中的主要方法也都是使用SQL语句完成。类中还提供两个接口, 一个通过username获取UserInfo ,一个是直接获取到排行榜。
数据库连接类

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


public class MySqlAccess
{
    //连接类对象
    public  MySqlConnection mySqlConnection;
    //IP地址
    private static string host;
    //端口号
    private static string port;
    //用户名
    private static string username;
    //密码
    private static string password;
    //数据库名称
    private static string databaseName;
    public MySqlAccess(string _host,string _port, string _username, string _password, string _databaseName)
    {
        host = _host;
        port = _port;
        username = _username;
        password = _password;
        databaseName = _databaseName;
        OpenSql();
    }
    private void OpenSql()
    {
        try {
            string mySqlString = string.Format("datasource={0};port={1};database={2};user={3};pwd={4};"
                , host, port, databaseName, username, password);
            //Debug.Log(mySqlString);
            mySqlConnection = new MySqlConnection(mySqlString);
            mySqlConnection.Open();
        } catch (Exception e) {
            throw new Exception("服务器连接失败,请重新检查MySql服务是否打开。" + e.Message);
        }
    }
}

数据库管理类

using System;
using System.Collections.Generic;
using Frame.Utility;
using Game.bean;
using Game.Interface;
using MySql.Data.MySqlClient;
using UnityEngine;
using EventType = Frame.Utility.EventType;

namespace Game
{
    public class DataBaseManager : SingleTonMonoAuto<DataBaseManager>, IDataBaseManager
    {
        private MySqlAccess mySqlAccess;
        private string _connectionStr;
        private MySqlConnection _connection;
        private MySqlCommand  _command;
        Dictionary<string, UserInfo> _dictionary = new Dictionary<string, UserInfo>();
        private UserInfo _userCache;
        //宿舍的ip
        //private string host = "172.20.177.212";
        //课室的
        private string host = "10.9.72.192";

        private void OnEnable()
        {
            EventCenter.Instance.AddListener(EventType.ResetLogin,ResetLogin);
        }

        public void AddMoneyAndHonor(string name,int money,int honor)
        {
            if (_dictionary.ContainsKey(name))
            {
                UserInfo userInfo = _dictionary[name];
                userInfo.money += money;
                userInfo.honor += honor;
                SaveInfo(userInfo);
            }
        }
        
        /// <summary>
        /// 保存UserInfo数据
        /// </summary>
        /// <param name="userinfo"></param>
        public void SaveInfo(UserInfo userinfo)
        {
            int userId = userinfo.id;
            int money = userinfo.money;
            int honor = userinfo.honor;
            string heroList = userinfo.ownedHero;
            if ( !_dictionary.ContainsKey(userinfo.username))
            {
                //把用户数据存入字典
                _dictionary.Add(userinfo.username, userinfo);
            }
            UpdateUserInfo(userId, money, honor, heroList);
        }
        /// <summary>
        /// 修改用户信息
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="username"></param>
        /// <param name="password"></param>
        /// <param name="money"></param>
        /// <param name="honor"></param>
        /// <param name="ownedHero"></param>
        private void  UpdateUserInfo(int @ID,int @money,int @honor,string @ownedHero)
        {
            _command.CommandText = "Update CustomerInfo Set money=\'"
                                   +money+"\', honor=\'"+honor+"\', ownedHero=\'"
                                   +ownedHero+"\' where ID="+ID;
            int i = _command.ExecuteNonQuery();
            Debug.Log("产生影响"+ i);
        }
        
        private DataBaseManager()
        {
            //Debug.Log("DataBaseManager实例化");
            InitDataBase();
        }

        //初始化数据库
        private void InitDataBase()
        {
            mySqlAccess = new MySqlAccess(host,"3306","root","123456","dbcustomerinfo");
            _connection = mySqlAccess.mySqlConnection;
            _command = _connection.CreateCommand();
            SaveInDic();
            
        }

        private void SaveInDic()
        {
            _command.CommandText = "Select * From CustomerInfo";
            MySqlDataReader _reader = _command.ExecuteReader();
            //将数据传入字典
            while (_reader.Read())
            {
                object id = _reader.GetValue(0);
                object username = _reader.GetValue(1);
                object password = _reader.GetValue(2);
                object money = _reader.GetValue(3);
                object honor = _reader.GetValue(4);
                object ownedHero = _reader.GetValue(5);
                object isLogined = _reader.GetValue(6);
                if (!_dictionary.ContainsKey((string) username))
                {
                    _dictionary.Add((string) username,
                        new UserInfo(Convert.ToInt32(id), (string) username, (string) password, Convert.ToInt32(money),
                            Convert.ToInt32(honor), (string) ownedHero ,Convert.ToInt32(isLogined)));
                }
            }
            _reader.Close();
        }
        /// <summary>
        /// 通过用户名获取UserInfo
        /// </summary>
        /// <param name="name"></param>
        /// <param name="pwd"></param>
        /// <returns></returns>
        public UserInfo GetUserInfo(string name, string pwd)
        {
            _command.CommandText = "Select * From CustomerInfo where username = " + "'" + name + "'";
            if (_command.ExecuteScalar() == null)
            {
                Debug.Log("用户名不存在");
                //用户名不存在
                return null;
            }
            else //用户名存在
            {
                //判断是否与密码匹配
                UserInfo _user;
                _dictionary.TryGetValue(name, out _user);
                if (_user != null && !CheckIsLogined(name))
                {
                    bool pwdIsSame = _user.password == pwd ? true : false;
                    if (pwdIsSame)
                    {
                        Debug.Log("登陆成功");
                        _user.isLogined = 1;
                        _command.CommandText = "UPDATE customerinfo SET islogined = 1 WHERE username = " +"'" + name + "'";
                        _command.ExecuteNonQuery();
                        _userCache = _user;
                        return _user;
                    }
                    else
                    {
                        Debug.Log("账户名或密码错误");
                        return null;
                    }
                }
            }
            return null;
        }

        private bool CheckIsLogined(string username)
        {
            _command.CommandText = "SELECT islogined from customerinfo WHERE username =" + "'" + username + "'";
            object obj = _command.ExecuteScalar();
            bool isLogined = Convert.ToInt32(obj) == 1 ? true : false;
            return isLogined;
        }
        
      
        /// <summary>
        /// 获取排行榜
        /// </summary>
        /// <param name="num"></param>
        /// <returns></returns>
        public List<UserInfo> GetRankList(int num)
        {
            if (num > _dictionary.Count)
            { 
                Debug.LogError("查询范围超出!");
                return null;
            }
            List<UserInfo> rankList = new List<UserInfo>();
            //排序的SQL语句
            _command.CommandText = "Select * from CustomerInfo ORDER BY honor DESC , money DESC limit " + num;
            MySqlDataReader _reader = _command.ExecuteReader();
            while (_reader.Read())
            {
                UserInfo _userInfo;
                _dictionary.TryGetValue((string) _reader.GetValue(1), out _userInfo);
                rankList.Add(_userInfo);
            }
            _reader.Close();
            return rankList;
        }

        private void OnApplicationQuit()
        {
            //Debug.Log("关闭数据库连接");
            if (mySqlAccess.mySqlConnection!=null)
            {
                EventCenter.Instance.RemoveListener(EventType.ResetLogin,ResetLogin);
                if(_userCache!=null){
                    _userCache.isLogined = 0; 
                    _command.CommandText = "UPDATE customerinfo SET islogined = 0 WHERE username = " +"'" + _userCache.username + "'";
                    _command.ExecuteNonQuery();
                }
                mySqlAccess.mySqlConnection.Close();
            }
        }

        /// <summary>
        /// 一键还原所有登录
        /// </summary>
        public void ResetLogin()
        {
            _command.CommandText = "Update customerInfo Set islogined = 0";
            _command.ExecuteNonQuery();
            print("已还原所有登录");
        }
    }
}

登录页面

using System;
using DG.Tweening;
using Frame.UI;
using Frame.Utility;
using Game;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using EventType = Frame.Utility.EventType;

public class LoginModule : UIModuleBase
{
    private InputField inputName;
    private InputField inputPsw;
    private EventSystem _system;
    private bool isSelectUsername; //选框用户名
    private Image FocusLigthUsername;
    private Image FocusLigthPassword;
    private Text txtMention; //密码错误提示

    //可选对象
    Selectable cur = null;

    private void Start()
    {
        _system = EventSystem.current;
        txtMention = FW("txtMention#").Text;
        inputName = FW("Field-UserName#").InputField;
        inputPsw = FW("Field-UserPassword#").InputField;
        FW("LoginButton#").Button.onClick.AddListener(() =>
        {
            Debug.Log("点击了登录按钮 name=" + inputName.text + " psw=" + inputPsw.text);
            //调用UIEvent的事件
            UIEvent.LoginClick(inputName.text, inputPsw.text);
        });    
    }

    
    public void PlayMentionAnime()
    {

        Debug.Log("PlayMentionAnime");
        Tweener _tweener = txtMention.DOFade(1, 0.6f);
        
        _tweener.SetDelay(0);
        _tweener.SetEase(Ease.Linear);
        _tweener.SetAutoKill(true);
        _tweener.SetLoops(0);
    }


    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Tab))
        {
            Selectable next = null;
            cur = _system.currentSelectedGameObject.GetComponent<Selectable>();
            print("name=" + cur.name);
            if (cur.name == "Field-UserName#")
            {
                isSelectUsername = true;
                next = cur.FindSelectableOnDown();
            }
            else
            {
                isSelectUsername = false;
                next = cur.FindSelectableOnUp();
            }

            _system.SetSelectedGameObject(next.gameObject, new BaseEventData(_system));
        }

        if (Input.GetKeyDown(KeyCode.Return))
        {
            UIEvent.LoginClick(inputName.text, inputPsw.text);
        }
        if (Input.GetKeyDown(KeyCode.B))
        {
            //一键清空登录状态
            EventCenter.Instance.Call(EventType.ResetLogin);
        }
    }
}

登录成功界面

using System;
using System.ComponentModel.Design;
using Frame.UI;
using Game;
using Game.bean;
using Photon.Pun;
using UnityEngine;
using UnityEngine.Tilemaps;
using UnityEngine.UI;
using Object = System.Object;

public class LoginSucPanel : UIModuleBase
{
   private Button BtnCheck;
   private Text LoginMsg;
   protected override void Awake()
   {
      base.Awake();
      BtnCheck = FW("BtnCheck#").Button;
      LoginMsg = FW("txtLoginMsg#").Text;
      
      BtnCheck.onClick.AddListener(() =>
      {
         UIEvent.ToMain();
      });
    }

   
   public void Init()
   {
      LoginMsg.text = "亲爱的"+"\n" +  PhotonNetwork.NickName +"\n"+ "欢迎进入游戏!";
   }

   public override void OnSpawn(Object obj)
   {
      base.OnSpawn(obj);
      //设置photon昵称
      PhotonNetwork.NickName =  (string)obj;
      Init();
   }

   private void Update()
   {
      if (Input.GetKeyDown(KeyCode.Return))
      {
         UIEvent.ToMain();
      }
   }
}

游戏控制类

using Game;
using Game.bean;
using Game.Interface;
using Photon.Pun;

//游戏控制类。负责所有游戏逻辑总控制
//单例,待实现
public class GameController: SingleTonObj<GameController>
{
    private MainPageInfo _mainPageInfoCache;
    private GameController(){}
    
    //具体的游戏逻辑控制,按功能分
    
    //UI控制
    private IUIController _uiController;
    //登录管理
    private ILoginManager _loginManager;
    //玩家数据
    private PlayerInfo _playerInfo;
    //地图
    private IMapManager _mapManager;
    //网络框架
    private IPhotonWrapper _photonWrapper;

    private bool init = false;

    /// <summary>
    /// 初始化
    /// </summary>
    public void Init()
    {
        if (init)
        {
            return;
        }

        init = true;
        InitObj();
        BindUIEvent();
    }

    /// <summary>
    /// 初始化各个逻辑对象的具体类
    /// </summary>
    private void InitObj()
    {
        _uiController=new UIController();
        //_loginManager=new LoginManager();
        _loginManager = new FakeLoginManager();
        _mapManager= new TestMapManager();
        _photonWrapper=new TestPhotonWrapper();
        _playerInfo=new PlayerInfo();
    }

    private void BindUIEvent()
    {
        UIEvent.LoginClick += Login;
        UIEvent.ToMain += ToMain;
        UIEvent.StoreClick += Store;
        UIEvent.SettingClick += Setting;
        UIEvent.MapClick += MapDetail;
        UIEvent.LobbyClick += Lobby;
        UIEvent.QuickStartClick += QuickStart;
        UIEvent.HeroChange += HeroChange;
        UIEvent.GameStart += GameStart;
    }

    private void ToMain()
    {
        _uiController.ShowMain(_mainPageInfoCache);
    }

    private void GameStart(MapInfo mapInfo)
    {
        //游戏开始,根据地图配置,跳到各自的场景
    }

    private void QuickStart()
    {
        _photonWrapper.RandomJoin((result) =>
        {
            if (result)
            {
                _uiController.ShowRoomInfo();
            }
            else
            {
                _photonWrapper.CreateRoom();
            }
        });
    }

    private void Lobby()
    {
        _uiController.ShowLobby();
    }

    private void MapDetail(MapInfo obj)
    {
        _uiController.ShowMapDetail();
    }

    private void Setting()
    {
        _uiController.ShowSetting();
    }

    private void Store()
    {
        _uiController.ShowStore();
    }

    private void HeroChange(HeroInfo heroInfo)
    {
        _playerInfo.chooseHero = heroInfo;
    }

    private void Login(string name, string pwd)
    {
        _loginManager.Login(name,pwd, (loginResult) =>
        {
            if (loginResult.suc)
            {
                _mainPageInfoCache = new MainPageInfo();
                _mainPageInfoCache.userInfo = loginResult.userInfo;
                
                PlayerInfo.Instance.Init();
                PlayerInfo.Instance._userInfo = loginResult.userInfo;
                _mainPageInfoCache.maps = _mapManager.GetAllMap();
                _uiController.ShowLoginSuc(_mainPageInfoCache.userInfo.username);
            }
            else
            {
                _uiController.ShowLoginError();
            }
        });
    }

    /// <summary>
    /// 游戏入口,游戏启动的时候调用
    /// </summary>
    public void Entrance()
    {
        if (PlayerInfo.Instance._userInfo != null)
        {
            _mainPageInfoCache = new MainPageInfo();
            _mainPageInfoCache.userInfo = PlayerInfo.Instance._userInfo;
            _mainPageInfoCache.maps = _mapManager.GetAllMap();
            _uiController.ShowMain(_mainPageInfoCache);
        }else{
            _uiController.ShowLogin();
            PhotonNetwork.ConnectUsingSettings();
            PhotonNetwork.AutomaticallySyncScene = true;
        }
    }
}

登录类实例

using System;
using Game.bean;
using Game.Interface;
using Mono.Data.Sqlite;
using UnityEngine;


namespace Game
{
    /// <summary>
    /// 登录实现实例
    /// </summary>
    public class LoginManager:ILoginManager
    {
        private IDataBaseManager _dataBaseManager;
        public LoginManager()
        {
            _dataBaseManager = DataBaseManager.Instance;
        }
        public void Login(string name, string pwd, Action<LoginResult> callBack)
        {
            LoginResult result =new LoginResult();
            //查数据库
            UserInfo userInfo = _dataBaseManager.GetUserInfo(name, pwd);
            //查到了
            bool check = userInfo!=null;
            //且状态为未登录
            if(check){
                result.suc = true;
                result.userInfo = userInfo;
                callBack(result);
            }else{
                //没查到 或者账号已登录
                result.suc = false;
                callBack(result);
            }
        }

    }
}

登录结果类

namespace Game.bean
{
    /// <summary>
    /// 登录的结果
    /// </summary>
    public class LoginResult
    {
        public bool suc;
        public UserInfo userInfo;
    }
}
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-08-25 12:33:10  更:2021-08-25 12:33:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 16:34:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码