UGUI
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class Item : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler
{
public GameObject draggingItem;
private RectTransform itemRect;
public Image itemImage;
private Transform oldSlot;
public int itemID;
public Text itemCount;
void Awake()
{
itemImage = GetComponent<Image>();
}
// Use this for initialization
void Start () {
draggingItem = GameObject.FindGameObjectWithTag("DraggingItem");
itemRect = GetComponent<RectTransform>();
}
// Update is called once per frame
void Update () {
}
public void OnBeginDrag(PointerEventData eventData)
{
oldSlot = transform.parent;
transform.SetParent(draggingItem.transform);
SetDraggedPosition(eventData);
itemImage.raycastTarget = false;
}
public void OnDrag(PointerEventData eventData)
{
SetDraggedPosition(eventData);
}
public void OnEndDrag(PointerEventData eventData)
{
Transform newSlot = null;
if (eventData.pointerEnter == null )
{
transform.SetParent(oldSlot);
transform.localPosition = Vector3.zero;
itemImage.raycastTarget = true;
return;
}
else
{
newSlot = eventData.pointerEnter.transform;
}
if(newSlot.tag.Equals("Slot"))
{
transform.SetParent(newSlot);
transform.localPosition = Vector3.zero;
}
else if (newSlot.tag.Equals("Item"))
{
transform.SetParent(newSlot.parent);
transform.localPosition = Vector3.zero;
newSlot.SetParent(oldSlot);
newSlot.localPosition = Vector3.zero;
}
else
{
transform.SetParent(oldSlot);
transform.localPosition = Vector3.zero;
}
itemImage.raycastTarget = true;
}
private void SetDraggedPosition(PointerEventData eventData)
{
Vector3 worldPos;
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(itemRect, eventData.position, eventData.pressEventCamera, out worldPos))
{
itemRect.position = worldPos;
}
}
public void SetItemCount(int num)
{
int intCount = int.Parse(itemCount.text);
intCount += num;
itemCount.text = intCount.ToString();
if(intCount <= 0)
{
Destroy(gameObject);
Tooltip.instance.Hide();
}
}
public void OnPointerEnter (PointerEventData eventData)
{
Tooltip.instance.Show(this, KnapsackManager.instance.GetItemByID(itemID), eventData);
}
public void OnPointerExit(PointerEventData eventData)
{
Tooltip.instance.Hide();
}
public void OnPointerClick(PointerEventData eventData)
{
if(eventData.button == PointerEventData.InputButton.Left)
{
Slot slot = GetComponentInParent<Slot>();
if(slot != null)
{
KnapsackManager.instance.UseItem(slot.slotID);
}
}
}
}
NGUI
using UnityEngine;
using System.Collections;
public class InventoryItem : MonoBehaviour
{
[HideInInspector]
public GameObject draggingItem;
public UISprite itemIcon;
public UILabel itemCount;
[HideInInspector]
public Transform oldSlot;
private Collider itemCollider;
public int itemID;
public int count = 1;//叠加数量
// Use this for initialization
void Start () {
itemCollider = GetComponent<BoxCollider>();
draggingItem = GameObject.FindGameObjectWithTag("DraggingItem");
}
// Update is called once per frame
void Update () {
}
public void OnDragStart()
{
oldSlot = transform.parent;
transform.SetParent(draggingItem.transform);
itemCollider.enabled = false;
NGUITools.MarkParentAsChanged(gameObject);
}
public void OnDrag(Vector2 delta)
{
transform.localPosition += (Vector3)delta;
}
public void OnDragEnd()
{
Transform newSolt = UICamera.hoveredObject.transform;
if(newSolt.tag == "Slot")
{
transform.SetParent(newSolt);
transform.localPosition = Vector3.zero;
}
else if(newSolt.tag == "InventoryItem")
{
transform.SetParent(newSolt.parent);
transform.localPosition = Vector3.zero;
newSolt.SetParent(oldSlot);
newSolt.localPosition = Vector3.zero;
}
else if(newSolt.tag == "EquipmentSlot")
{
EquipmentSlot equipmentSlot = newSolt.GetComponent<EquipmentSlot>();
ItemBase itemBase = ItemManager.instance.GetData(itemID);
if (itemBase.itemType == ItemType.Equip && ((ItemEquipment)itemBase).itemJob == PlayerInfo.instance.playerIndex && equipmentSlot.itemPart == ItemManager.instance.GetItemPartByID(itemID))
{
EquipmentManager.instance.AddItem(itemID);
Destroy(draggingItem.transform.GetChild(0).gameObject);
}
else
{
transform.SetParent(oldSlot);
transform.localPosition = Vector3.zero;
}
}
else if (newSolt.tag == "EquipmentItem")//换装(已经有装备)
{
EquipmentSlot equipmentSlot = newSolt.parent.GetComponent<EquipmentSlot>();
ItemBase itemBase = ItemManager.instance.GetData(itemID);
if (itemBase.itemType == ItemType.Equip && ((ItemEquipment)itemBase).itemJob == PlayerInfo.instance.playerIndex && equipmentSlot.itemPart == ItemManager.instance.GetItemPartByID(itemID))
{
EquipmentItem oldItem = newSolt.GetComponent<EquipmentItem>();
InventoryManager.instance.AddItem(oldItem.itemID, 1);
EquipmentManager.instance.RemoveItem(oldItem.itemID);
EquipmentManager.instance.AddItem(itemID);
Destroy(draggingItem.transform.GetChild(0).gameObject);
}
else
{
transform.SetParent(oldSlot);
transform.localPosition = Vector3.zero;
}
}
else
{
transform.SetParent(oldSlot);
transform.localPosition = Vector3.zero;
}
itemCollider.enabled = true;
}
public void SetItemCount(int num)
{
count += num;
itemCount.text = count.ToString();
}
}