麦田物语学习笔记:实现根据物品详情显示

embedded/2025/1/14 14:09:17/

基本流程

1.代码思路

        (1)新建ItemTooltip.cs用于控制ItemTooltip(这个是在Hierarchy里的)中的文本内容

回顾一下:对于物品描述(ItemTooltip)的UI有三个部分,第一部分是名字和类型,第二部分是物品详解,第三部分是金币图标以及价值的文本

        (2)获取UI中的所有部分,因为item分为可出售和不可出售的,所以可出售的就将第三部分激活,反之隐藏

        (3)因为在商店里的物品是全价,而背包里的是打折后的价格,所以需要判断是否在商店里 

        (4)需要通过InventoryUI去调用这个物品信息显示,也就是ItemTooltip

        (5)新建一个脚本ShowItemTooltip.cs于Slot_Bag上,脚本的功能是让格子可以显示ItemTooltip,要使用ItemTooltip中的SetupTooltip就必须传入ItemDetails,然而ShowItemTooltip刚好挂载在Slot_Bag上,而在同个对象中又挂载了SlotUI.cs,它里面本身就有ItemDetails

        (6)在渲染物品描述时,从一行切换到两行会有一个明显的渲染延迟,所以要用到LayoutRebuilder中的ForceRebuildLayoutImmediate来强制重新生成hierarchy中的ItemTooltip

2.代码实现

ItemTooltip.cs

public class ItemTooltip : MonoBehaviour
{[SerializeField] private TextMeshProUGUI nameText;[SerializeField] private TextMeshProUGUI typeText;[SerializeField] private TextMeshProUGUI descriptionText;[SerializeField] private Text valueText;[SerializeField] private GameObject buttomPart;public void SetupTooltip(ItemDetails itemDetails, SlotType slotType)//这里的SlotType用于判断是否在商店中,因为价格不一致{nameText.text = itemDetails.itemName;typeText.text = GetItemType(itemDetails.itemType);descriptionText.text = itemDetails.itemDescription;if (itemDetails.itemType == ItemType.Seed || itemDetails.itemType == ItemType.Commodity || itemDetails.itemType == ItemType.Furniture)//种子,商品,家具{buttomPart.SetActive(true);var price = itemDetails.itemPrice;if (slotType == SlotType.Bag){price = (int)(price * itemDetails.sellPercentage);}valueText.text = price.ToString();}else{buttomPart.SetActive(false);}LayoutRebuilder.ForceRebuildLayoutImmediate(GetComponent<RectTransform>());}public string GetItemType(ItemType itemType){return itemType switch{ItemType.Seed => "种子",ItemType.Commodity => "商品",ItemType.Furniture => "家具",ItemType.BreakTool => "工具",ItemType.ChopTool => "工具",ItemType.HoeTool => "工具",ItemType.ReapTool => "工具",ItemType.WaterTool => "工具",_ => "无"};}}

showItemTooltip.cs

namespace FuliFarm.Inventory
{[RequireComponent(typeof(SlotUI))]public class ShowItemTooltip : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler{private SlotUI slotUI;//当鼠标滑进Slot时,如果有物品信息就显示Tooltipprivate InventoryUI inventoryUI => GetComponentInParent<InventoryUI>();private void Awake(){slotUI = GetComponent<SlotUI>();}public void OnPointerEnter(PointerEventData eventData){if (slotUI.itemAmount != 0){inventoryUI.itemTooltip.gameObject.SetActive(true);inventoryUI.itemTooltip.SetupTooltip(slotUI.itemDetails, slotUI.slotType);inventoryUI.itemTooltip.GetComponent<RectTransform>().pivot = new Vector2(0.5f, 0);inventoryUI.itemTooltip.transform.position = transform.position + Vector3.up * 60;}else {inventoryUI.itemTooltip.gameObject.SetActive(false);}}public void OnPointerExit(PointerEventData eventData){inventoryUI.itemTooltip.gameObject.SetActive(false);}}
}

InventoryUI中新增变量

public ItemTooltip itemTooltip;

最终效果

补充知识点

1.IPointerEnterHandler和IPointerExitHandler接口

        IPointerEnterHandler 接口

  • 定义和用途
    • IPointerEnterHandler是 Unity 中的一个接口。当鼠标指针(或者在支持触摸的设备上,对应的触摸模拟指针)进入到一个带有碰撞器(Collider)的游戏对象(GameObject)的范围时,实现了这个接口的脚本中的OnPointerEnter方法就会被调用。这在很多情况下非常有用,比如制作游戏中的 UI 交互或者物体检测鼠标悬停效果。
  • 示例场景
    • 假设你在制作一个角色扮演游戏,有各种道具图标显示在游戏界面上。当玩家的鼠标指针移动到某个道具图标上时,你想要显示这个道具的详细信息。你可以给道具图标对应的游戏对象添加一个碰撞器(比如BoxCollider2D用于 2D 游戏,BoxCollider用于 3D 游戏),然后在挂载的脚本中实现IPointerEnterHandler接口。

        IPointerExitHandler 接口

  • 定义和用途
    • IPointerEnterHandler相对应,IPointerExitHandler接口用于处理当鼠标指针(或触摸模拟指针)离开一个带有碰撞器的游戏对象范围时的事件。这个接口中的OnPointerExit方法会在这种情况下被调用。它通常和IPointerEnterHandler一起使用,来实现完整的鼠标悬停(进入和离开)交互逻辑。

http://www.ppmy.cn/embedded/153853.html

相关文章

在 Alpine Linux 下通过 Docker 部署 PostgreSQL 服务器

简要介绍 Docker 是一个开源的容器化平台&#xff0c;它使得开发者能够轻松创建、部署和运行应用程序。通过使用 Docker&#xff0c;程序员可以把应用及其所有依赖打包在一个轻量级的容器中&#xff0c;这样可以确保在不同环境中的一致性。PostgreSQL&#xff08;简称 psql&am…

MySQL:内置函数

1.时间函数 获取当前日期 年月日 获取当前的时间 时分秒 获取当前时间戳 自动转化为年月日时分秒 从时间戳截取日期部分 1990-10-1 10天 1990-10-1 - 10分钟 2025-1-11 - 1949-10-1相差多少天 现在的日期和时间 ‘ 案例 创建一个留言表 插入两条数据 查询一下 显示所有留言…

ThreadLocal 的使用场景

在现代电商平台中&#xff0c;ThreadLocal 常用于以下场景&#xff0c;特别是与线程隔离相关的业务中&#xff0c;以提高性能和简化上下文传递。 1. 用户上下文信息管理 场景&#xff1a;在用户发起的每次请求中&#xff0c;需要携带用户 ID、角色、权限等信息&#xff0c;而这…

TypeScript语言的学习路线

TypeScript语言的学习路线 TypeScript&#xff08;TS&#xff09;是由Microsoft开发的一种开源编程语言&#xff0c;是JavaScript的超集&#xff0c;提供了严格的类型检查和基于类的面向对象编程特性。随着前端开发的不断进步&#xff0c;TypeScript逐渐成为了现代前端开发的主…

Spark 与 Flink 的对比:哪个更适合实时处理?

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

【Rust】结构体示例与调试

目录 思维导图 1. 引言 2. 初始程序示例 3. 使用元组重构 4. 使用结构体重构 5. 调试与输出 6. 进一步的功能扩展 思维导图 1. 引言 本文通过一个计算矩形面积的程序&#xff0c;展示了如何从简单变量逐步重构到使用结构体&#xff0c;以提高代码的清晰度和可管理性。结…

量子技术的发展

量子技术作为一个前沿领域,近年来取得了显著进展,并且在多个领域都展示了潜力,尤其是在计算、通信、传感和加密等方面。尽管量子技术的商用化仍然处于早期阶段,但它的应用前景极为广泛,吸引了大量的研究投入和技术创新。以下是量子技术的最新进展、突破和相关产品的概述。…

宇航用VIRTEX5系列FPGA的动态刷新方法及实现

SRAM型FPGA在宇航领域有广泛的应用&#xff0c;为解决FPGA在空间环境中的单粒子翻转问题&#xff0c;增强设计的可靠性&#xff0c;本文介绍一种低成本的抗辐照解决方案。该方案从外置高可靠存储器中读取配置数据&#xff0c;通过定时刷新结合三模冗余的方式消除单粒子影响&…