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

【Unity】QFramework通用背包系统优化:TipPanel优化

前言

在学习凉鞋老师的课程《QFramework系统设计:通用背包系统》第五章时,笔者对物品提示TipPanel界面进行了一些优化。

优化内容包括:

  • 解决闪烁问题
  • 跟随鼠标移动
  • 自适应界面大小
  • 生成位置优化

效果还是蛮丝滑的:
请添加图片描述

解决闪烁问题

由于原代码逻辑是:当鼠标检测到Slot UI时,显示Tips;当未检测到Slot UI时,关闭Tips。
于是当Tips界面叠在Slot UI上时,鼠标移动到重叠部分便会反复触发以上逻辑。

此时只需要将Tips界面的Raycast Target关闭就可以了(如果需要Tips界面有交互,可以考虑其他解决方案)。

跟随鼠标移动

这个比较简单,就是将生成部分的代码封装成方法,在Update()方法中调用即可。

自适应页面大小

笔者给Tips界面添加了ContentSizeFitter组件,使其可以随自身内容改变大小。
但还是遇到一些问题,比如从一个Slot UI移动到另一个Slot UI上时,Tips界面的大小不会立即发生变化以适应新的大小。

原因是ContentSizeFitter的调整发生在布局的重计算阶段,在连续快速地更换内容时可能不会立即反映最新的内容变化。
这时候就需要使用LayoutRebuilder.ForceRebuildLayoutImmediate()方法,立即强制重建布局。

改为默认生成到鼠标的左下方

当鼠标靠近屏幕左边界时,生成到右下方;当鼠标靠近屏幕下边界时,生成到左上方;以此类推。

代码实现

using UnityEngine;
using UnityEngine.UI;

namespace QFramework
{
    public class UIItemTip : MonoBehaviour
    {
        public GameObject TipPanel;
        public Image Icon;
        public Text NameText;
        public Text DescriptionText;
        public Text AttributeText;
        public Text IDText;

        private static UIItemTip mDefault;

        private void Awake()
        {
            mDefault = this;
        }

        private void Start()
        {
            mDefault.TipPanel.Hide();

            if (AttributeText.text == "")
                AttributeText.Hide();
            else
                AttributeText.Show();

            if (IDText.text == "")
                IDText.Hide();
            else
                IDText.Show();
        }

        private void Update()
        {
            UpdatePosition();
        }

        public static void Show(UISlot slot)
        {
            if (slot.Data.Item != null)
            {
                mDefault.Icon.sprite = slot.Data.Item.GetIcon;
                mDefault.NameText.text = slot.Data.Item.GetName;
                mDefault.DescriptionText.text = slot.Data.Item.GetDescription;

                mDefault.TipPanel.Show();

                UpdatePosition();
            }
        }

        public static void Hide()
        {
            mDefault.TipPanel.Hide();
        }

        public static void UpdatePosition()
        {
            Vector3 mousePos = Input.mousePosition;
            Vector3[] corners = new Vector3[4];
            RectTransform rectTrans = mDefault.TipPanel.transform as RectTransform;

            // 更新TipPanel内容后,强制刷新布局
            LayoutRebuilder.ForceRebuildLayoutImmediate(rectTrans);

            // 获取界面的四个角点
            rectTrans.GetWorldCorners(corners);
            float width = corners[3].x - corners[0].x;
            float height = corners[1].y - corners[0].y;

            // 根据鼠标和屏幕的相对位置,调整生成 TipPanel 的位置
            if (mousePos.y < height && mousePos.x > width)
                rectTrans.position = mousePos + 0.5f * height * Vector3.up + 0.5f * width * Vector3.left;
            else if (mousePos.y > height && mousePos.x < width)
                rectTrans.position = mousePos + 0.5f * height * Vector3.down + 0.5f * width * Vector3.right;
            else if (mousePos.y < height && mousePos.x < width)
                rectTrans.position = mousePos + 0.5f * height * Vector3.up + 0.5f * width * Vector3.right;
            else
                rectTrans.position = mousePos + 0.5f * height * Vector3.down + 0.5f * width * Vector3.left;
            // 0.51f 多了0.01f,使Tips和鼠标保持一小段距离
        }

        private void OnDestroy()
        {
            mDefault = null;
        }
    }
}


http://www.kler.cn/a/231970.html

相关文章:

  • vue+svg圆形进度条组件
  • ElasticSearch学习笔记二:使用Java客户端
  • MySQL数据库:SQL语言入门 【2】(学习笔记)
  • 蓝桥杯-洛谷刷题-day3(C++)
  • FPGA使用Verilog实现CAN通信
  • CentOS8 在MySQL8.0 实现半同步复制
  • 服务器与电脑的区别?
  • 座位预约|座位预约小程序|基于微信小程序的图书馆自习室座位预约管理系统设计与实现(源码+数据库+文档)
  • linux centos安装LibreOffice
  • IS-IS P2P网路类型 地址不在同一子网建立邻居关系
  • 踩坑实录(Third Day)
  • mysql:事务的特性ACID、并发事务(脏读、不可重复读、幻读、如何解决、隔离级别)、undo log和redo log的区别、相关面试题和答案
  • [嵌入式AI从0开始到入土]5_炼丹炉的搭建(基于wsl2_Ubuntu22.04)
  • 今日arXiv最热NLP大模型论文:无需数据集,大模型可通过强化学习与实体环境高效对齐 | ICLR2024
  • 创建一个Vue项目(含npm install卡住不动的解决)
  • 宽字节注入漏洞原理以及修复方法
  • 【Java万花筒】架构未来:Java ME与物联网的无缝融合
  • 电力负荷预测 | 基于GRU门控循环单元的深度学习电力负荷预测,含预测未来(Python)
  • 版本控制工具——Git
  • 用Matlab 2015a svmtrain函数训练的SVM model在2021b无法使用的解决方法
  • WPF绘制矢量图形并绑定到界面的方法
  • CTFshow web(php命令执行 37-40)
  • 高级数据结构与算法 | 布谷鸟过滤器(Cuckoo Filter):原理、实现、LSM Tree 优化
  • 汇编笔记 01
  • Unity类银河恶魔城学习记录4-7 P60 Counter‘s attack window 源代码
  • FlinkSql 窗口函数