用户头像的加载

  • 创建使用Resources加载图片的脚本,用来加载头像
  • 在得到用户信息时,已经把用户信息存储到GameMdeol中,用户名、金币数、头像从GameModel中直接加载

ResourcesManager

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ResourcesManager
{/// <summary>/// 保存用户的头像/// 根据名字保存 string为用户名/// </summary>private static Dictionary<string, Sprite> nameSpriteDic = new Dictionary<string, Sprite>();public static Sprite GetSprite(string iconName){if (nameSpriteDic.ContainsKey(iconName))//查找用户名是否在字典中{return nameSpriteDic[iconName];}else{Sprite[] sprites = Resources.LoadAll<Sprite>("headIcon");//获取所有的头像//头像名字组成为 字符串_数字 数字就为头像数组的下标 返回值为string数组string[] nameArr = iconName.Split('_');int index = int.Parse(nameArr[1]);//nameArr[1] 得到头像名字的数字,作为下标Sprite temp = sprites[index];//获取用户的头像nameSpriteDic.Add(iconName,temp);//添加到头像字典中return temp;}}}

加载用户信息

using Protocol.Code;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class MainPanel : MonoBehaviour
{#region 字段 private Image headIcon;private Text txtUserName;private Text txtCoinCount;private Button btn_Rank;private Button btn_Bank;private Button btnStand;private Button btnOnline;#endregion#region Unity回调private void Awake(){Init();}#endregion#region 方法/// <summary>/// 初始化/// </summary>private void Init(){headIcon = transform.Find("mask/headIcon").GetComponent<Image>();txtUserName = transform.Find("txtUserName").GetComponent<Text>();txtCoinCount = transform.Find("txtCoinCount").GetComponent<Text>();        btn_Rank = transform.Find("btn_Rank").GetComponent<Button>();btn_Rank.onClick.AddListener(()=> {//向服务器获取排行榜NetMsgCenter.Instance.SendMsg(OpCode.Account,AccountCode.GetRankList_CRES,null);//显示排行榜界面EventCenter.Broadcast(EventDefine.ShowRankListPanel);});btn_Bank = transform.Find("btn_Bank").GetComponent<Button>();btnStand = transform.Find("btnStand").GetComponent<Button>();btnOnline = transform.Find("btnOnline").GetComponent<Button>();///加载用户信息//获取存储用户信息中的金币数txtCoinCount.text = Models.GameModel.userDto.Coin.ToString();//获取存储用户信息中的用户名txtUserName.text = Models.GameModel.userDto.UserName;//加载用户头像headIcon.sprite = ResourcesManager.GetSprite(Models.GameModel.userDto.IconName);}#endregion
}

排行榜的实现

  • 在点击排行榜按钮时,向服务器端发送排行榜请求
  • 显示排行榜界面
  • server端创建数据模型,反馈回客户端
  • 客户端处理server端的回应,在账号的模块类中发送到排行榜脚本中进行处理

添加请求排行榜信息的子操作码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Protocol.Code
{/// <summary>/// 账号模块下的操作码/// </summary>public class AccountCode{public const int Register_CREQ = 0;//客户端注册的子操作码public const int Register_SRES = 1;//注册Server端回应的操作码public const int Login_CREQ = 2;//登陆的子操作码public const int Login_SRES = 3;//登陆server端回应的操作码public const int GetUserInfo_CREQ = 4;//获得用户信息的子操作码public const int GetUserInfo_SRES = 5;//获得用户信息的Server端回应的操作码public const int GetRankList_CRES = 6;//获取排行榜的子操作码public const int GetRankList_SRES = 7;//获取排行榜的server端的回应操作码}
}

客户端的请求

 btn_Rank.onClick.AddListener(()=> {//向服务器获取排行榜NetMsgCenter.Instance.SendMsg(OpCode.Account,AccountCode.GetRankList_CRES,null);//显示排行榜界面EventCenter.Broadcast(EventDefine.ShowRankListPanel);});

Server端创建数据模型(排行榜里内容的数据模型)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Protocol.Dto
{/// <summary>/// 排行榜所需内容的数据模型/// </summary>[Serializable]public class RankItemDto{public string UserName;public int Coin;public RankItemDto(string UserName, int Coin){this.UserName = UserName;this.Coin = Coin;}public void Change(string UserName, int Coin){this.UserName = UserName;this.Coin = Coin;}}
}

Server端创建数据模型(排行榜的数据模型)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Protocol.Dto
{/// <summary>///排行榜的数据模型/// </summary>[Serializable]public class RankListDto{public List<RankItemDto> rankList;public RankListDto(){rankList = new List<RankItemDto>();}public void Clear(){rankList.Clear();}public void Add(RankItemDto dto){rankList.Add(dto);}}
}

查找到数据库中的用户名和金币,构建数据模型

/// <summary>/// 获取排行榜信息/// </summary>public static RankListDto GetRankListDto(){MySqlCommand cmd = new MySqlCommand(" select Username,Coin from userinfo order by Coin desc ", sqlConnect);MySqlDataReader reader = cmd.ExecuteReader();rankListDto.Clear();if (reader.HasRows){while (reader.Read())//一直查询,直到查找完毕{RankItemDto dto = new RankItemDto(reader.GetString("UserName"),reader.GetInt32("Coin"));rankListDto.Add(dto);                   }reader.Close();return rankListDto;}reader.Close();return null;}}

Server端处理客户端的请求,并返回给排行榜的数据模型

using GameServer.DadaBase;
using MyServer;
using Protocol.Code;
using Protocol.Dto;namespace GameServer.Logic
{/// <summary>/// 账号模块的处理/// </summary>public class AccountHandler : IHandler{public void DisConnected(ClientPeer clientPeer){DatabaseManager.OffLine(clientPeer);}/// <summary>/// 处理所有的子操作码/// </summary>public void Receive(ClientPeer client, int subCode, object value){switch (subCode){case AccountCode.Register_CREQ:Register(client,value as AccountDto);break;case AccountCode.Login_CREQ:Login(client,value as AccountDto);break;case AccountCode.GetUserInfo_CREQ:GetUserInfo(client);break;case AccountCode.GetRankList_CRES:GetRankList(client);break;}}/// <summary>/// 客户端请求排行榜的处理/// </summary>private void GetRankList(ClientPeer client){SingleExecute.Instacne.Execute(()=> {RankListDto dto= DatabaseManager.GetRankListDto();client.SendMsg(OpCode.Account, AccountCode.GetRankList_SRES, dto);});}/// <summary>/// 客户端请求获得用户信息的处理/// </summary>private void GetUserInfo(ClientPeer client){SingleExecute.Instacne.Execute(()=> {UserDto dto = DatabaseManager.GetUserInfo(client);client.SendMsg(OpCode.Account, AccountCode.GetUserInfo_SRES, dto);});}/// <summary>/// 客户端请求登陆的处理/// </summary>private void Login(ClientPeer client, AccountDto dto){SingleExecute.Instacne.Execute(()=> {if (DatabaseManager.IsExistUserName(dto.userName)==false){//用户名不存在client.SendMsg(OpCode.Account, AccountCode.Login_SRES, -1);return;}if (DatabaseManager.IsMatch(dto.userName,dto.password)==false){//账号密码不匹配client.SendMsg(OpCode.Account, AccountCode.Login_SRES, -2);return;}if (DatabaseManager.IsOnline(dto.userName)){//当前用户已在线client.SendMsg(OpCode.Account, AccountCode.Login_SRES, -3);return;}DatabaseManager.Login(dto.userName,client);//登陆成功client.SendMsg(OpCode.Account, AccountCode.Login_SRES, 0);});}/// <summary>///客户端注册请求的处理/// </summary>private void Register(ClientPeer client, AccountDto dto){///单线程执行///作用:防止多个线程同时访问,数据错乱SingleExecute.Instacne.Execute(()=> {//判断数据库中是否存在该用户,存在就给客户端返回-1if (DatabaseManager.IsExistUserName(dto.userName)){client.SendMsg(OpCode.Account, AccountCode.Register_SRES, -1);return;}//判断数据库中是否存在该用户,不存在就创建该用户并给客户端返回0DatabaseManager.CreatUser(dto.userName, dto.password);client.SendMsg(OpCode.Account, AccountCode.Register_SRES, 0);});}}
}

客户端处理Server端的回应,发送到排行榜脚本中处理

using Protocol.Code;
using Protocol.Dto;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;public class AccountHandler : BaseHandler
{public override void OnReceive(int subCode, object value){switch (subCode){case AccountCode.Register_SRES:Register_SRES((int)value);break;case AccountCode.Login_SRES:Login_SRES((int)value);break;case AccountCode.GetUserInfo_SRES:GetUserInfo_SRES(value as UserDto);break;case AccountCode.GetRankList_SRES:GetRankList_SRES(value as RankListDto);break;}}/// <summary>/// 处理服务器端注册后的回应/// </summary>private void Register_SRES(int value){if (value==-1){EventCenter.Broadcast(EventDefine.Hint,"该用户已经被注册");return;}if (value==0){EventCenter.Broadcast(EventDefine.Hint, "注册成功");}}/// <summary>///  处理服务器端登陆后的回应/// </summary>private void Login_SRES(int value){switch (value){case -3:EventCenter.Broadcast(EventDefine.Hint, "当前用户已在线");break;              case -2:EventCenter.Broadcast(EventDefine.Hint, "账号密码不匹配");break;case -1:EventCenter.Broadcast(EventDefine.Hint, "用户名不存在");break;case 0://请求获得用户信息NetMsgCenter.Instance.SendMsg(OpCode.Account,AccountCode.GetUserInfo_CREQ,null);EventCenter.Broadcast(EventDefine.Hint, "登陆成功");break;}}/// <summary>/// 处理获取用户信息服务器端的回应/// </summary>private void GetUserInfo_SRES(UserDto dto){Models.GameModel.userDto = dto;//把用户信息存储到数据中心(model层)SceneManager.LoadScene("02.Main");}/// <summary>/// 处理获取排行榜信息服务器的回应/// </summary>/// <param name="dto"></param>private void GetRankList_SRES(RankListDto dto){//把排行榜信息发送到RankPanel去处理EventCenter.Broadcast(EventDefine.SendRankListDto,dto);}
}

排行榜脚本的处理

sing System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
using Protocol.Dto;public class RankPanel : MonoBehaviour
{public GameObject m_ItemPre; private Button btn_Close;private Transform m_Parent;private void Awake(){EventCenter.AddListener(EventDefine.ShowRankListPanel, Show);EventCenter.AddListener<RankListDto>(EventDefine.SendRankListDto,GetRankListDto);btn_Close = transform.Find("btn_Close").GetComponent<Button>();btn_Close.onClick.AddListener(()=> {OnCloseButtonClick();});m_Parent = transform.Find("List/ScrollRect/Parent").transform;}private void OnCloseButtonClick(){transform.DOScale(Vector3.zero, 0.3f);}private void Show(){transform.DOScale(Vector3.one, 0.3f);}/// <summary>/// 得到排行榜的数据传输模型/// </summary>private void GetRankListDto(RankListDto dto){for (int i = 0; i < dto.rankList.Count; i++){//如果当前名字和自身名字相同if (dto.rankList[i].UserName==Models.GameModel.userDto.UserName){GameObject go = Instantiate(m_ItemPre, m_Parent);go.transform.Find("Index/txtIndex").GetComponent<Text>().text = (i + 1).ToString();go.transform.Find("Index/txtIndex").GetComponent<Text>().color = Color.red;go.transform.Find("txtUserName").GetComponent<Text>().text = "我";go.transform.Find("txtUserName").GetComponent<Text>().color = Color.red;go.transform.Find("txtCoin").GetComponent<Text>().text = dto.rankList[i].Coin.ToString();go.transform.Find("txtCoin").GetComponent<Text>().color = Color.red;}else{GameObject go = Instantiate(m_ItemPre, m_Parent);go.transform.Find("Index/txtIndex").GetComponent<Text>().text = (i + 1).ToString();go.transform.Find("txtUserName").GetComponent<Text>().text = dto.rankList[i].UserName;go.transform.Find("txtCoin").GetComponent<Text>().text = dto.rankList[i].Coin.ToString();}}}private void OnDestroy(){EventCenter.RemoveListener(EventDefine.ShowRankListPanel, Show);EventCenter.RemoveListener<RankListDto>(EventDefine.SendRankListDto, GetRankListDto);}
}

有需要学习视频的欢迎关注微信公众号:

Zjh游戏(十四)用户头像的加载以及排行榜的实现相关推荐

  1. 第二十四节:动态加载JS和动态加载CSS

    1.动态加载JS 一般需要用到js,需要将js放到<script></<script>中,一般script放到页面底部:或者在顶部引入外部js. <!DOCTYPE ...

  2. Three.js(十四)—— 模型文件加载

    文章目录 14.Three.js 加载外部模型文件 14.1 Three.js 数据结构.导入导出 Threejs导出模型信息 自定义模型加载器文件 加载Three.js导出的模型数据 14.2 加载 ...

  3. Vue + Spring Boot 项目实战(十五):动态加载后台菜单

    重要链接: 「系列文章目录」 「项目源码(GitHub)」 本篇目录 前言 一.后端实现 1.表设计 2.pojo 3.菜单查询接口(树结构查询) 二.前端实现 1.后台页面设计 2.数据处理 3.添 ...

  4. 【Android 插件化】基于插件化的恶意软件的加载策略分析 ( 自定义路径加载插件 | 系统路径加载插件 | 用户同意后加载插件 | 隐藏恶意插件 )

    文章目录 一.自定义路径加载插件 二.系统路径加载插件 三.用户同意后加载插件 四.隐藏恶意插件 一.自定义路径加载插件 插件化应用中 , 宿主应用 加载 插件 APK , 需要获取该插件 APK 文 ...

  5. 利用Python进行数据分析(四):数据加载、存储与文件格式

    标题利用Python进行数据分析(四):数据加载.存储与文件格式 学习笔记来源于:简书https://www.jianshu.com/p/047d8c1c7e14 输入输出通常可以划分为几个大类:读取 ...

  6. OpenGL教程翻译 第二十二课 使用Assimp加载模型

    第二十二课 使用Assimp加载模型 原文地址:http://ogldev.atspace.co.uk/(源码请从原文主页下载) 背景 到现在为止我们都在使用手动生成的模型.正如你所想的,指明每个顶点 ...

  7. win7 exfat补丁_win7电脑玩斗仙游戏提示主动防御系统未能成功加载如何解决-系统城...

    斗仙游戏是很多win7系统玩家喜欢的一款大型多人网络游戏,可是近日有用户在游戏中加载"主动防御系统",然后启动的时候提示主动防御系统未能成功加载,为了您的账号安全,游戏将自动退出, ...

  8. postgresql源码学习(57)—— pg中的四种动态库加载方法

    一. 基础知识 1. 什么是库 库其实就是一些通用代码,可以在程序中重复使用,比如一些数学函数,可以不需要自己编写,直接调用相关函数即可实现,避免重复造轮子. 在linux中,支持两种类型的库: 1. ...

  9. ajax离开页面方法,如果用户在页面加载完成之前离开页面,则触发jQuery ajaxError()处理程序...

    我们使用jQuery的全局ajaxError()处理函数来警告用户任何AJAX失败: $(document).ajaxError(function() { $("There was a ne ...

最新文章

  1. 怎样配置VNC服务器使其能在红帽企业Linux3系统引导时自动启动?
  2. android开发之 - 圆形头像
  3. Java solr 分词
  4. golang+数据库定时任务
  5. python中常见的流程_Python面试中最常见的25个问题-结束
  6. 前端学习(1767):前端调试值之内存监控的原理和方法二
  7. HTML5流量价值最大化-赵伊江
  8. python 读取excel图片_如何用Python读取Excel中图片?
  9. 安卓 java 视频_安卓实战项目-动态桌面-rxjava实现搜索本地所有视频
  10. java constructors_[译]understanding constructors
  11. apache url路由配置重写
  12. ubuntu下载对应版本的linux内核源码
  13. 计算机组成原理 精选习题集
  14. php get month,JavaScript从Date对象返回月份 (0 ~ 11)的方法getMonth()
  15. Hacked Exam 14pts 2021Google codejam round1A
  16. 使用阿里的easyexcel 导入xls类型Excel文件报错问题深挖
  17. 如何在金仓数据库KingbaseES中使用pg_get_function_arg_default函数
  18. 二分法求根号二的近似值_根号2约等于多少?
  19. IT桔子 - 千里马俱乐部
  20. 清空linux+history_linux清除history命令

热门文章

  1. MapGIS 6.7安装方法教程
  2. keepalived persistence_timeout参数意义 LVS Persistence 参数的作用
  3. 3_读取遥感影像信息
  4. Oracle建立表空间和用户(图)
  5. fastclick 解决移动端click事件延迟300ms和点击穿透问题
  6. springmvc运行时,Failed to read candidate component class;nested exception is java.lang.IllegalArgument
  7. java 基于linux(centos7)amr转mp3
  8. Frameset打印frame的问题(downmoon)
  9. Ideal比较好用、常用的快捷键
  10. Ideal 调出服务控制台