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

Unity类银河战士恶魔城学习总结(P141 Finalising ToolTip优化UI显示)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili

教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/

UI部分暂时完结!!!

本章节优化了UI中物品描述的显示效果,技能描述的显示效果

并且可以批量化更改文本描述

主要通过更改继承实现

UI_ToolTip.cs

以下脚本都不同程度改变了继承

脚本功能概述

  • 提示框位置动态调整: 根据鼠标位置动态调整提示框的位置,避免提示框超出屏幕边界。
  • 字体大小调整: 根据提示框内文本的长度动态调整字体大小,以适配长文本。

方法 1: AdjustPosition()

  • 功能:
    动态调整提示框位置,避免提示框超出屏幕边界。

  • 关键逻辑:
    • mousePosition.x > xLimit
      如果鼠标靠近屏幕右侧,提示框会向左偏移(-xOffset);否则向右偏移(+xOffset)。
    • mousePosition.y > yLimit
      如果鼠标靠近屏幕顶部,提示框会向下偏移(-yOffset);否则向上偏移(+yOffset)。
    • transform.position
      更新提示框的位置为鼠标位置加偏移量的坐标。

方法 2: AdjustFontSize(TextMeshProUGUI _text)

  • 功能:
    根据文本长度动态调整字体大小,防止长文本溢出。
  • 关键逻辑:
    • 如果文本长度大于12个字符,字体大小缩小至80%。
    • 使用TextMeshProUGUI(Unity的高级文本组件)处理文本渲染,支持复杂的文本特效。
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;//2024.11.22  
//szq
public class UI_ToolTip : MonoBehaviour
{[SerializeField] private float xLimit=960;[SerializeField] private float yLimit=540;[SerializeField] private float xOffset = 150;[SerializeField] private float yOffset = 150;public virtual void AdjustPosition(){Vector2 mousePosition = Input.mousePosition;float newXoffset = 0;float newYoffset = 0;if (mousePosition.x > xLimit)newXoffset = -xOffset;elsenewXoffset = xOffset;//鼠标靠近屏幕右侧时,提示框向左偏移;否则向右偏移if (mousePosition.y > yLimit)newYoffset = -yOffset;elsenewYoffset = yOffset;//鼠标靠近屏幕顶部时,提示框向下偏移;否则向上偏移transform.position = new Vector2(mousePosition.x + newXoffset, mousePosition.y + newYoffset);//更新提示框位置为鼠标位置偏移后的点}public void AdjustFontSize(TextMeshProUGUI _text)//根据文本长度调整字体大小{if(_text.text.Length > 12 )_text.fontSize = _text.fontSize * .8f;}
}

UI_SkillToolTip.cs

using TMPro;
using UnityEngine;public class UI_SkillToolTip : UI_ToolTip
{[SerializeField] private TextMeshProUGUI skillText;//显示技能描述的文本组件[SerializeField] private TextMeshProUGUI skillName;[SerializeField] private TextMeshProUGUI skillCost;[SerializeField] private float defaultNameFontSize;public void ShowToolTip(string _skillDescprtion, string _skillName,int _price)//显示工具提示{skillName.text = _skillName;skillText.text = _skillDescprtion;skillCost.text = "Cost: " + _price;AdjustPosition();AdjustFontSize(skillName);gameObject.SetActive(true);}public virtual void HideToolTip() //隐藏工具提示{skillName.fontSize = defaultNameFontSize;gameObject.SetActive(false);}
}

UI_ItemTooltip.cs

using TMPro;
using UnityEngine;//2024年11月14日
public class UI_ItemTooltip : UI_ToolTip
{[SerializeField] private TextMeshProUGUI itemNameText; // 名称显示文本[SerializeField] private TextMeshProUGUI itemTypeText; // 类型显示文本[SerializeField] private TextMeshProUGUI itemDescription;// 描述显示文本[SerializeField] private int defaultFontSize=32;public void ShowToolTIp(ItemData_Equipment item)//于显示工具提示,当玩家鼠标悬停在物品上时调用{if (item == null)return;itemNameText.text = item.itemName;itemTypeText.text = item.equipmentType.ToString();itemDescription.text = item.GetDescription();AdjustFontSize(itemNameText);AdjustPosition();gameObject.SetActive(true);}public void HideToolTip()//该方法用于隐藏工具提示,当玩家离开物品时调用{itemNameText.fontSize = defaultFontSize;gameObject.SetActive(false);}
}

UI_ItemSlot.cs

using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;//物品数量的UI,放在ItemSlot上
// p105添加了Grad Layout Group,自动排列public class UI_ItemSlot : MonoBehaviour, IPointerDownHandler, IPointerEnterHandler, IPointerExitHandler//实现接口
{[SerializeField] protected Image itemImage;// 物品图标[SerializeField] protected TextMeshProUGUI itemText;// 显示堆叠数量的文本protected UI ui;public InventoryItem item;// 当前物品槽中所显示的物品protected virtual void Start(){ui = GetComponentInParent<UI>();//获取UI组件}public void UpdataSlot(InventoryItem _newitem)//更新物品槽{item = _newitem;// 传入的新物品itemImage.color = Color.white;//获取了物品,itemslot透明变成白色,变得可见if (item != null)//列表中的物体不是空的{itemImage.sprite = item.data.icon;//获得图标if (item.stackSize > 1){itemText.text = item.stackSize.ToString();//显示堆叠数量}else{itemText.text = "";//不显示数量}}}public void CleanUpSlot()清空物品槽{item = null;// 将物品槽内物品设为空itemImage.sprite = null;// 清除物品图标itemImage.color = Color.clear;// 让物品槽变得不可见itemText.text = ""; // 清空堆叠数量的显示}public virtual void OnPointerDown(PointerEventData eventData)//拾取之后点击物品,改成virtual之后可以被子类重写{if (item == null)//如果物品槽为空return;if (Input.GetKey(KeyCode.LeftControl)){Inventory.instance.RemoveItem(item.data);//移除物品return;}if (item.data.itemType == ItemType.Equipment)// 如果点击的物品是装备类型Inventory.instance.EquipItem(item.data);//装备物品ui.itemToolTip.HideToolTip();//隐藏物品详情}public void OnPointerEnter(PointerEventData eventData){if(item == null)return;ui.itemToolTip.ShowToolTIp(item.data as ItemData_Equipment);//显示物品详情}public void OnPointerExit(PointerEventData eventData){if (item == null)return;ui.itemToolTip.HideToolTip();//隐藏物品详情}
}

ItemData_Equipment.cs

using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;//2024年11月1日
public enum EquipmentType
{Weapon,Armor,Amulet,//护身符Flask//药水瓶
}[CreateAssetMenu(fileName = "New Item Data", menuName = "Data/Equipment")]//因为继承了ItemData,所以在资源管理器中创建新的Item,创建的物品自带这个脚本public class ItemData_Equipment : ItemData
{public EquipmentType equipmentType;[Header("独特效果")]public float itemCoolDown;//物品冷却时间public ItemEffect[] itemEffects;//可以添加物品的效果[Header("主属性")]public int strength;//力量,1点增加1攻击力和%1爆伤public int agility;//敏捷,1点增加1%闪避和%1暴击率public int intelligence;//智力,1点增加1法术强度和%1魔抗public int vitality;//活力,1点增加3生命值[Header("攻击属性")]public int damage;public int critChance;//暴击率public int critPower;//暴击伤害,默认%150[Header("防守属性")]public int maxHealth;public int armor;//护甲public int evasion;//闪避public int magicResistance;//魔抗[Header("魔法属性")]public int fireDamage;public int iceDamage;public int lightningDamage;[Header("制作需求")]//Craft requirementspublic List<InventoryItem> craftingMaterials;private int descriptionLength;public void Effect(Transform _enemyPositon)//执行物品效果{foreach (var item in itemEffects){item.ExcuteEffect(_enemyPositon);}}public void AddModifiers(){PlayerStats playerStats = PlayerManager.instance.player.GetComponent<PlayerStats>();playerStats.strength.AddModifier(strength);playerStats.agility.AddModifier(agility);playerStats.intelligence.AddModifier(intelligence);playerStats.vitality.AddModifier(vitality);playerStats.damage.AddModifier(damage);playerStats.critChance.AddModifier(critChance);playerStats.critPower.AddModifier(critPower);playerStats.maxHealth.AddModifier(maxHealth);playerStats.armor.AddModifier(armor);playerStats.evasion.AddModifier(evasion);playerStats.magicResistance.AddModifier(magicResistance);playerStats.fireDamage.AddModifier(fireDamage);playerStats.iceDamage.AddModifier(iceDamage);playerStats.lightingDamage.AddModifier(lightningDamage);}public void RemoveModifiers(){PlayerStats playerStats = PlayerManager.instance.player.GetComponent<PlayerStats>();playerStats.strength.RemoveModifier(strength);playerStats.agility.RemoveModifier(agility);playerStats.intelligence.RemoveModifier(intelligence);playerStats.vitality.RemoveModifier(vitality);playerStats.damage.RemoveModifier(damage);playerStats.critChance.RemoveModifier(critChance);playerStats.critPower.RemoveModifier(critPower);playerStats.maxHealth.RemoveModifier(maxHealth);playerStats.armor.RemoveModifier(armor);playerStats.evasion.RemoveModifier(evasion);playerStats.magicResistance.RemoveModifier(magicResistance);playerStats.fireDamage.RemoveModifier(fireDamage);playerStats.iceDamage.RemoveModifier(iceDamage);playerStats.lightingDamage.RemoveModifier(lightningDamage);}public override string GetDescription(){sb.Length = 0;//确保每次调用时是从头开始descriptionLength = 0;//重置描述的属性数量AddItemDescription(strength, "力量");AddItemDescription(agility, "敏捷");AddItemDescription(intelligence, "智力");AddItemDescription(vitality, "活力");AddItemDescription(damage, "伤害");AddItemDescription(critChance, "暴击率");AddItemDescription(critPower, "暴击伤害");AddItemDescription(maxHealth, "生命值");AddItemDescription(armor, "护甲");AddItemDescription(evasion, "闪避");AddItemDescription(magicResistance, "魔抗");AddItemDescription(fireDamage, "火焰伤害");AddItemDescription(iceDamage, "冰霜伤害");AddItemDescription(lightningDamage, "闪电伤害");for(int i = 0; i < itemEffects.Length; i++)//遍历物品效果{if (itemEffects[i].effectDescription.Length>0){sb.AppendLine();sb.Append("唯一:" + itemEffects[i].effectDescription);descriptionLength++;}}if (descriptionLength < 5)//确保最终返回的描述文本至少有 5 行内容{for (int i = 0; i < 5 - descriptionLength; i++){sb.AppendLine();sb.Append("");//空行}}return sb.ToString();//返回描述文本}private void AddItemDescription(int _value, string _name){if (_value != 0)//判断该属性没有实际值{if (sb.Length > 0)sb.AppendLine();//换行if (_value > 0)//sb.Append(_name+";"+_value);sb.Append("+ " + _value + " " + _name);//添加属性描述descriptionLength++;//每成功添加一个属性}}
}

相关文章:

Unity类银河战士恶魔城学习总结(P141 Finalising ToolTip优化UI显示)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ UI部分暂时完结&#xff01;&#xff01;&#xff01; 本章节优化了UI中物品描述的显示效果&#xff0c;技能描述的显示效果 并且可以批…...

c++(入门)

1. 引用 引用的定义 引用是另一个变量的别名&#xff0c;它在声明时必须被初始化&#xff0c;并且一旦初始化后&#xff0c;它就始终引用那个变量。 引用的语法 引用的声明方式是在变量名前加上&符号。 引用的特点 引用必须在声明时初始化。引用一旦初始化后&#x…...

【优选算法】前缀和

目录 一、[【模板】前缀和](https://www.nowcoder.com/practice/acead2f4c28c401889915da98ecdc6bf?tpId230&tqId2021480&ru/exam/oj&qru/ta/dynamic-programming/question-ranking&sourceUrl%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595…...

Spring Bean 的生命周期详解

所谓万物皆对象&#xff0c;对于一个 bean 而言&#xff0c;从出生到死亡&#xff0c;他要经历哪些阶段呢&#xff1f; 生命周期 理解对象的生命周期&#xff0c;可以帮助我们更好的做一些扩展。 一个对象从被创建到被垃圾回收&#xff0c;可以大致分为这 5 个阶段&#xff1a…...

MySQL【知识改变命运】12

视图 1&#xff1a;什么是视图2&#xff1a;创建视图使用视图&#xff08;视图的好处&#xff09;2.1.隐藏敏感字段2.2.对外提供统一访问3&#xff1a;视图和真实表进⾏表连接查询 4&#xff1a;修改视图数据4.1&#xff1a;通过真实表修改数据&#xff0c;会影响视图4.2&#…...

shell编程(完整版)

目录 一、shell脚本解释器 二、shell脚本的执行 三、变量的使用 四、永久环境变量 按用户设置永久环境变量 文件路径&#xff1a; 示例步骤&#xff1a; 删除永久环境变量 五、脚本程序传递参数怎么实现 六、用编程进行数学运算 shell中利用expr进行运算 运算与变量…...

数字逻辑(一)——导论

1.导论 1.1什么是数字逻辑&#xff1f; 数字逻辑是指在数字电路设计、计算机科学领域中对于离散的二进制信号进行逻辑处理、运算、存储和传输的基本原理和方法。 1.2数字量和模拟量的区别 数字量&#xff1a;在时间上和数量上都是离散的、不连续的物理量。模拟量&#xff1…...

量化交易系统开发-实时行情自动化交易-4.4.做市策略

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来继续说说做市策略原理。 做市策…...

《线性代数的本质》

之前收藏的一门课&#xff0c;刚好期末复习&#xff0c;顺便看一看哈哈 课程链接&#xff1a;【线性代数的本质】合集-转载于3Blue1Brown官方双语】 向量究竟是什么 线性代数中最基础、最根源的组成部分就是向量&#xff0c;需要先明白什么是向量 不同专业对向量的看法 物理专…...

Gbase8s 允许内置用户创建用户以及创建只读权限用户以及利用角色管理普通用户权限

Gbase8s 允许内置用户创建用户以及创建只读权限用户以及利用角色管理普通用户权限 普通安装实例创建数据库以后,DBA权限只有gbasedbt用户。gbasdbt可以创建普通用户,并且给普通用户赋予库及权限或者表级权限。 但是gbasedbt用户口令和操作系统相关,所以想在不提供gbasedbt的…...

24/11/25 视觉笔记 深度传感器和手势识别

本章的目的是开发一个应用程序&#xff0c;使用深度传感器的输出实时检测和跟踪简单的手势。该应用程序将分析每个已捕捉的帧。并执行以下任务。 手部区域分割&#xff1a;通过分析Kinect传感器的深度图输出&#xff0c;在每一帧中提取用户的手部区域&#xff0c;这是通过阈值…...

迄今为止的排序算法总结

迄今为止的排序算法总结 7.10 迄今为止的排序算法总结复杂度和稳定性时间复杂度测试程序sortAlgorithm.hsortAlgorithm.cpptest.cpp 时间复杂度测试结果 7.10 迄今为止的排序算法总结 复杂度和稳定性 排序算法平均情况最好情况最坏情况稳定性空间复杂度选择排序O(n^2)O(n^2)O…...

HTML和CSS 表单、表格练习

HTML和CSS 表格练习 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>HTML表格练习</title>…...

H5流媒体播放器EasyPlayer.js网页直播/点播播放器如果H.265视频在播放器上播放不流畅,可以考虑的解决方案

随着流媒体技术的迅速发展&#xff0c;H5流媒体播放器已成为现代网络视频播放的重要工具。其中&#xff0c;EasyPlayer.js网页直播/点播播放器作为一款功能强大的H5播放器&#xff0c;凭借其全面的协议支持、多种解码方式以及跨平台兼容性&#xff0c;赢得了广泛的关注和应用。…...

Http 转 https 中 Nginx 的详细配置过程

摘要 本节将简要介绍从 HTTP 到 HTTPS 的配置过程&#xff0c;并完整展示 Nginx 的相关配置信息。 经过两天断断续续的调试&#xff0c;终于将 http 变成 https 了。现在说说这个安装 ssl 证书的过程。 服务器是在某云上。这个过程大致分为三个步骤&#xff1a;申请 ssl 证书、…...

【测试工具JMeter篇】JMeter性能测试入门级教程(二)出炉,测试君请各位收藏了!!!

上篇文章&#xff1a;CSDN 我们介绍了JMeter的一些原理介绍&#xff0c;以及安装配置和启动流程&#xff0c;本文我们就来讲讲JMeter如何使用。 一、JMeter目录结构组成 1. 根目录 Jmeter安装包解压后的根目录如下图&#xff1a; 1.1 backups目录&#xff1a;脚本备份目录&am…...

Otter 安装流程

优质博文&#xff1a;IT-BLOG-CN 一、背景 随着公司的发展&#xff0c;订单库的数据目前已达到千万级别&#xff0c;需要进行分表分库&#xff0c;就需要对数据进行迁移&#xff0c;我们使用了otter&#xff0c;这里简单整理下&#xff0c;otter 的安装过程&#xff0c;希望对…...

一文学会Golang里拼接字符串的6种方式(性能对比)

g o l a n g golang golang的 s t r i n g string string类型是不可修改的&#xff0c;对于拼接字符串来说&#xff0c;本质上还是创建一个新的对象将数据放进去。主要有以下几种拼接方式 拼接方式介绍 1.使用 s t r i n g string string自带的运算符 ans ans s2. 使用…...

【笔记】Linux下编译Python3.10.15为动态库同时正确处理OpenSSL3依赖

之前自己第一次编译Python后发现pip会提示无法使用SSL&#xff0c;后来了解到是自己编译时没有配置OpenSSL。这个过程有点曲折&#xff0c;里面有一个坑&#xff0c;怕忘记于是写博客记录一下。 首先是下载OpenSSL&#xff0c;Python3.10.15支持此时最新版的OpenSSL 3.4.0&…...

Go语言获取客户端真实IP

在一些需求中&#xff0c;服务器需要记录客户端的ip地址&#xff0c;要获取ip地址&#xff0c;则需要有http.Request的对象参数传入&#xff0c;以下代码直接放在util中使用。 文件名&#xff1a;ip_utils.go package utilsimport ("context""github.com/spf1…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...