当前位置: 首页 > news >正文

Unity实现经验条动态自适应

在游戏开发中,经验有用到分段式经验条的情况,但是这种分段式分辨率仅仅靠Unity自带的锚点或者以宽,或者高,或者Expand模式等,无法做到完美适配,因此就需要通过代码根据窗口不同的分辨率计算得到比例,然后动态赋值进行自适应。

正常的经验条在正常屏幕比例下的显示情况
在这里插入图片描述

当我宽度进行拉伸时,发现背景和经验条就不适配了
在这里插入图片描述

当我以高度进行拉伸时,也是如此,因此我们就需要通过代码进行动态适配

在这里插入图片描述

这是Unity中按照标准自定义分辨率显示的经验条,是通过Grid Layout Group组件下设置了10张同样的图片,将图片的Image Type改为Filled,利用Fill Amount属性对每格经验条的比例进行显示,这里的Cell Size也是根据整个画布的长度,以及每个Item之间的间隙,计算出来的,我的Canvas分辨率是1334 * 768,因此Canvas的长度是1334,Exp的图标的Width是76,经验条的背景的小间隙的左边是8,右边是10,每个Item的间隙是10,我们10个Item,就意味着有9个间隙,因此1334- (8+10+76 + 9 x 10) = 1150, 由于有10个Item,因此每个Item的长度就是115,因此这个Cell Size就是115
在这里插入图片描述
在写代码进行动态适配之前,我们还需要对Canvas做一个基础设置,就是我们以高进行拉伸以自适应宽度,如果你想以宽进行拉伸自适应也是可以的
在这里插入图片描述

我们首先得到是当前Canvas的高度 / 当前实际屏幕高度,得到当前画布和真实屏幕高度的比值,通过这个比值计算出当前屏幕的宽度,接下来我们要计算每个经验格子的宽度,于是就将我们根据动态计算的出来的 (当前屏幕宽度- 184)/ 10 = 单个格子经验条的宽度,这个184其实就是上面说的(8+10+76 + 9 x 10)就是这些间隙,得到之后,将格子背景,和格子本身的Grid Layout Group的Width进行赋值,便可以实现动态自适应。

/// <summary>/// 经验条根据Canvas以Height拉伸进行自适应宽度/// </summary>private void AutoAdaptExp(){float rate = 1.0f * Consts.ScreenHeight / Screen.height;float screenWidth = Screen.width * rate;float width = (screenWidth - 184) / 10;mItemGridGroup.cellSize = new Vector2(width, 7);mBGGridGroup.cellSize = new Vector2(width, 7);}private void Update(){if (Time.frameCount % 10 == 0){AutoAdaptExp();}}

测试结果,以高度进行拉伸,完美适配
在这里插入图片描述
以宽度进行拉伸,也是完美适配
在这里插入图片描述

适配完成后,就简单说下如何根据经验赋值,通常来说就是通过当前经验和当前等级所需经验的比值得到Index,小于Index也就是代表index是满的经验,大于Index说明这个经验值不足,唯一需要计算的就是等于Index的情况,通过取余得到当前格子的经验,与整个格子经验的比值就得得到当前Image的fillAmount,下面贴出代码

        private void RefreshUI(){PlayerData pd = LoginScene.Instance.PlayerData;AutoAdaptExp();Image[] itemImgs = mItemGridGroup.GetComponentsInChildren<Image>();int exp = (int)(1.0f * PECommon.GetExpUpByLv(pd.lv) / 100) * 100 / itemImgs.Length;int index = pd.exp / exp;for (int i = 0; i < itemImgs.Length; i++){Image img = itemImgs[i];if (i < index){img.fillAmount = 1;}else if (i == index){float a = (pd.exp % (exp * index * 1.0f)) / exp;img.fillAmount = (pd.exp % (exp * index * 1.0f)) / exp;}else{img.fillAmount = 0;}}}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 用Python实现时间序列模型实战——Day 3: 时间序列数据预处理
  • Windows 禁用tls 1.0 1.1
  • C语言的选择结构
  • 网络优化4|网络流问题|路径规划问题|车辆路径问题
  • 8月27日笔记
  • MySQL——子查询(5)带比较运算符的子查询
  • 基于springboot篮球竞赛预约平台设计与实现
  • 【Unity输入】Unity输入方式总结
  • Chrome H265 WebRTC 支持
  • NoSql数据库Redis集群
  • C++ | Leetcode C++题解之第376题摆动序列
  • 前端面试宝典【CSS篇】【10】
  • 永久去除windows11推荐产品的软件
  • OpenCV图像拼接多频段融合源码重构
  • 如何将开发工具设置成滚动鼠标改变字体大小
  • Brief introduction of how to 'Call, Apply and Bind'
  • C++入门教程(10):for 语句
  • canvas 高仿 Apple Watch 表盘
  • CSS盒模型深入
  • Debian下无root权限使用Python访问Oracle
  • IDEA 插件开发入门教程
  • Java多态
  • Objective-C 中关联引用的概念
  • PHP的Ev教程三(Periodic watcher)
  • ViewService——一种保证客户端与服务端同步的方法
  • vuex 笔记整理
  • 大型网站性能监测、分析与优化常见问题QA
  • 服务器之间,相同帐号,实现免密钥登录
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 后端_MYSQL
  • 十年未变!安全,谁之责?(下)
  • 物联网链路协议
  • 项目实战-Api的解决方案
  • 在weex里面使用chart图表
  • 正则表达式小结
  • 带你开发类似Pokemon Go的AR游戏
  • 昨天1024程序员节,我故意写了个死循环~
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (2015)JS ES6 必知的十个 特性
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (每日一问)操作系统:常见的 Linux 指令详解
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .md即markdown文件的基本常用编写语法
  • .NET Project Open Day(2011.11.13)
  • .NET 的程序集加载上下文
  • .NET 使用配置文件
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET企业级应用架构设计系列之应用服务器
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • //usr/lib/libgdal.so.20:对‘sqlite3_column_table_name’未定义的引用
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku