一、开发操作
1、创建新的Canvas,重命名为Drag Canvas,调整好参数
2、为Drags添加Image子物体,重命名为,调整好参数
3、注意取消勾选Raycast Target,防止图片屏蔽鼠射线
二、脚本编程
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using UnityEngine.EventSystems;
namespace MFarm.Inventory
{
public class SlotUI : MonoBehaviour,IPointerClickHandler,IBeginDragHandler,IDragHandler,IEndDragHandler
{
[Header("组件的获取")]
[SerializeField] private Image slotImage;
[SerializeField] private TextMeshProUGUI amountText;
public Image slotHightlight;
[SerializeField] private Button button;
[Header("格子类型")]
public SlotType slotType;
public bool isSelected;
public int slotIndex;
//物品信息
public ItemDetails itemDetails;
public int itemAmount;
private InventoryUI inventoryUI=>GetComponentInParent<InventoryUI>();
private void Start()
{
isSelected = false;
if (itemDetails.itemID == 0)
{
UpdateEmptySlot();
}
}
//更新格子UI和信息
public void UpdateSlot(ItemDetails item, int amount)
{
itemDetails = item;
slotImage.sprite = item.itemIcon;
itemAmount = amount;
amountText.text = amount.ToString();
slotImage.enabled = true;
button.interactable = true;
}
//将Slot更新为空
public void UpdateEmptySlot()
{
if (isSelected)
{
isSelected = false;
}
slotImage.enabled = false;
amountText.text = string.Empty;
button.interactable = false;
}
public void OnPointerClick(PointerEventData eventData)
{
if (itemAmount == 0) return;
isSelected=!isSelected;
inventoryUI.UpdateSlotHightlight ( slotIndex );
}
public void OnBeginDrag(PointerEventData eventData)
{
if (itemAmount != 0)
{
inventoryUI.dragItem.enabled = true;
inventoryUI.dragItem.sprite = slotImage.sprite;
inventoryUI.dragItem.SetNativeSize();
isSelected = true;
inventoryUI.UpdateSlotHightlight(slotIndex);
}
}
public void OnDrag(PointerEventData eventData)
{
inventoryUI.dragItem.transform.position=Input.mousePosition;
}
public void OnEndDrag(PointerEventData eventData)
{
inventoryUI.dragItem.enabled = false;
Debug.Log(eventData.pointerCurrentRaycast.gameObject);
}
}
}
三、脚本逻辑
未完待续......