You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
4.1 KiB

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class ItemOnDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
public Transform originalParent; // 记录原先的父级
public Inventory myBag;
public Slot slot;
public int currentItemIndex; // 当前被拖拽物品的下标
public void OnBeginDrag(PointerEventData eventData)
{
originalParent = transform.parent;
currentItemIndex = originalParent.GetComponent<Slot>().slotIndex;
transform.SetParent(transform.parent.parent); // 避免拖拽时物品被遮挡
transform.position = eventData.position;
GetComponent<CanvasGroup>().blocksRaycasts = false;
}
public void OnDrag(PointerEventData eventData)
{
transform.position = eventData.position;
// Debug.Log(eventData.pointerCurrentRaycast.gameObject.name);
}
public void OnEndDrag(PointerEventData eventData)
{
// 如果将物品移动到背包内,则改变位置
if (eventData.pointerCurrentRaycast.gameObject != null)
{
// 如果格子中有物品,则交换位置
if (eventData.pointerCurrentRaycast.gameObject.name == "Item Image")
{
// 交换物品在背包中显示的位置
transform.SetParent(eventData.pointerCurrentRaycast.gameObject.transform.parent.parent);
transform.position = eventData.pointerCurrentRaycast.gameObject.transform.parent.parent.position;
// 交换物品在背包中的下标
var temp = myBag.itemList[currentItemIndex];
myBag.itemList[currentItemIndex] = myBag.itemList[eventData.pointerCurrentRaycast.gameObject.GetComponentInParent<Slot>().slotIndex];
myBag.itemList[eventData.pointerCurrentRaycast.gameObject.GetComponentInParent<Slot>().slotIndex] = temp;
eventData.pointerCurrentRaycast.gameObject.transform.parent.position = originalParent.transform.position;
eventData.pointerCurrentRaycast.gameObject.transform.parent.SetParent(originalParent);
GetComponent<CanvasGroup>().blocksRaycasts = true; // 开启射线阻挡,否则无法再次选中移动的物品
}
// 如果格子中没有物品,则将物品放至此位置
else if (eventData.pointerCurrentRaycast.gameObject.name == "Slot(Clone)")
{
// 改变物品在背包中显示的位置
transform.SetParent(eventData.pointerCurrentRaycast.gameObject.transform);
transform.position = eventData.pointerCurrentRaycast.gameObject.transform.position;
// 改变物品在背包中的下标
myBag.itemList[eventData.pointerCurrentRaycast.gameObject.GetComponentInParent<Slot>().slotIndex] = myBag.itemList[currentItemIndex];
if (eventData.pointerCurrentRaycast.gameObject.GetComponent<Slot>().slotIndex != currentItemIndex)
myBag.itemList[currentItemIndex] = null; // 如果放回原处则不执行该句,避免放回原处后物品消失
GetComponent<CanvasGroup>().blocksRaycasts = true; // 开启射线阻挡,否则无法再次选中移动的物品
}
// 如果移到格子外 ,则物品自动回到原来的位置
else
{
transform.SetParent(originalParent);
transform.position = originalParent.position;
GetComponent<CanvasGroup>().blocksRaycasts = true; // 开启射线阻挡,否则无法再次选中移动的物品
}
}
// 如果移到背包外,则物品自动回到原来的位置
else
{
// 物品回到初始位置
transform.SetParent(originalParent);
transform.position = originalParent.position;
GetComponent<CanvasGroup>().blocksRaycasts = true; // 开启射线阻挡,否则无法再次选中移动的物品
}
}
}