麦田物语学习笔记:背包物品选择高亮显示和动画

如题,本篇文章没讲动画效果

基本流程

1.代码思路

(1)先用点击事件的接口函数去实现,点击后反转选择状态(isSelected),以及设置激活状态(SetActive),并且还需要判断该格子是否为空,空格子是点不动的,完成后以上后,出现的问题是高亮应该是有且仅有一个格子是高亮的,而现在可以让多个都高亮

(2)基于以上问题,需要遍历所有的格子,使被选中的格子变为那个唯一高亮的

(3)值得注意的是,InventoryUI.cs是针对所有库存的,SlotUI.cs是针对单个格子的,所以将更新格子高亮的函数写到InventoryUI中较为妥

2.代码实现

1.InventoryUI

cs 复制代码
public void UpdateSlotHightLight(int index)
{
    //迭代遍历所有格子,寻找相同的index,相同打开,不同关闭
    //保证只有一个被选中的高亮
    foreach (var slot in playerSlots)
    {
        if (slot.isSelected && slot.slotIndex == index)
        {
            slot.slotHightlight.gameObject.SetActive(true);
        }
        else 
        {
            slot.isSelected = false;
            slot.slotHightlight.gameObject.SetActive(false);
        }
    }
}

2. SlotUI

引入点击事件接口IpointerClickHandler

cs 复制代码
public class SlotUI : MonoBehaviour,IPointerClickHandler

将slotHightlight改为public,以便InventoryUI调用

cs 复制代码
public Image slotHightlight;
cs 复制代码
public void OnPointerClick(PointerEventData eventData)//点击事件
{
    if (itemAmount == 0) return;//Slot里没东西的情况
    isSelected = !isSelected;//被点击后,状态要切换

    inventoryUI.UpdateSlotHightLight(slotIndex);//当前格的信息传入,此时有两个参数可以判断是否高亮
}

最终效果

补充知识点

1.接口

这个Up讲的很好,可以看他的视频

2.IPointerClickHandler

  1. 定义与所属命名空间
    • IPointerClickHandler是 Unity 中的一个接口,它属于UnityEngine.EventSystems命名空间。这个接口主要用于处理 UI(用户界面)元素上的点击事件。
    • 在 Unity 的 UI 系统中,当你想要响应鼠标或者触摸(在移动设备上)点击操作时,就可以利用这个接口。
  2. 接口方法
    • IPointerClickHandler接口包含一个方法OnPointerClick(PointerEventData eventData)
    • 当一个实现了IPointerClickHandler接口的脚本所挂载的 UI 元素被点击时,OnPointerClick方法会被调用。
    • PointerEventData参数包含了关于此次点击事件的详细信息,例如点击的位置(在屏幕坐标或者相对于 UI 元素的局部坐标)、按下的是鼠标的哪个按键(在鼠标操作的情况下)或者是触摸点的相关信息(在触摸操作的情况下)。
  3. 使用示例
    • 假设你有一个简单的 UI 按钮,你想在它被点击时执行一些操作,比如打印一条消息。

    • 首先,创建一个新的 C# 脚本,例如ButtonClickHandler.cs

    • 在脚本中,需要引入UnityEngine.EventSystems命名空间。

      cs 复制代码
      using UnityEngine;
      using UnityEngine.EventSystems;
      public class ButtonClickHandler : MonoBehaviour, IPointerClickHandler
      {
          public void OnPointerClick(PointerEventData eventData)
          {
              Debug.Log("按钮被点击了");
          }
      }
    • 然后将这个脚本挂载到 Unity 场景中的 UI 按钮上。当你在运行游戏时点击这个按钮,控制台就会打印出 "按钮被点击了" 的消息。

相关推荐
Hotchip_MEMS16 分钟前
当雾化器遇上MEMS:一场从交互到制造的全链路效率提升
人工智能·笔记·物联网·电脑·制造
是上好佳佳佳呀25 分钟前
【深度学习|Day02】PyTorch 深度学习笔记(下):张量运算与自动微分
pytorch·笔记·深度学习
IT古董2 小时前
【MES学习笔记系列】05 - MES 数据库设计
笔记·学习·mes
不瘦80斤不改名3 小时前
05-vibe-coding-向agentic-engineering演进
人工智能·笔记·python·prompt
九硕智慧建筑一体化厂家3 小时前
直流照明|无尘风淋室照明,高均匀无频闪,适配洁净车间高频合规工况
大数据·人工智能·笔记·智慧城市
LATASA3 小时前
【 从0到1构建 Agent Harness学习笔记】
网络·笔记·学习
weixin_431600444 小时前
做 Agent 会用到的 Node API(3):异步与流
前端·学习·ai·agent·ai编程
FakeOccupational4 小时前
【电路笔记 仿真】SPICE仿真器软件 LTspice:绘制简单电路(新建图页+添加组件)并仿真+模型导入+SUBCKT (子电路)绘制与使用+特殊器件绘制
笔记
70asunflower5 小时前
Triton 从 0 到 1 完整学习教程
学习·triton
天国梦5 小时前
2026年英语教学数字化工具深度测评:天学网、腾讯英语君、翼课网横向对比
人工智能·学习