如题,本篇文章没讲动画效果
基本流程
1.代码思路
(1)先用点击事件的接口函数去实现,点击后反转选择状态(isSelected),以及设置激活状态(SetActive),并且还需要判断该格子是否为空,空格子是点不动的,完成后以上后,出现的问题是高亮应该是有且仅有一个格子是高亮的,而现在可以让多个都高亮
(2)基于以上问题,需要遍历所有的格子,使被选中的格子变为那个唯一高亮的
(3)值得注意的是,InventoryUI.cs是针对所有库存的,SlotUI.cs是针对单个格子的,所以将更新格子高亮的函数写到InventoryUI中较为妥
2.代码实现
1.InventoryUI
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
public class SlotUI : MonoBehaviour,IPointerClickHandler
将slotHightlight改为public,以便InventoryUI调用
public Image slotHightlight;
public void OnPointerClick(PointerEventData eventData)//点击事件
{
if (itemAmount == 0) return;//Slot里没东西的情况
isSelected = !isSelected;//被点击后,状态要切换
inventoryUI.UpdateSlotHightLight(slotIndex);//当前格的信息传入,此时有两个参数可以判断是否高亮
}
最终效果
补充知识点
1.接口
这个Up讲的很好,可以看他的视频
2.IPointerClickHandler
- 定义与所属命名空间
IPointerClickHandler
是 Unity 中的一个接口,它属于UnityEngine.EventSystems
命名空间。这个接口主要用于处理 UI(用户界面)元素上的点击事件。- 在 Unity 的 UI 系统中,当你想要响应鼠标或者触摸(在移动设备上)点击操作时,就可以利用这个接口。
- 接口方法
IPointerClickHandler
接口包含一个方法OnPointerClick(PointerEventData eventData)
。- 当一个实现了
IPointerClickHandler
接口的脚本所挂载的 UI 元素被点击时,OnPointerClick
方法会被调用。 PointerEventData
参数包含了关于此次点击事件的详细信息,例如点击的位置(在屏幕坐标或者相对于 UI 元素的局部坐标)、按下的是鼠标的哪个按键(在鼠标操作的情况下)或者是触摸点的相关信息(在触摸操作的情况下)。
- 使用示例
- 假设你有一个简单的 UI 按钮,你想在它被点击时执行一些操作,比如打印一条消息。
- 首先,创建一个新的 C# 脚本,例如
ButtonClickHandler.cs
。 - 在脚本中,需要引入
UnityEngine.EventSystems
命名空间。using UnityEngine; using UnityEngine.EventSystems; public class ButtonClickHandler : MonoBehaviour, IPointerClickHandler { public void OnPointerClick(PointerEventData eventData) { Debug.Log("按钮被点击了"); } }
- 然后将这个脚本挂载到 Unity 场景中的 UI 按钮上。当你在运行游戏时点击这个按钮,控制台就会打印出 “按钮被点击了” 的消息。