這個揹包是博主剛學完UGUI的八個回調時寫的簡陋版,之後會更新一個進階版。
個人覺得理解這個之後,再去寫複雜的揹包功能
UI展示如下:
具體要求
一個格子只能放一件物品,武器格子只能放武器,防具格子只能放防具(我這裏直接通過TAG區分)。。。
物品在揹包中可以隨便放位置,可以隨意交換位置
裝備武器後可以更換武器
很簡單的揹包基本功能。
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class EquipItemController : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
private Image currentImage;
/// <summary>
/// 物品原先所在的格子
/// </summary>
private Transform originParent;
void Awake()
{
//初始化當前拖拽的物品
currentImage = GetComponent<Image>();
}
public void OnBeginDrag(PointerEventData eventData)
{
//開始拖拽的時候記住當前物品所屬的父對象(物品格子)
originParent = transform.parent.transform;
//將當前拖拽的物品的圖片的射線檢測關閉
currentImage.raycastTarget = false;
}
public void OnDrag(PointerEventData eventData)
{
//拖拽時讓當前物品跟着鼠標移動
transform.position = Input.mousePosition;
//
始終讓物品保持在UI的最前面,以防被其他UI遮擋
transform.SetParent(eventData.pointerEnter.transform);
transform.SetAsFirstSibling();
}
public void OnEndDrag(PointerEventData eventData)
{
//如果物品當前所處位置是空的揹包格子,就直接移動物品
if (eventData.pointerEnter.transform.tag.Equals("Grid") && eventData.pointerEnter.transform.childCount == 1)
{
transform.SetParent(eventData.pointerEnter.transform);
}
//如果物品當前所處位置是空的武器揹包格子且拖拽的物品是武器,就直接移動物品
else if (eventData.pointerEnter.transform.tag.Equals("WeaponBox") && transform.tag.Equals("Weapon") && eventData.pointerEnter.transform.childCount == 1)
{
transform.SetParent(eventData.pointerEnter.transform);
}
//如果物品當前所處位置是空的防具揹包格子且拖拽的物品是防具,就直接移動物品
else if (eventData.pointerEnter.transform.tag.Equals("ArmorBox") && transform.tag.Equals("Armor") && eventData.pointerEnter.transform.childCount == 1)
{
transform.SetParent(eventData.pointerEnter.transform);
}
//如果物品當前所處位置是空的移速揹包格子且拖拽的物品是移速,就直接移動物品
else if (eventData.pointerEnter.transform.tag.Equals("SpeedBox") && transform.tag.Equals("Speed") && eventData.pointerEnter.transform.childCount == 1)
{
transform.SetParent(eventData.pointerEnter.transform);
}
//如果物品當前所處位置是別的物品進入下面的判斷
else if (eventData.pointerEnter.transform.tag.Equals("Speed") || eventData.pointerEnter.transform.tag.Equals("Armor") || eventData.pointerEnter.transform.tag.Equals("Weapon"))
{
//如果當前檢測到的物品的父對象(物品格子)的標籤以拖拽物品的標籤開頭,交換兩個物品的位置
if (eventData.pointerEnter.transform.parent.tag.StartsWith(transform.tag))
{
ExchangeItem(transform, eventData);
}
//如果當前檢測到的物品的父對象(物品格子)的標籤是普通的物品格子標籤,直接交換物品位置
else if (eventData.pointerEnter.transform.parent.tag.Equals("Grid"))
{
ExchangeItem(transform, eventData);
}
else
{
//回覆原位
transform.SetParent(originParent);
}
}
else
{
//回覆原位
transform.SetParent(originParent);
}
//結束拖拽時將拖拽的物品的圖片的射線檢測打開
currentImage.raycastTarget = true;
//調整物品位置
transform.localPosition = Vector3.zero;
}
//物品交換方法
public void ExchangeItem(Transform transform, PointerEventData eventData)
{ //將當前拖拽的物品的父對象設置爲要交換的物品的父對象
transform.SetParent(eventData.pointerEnter.transform.parent);
//將要交換的物品的父對象設置爲當前拖拽物品在拖拽之前保存的父對象
eventData.pointerEnter.transform.SetParent(originParent);
//調整被交換的物品的位置
eventData.pointerEnter.transform.localPosition = Vector3.zero;
}
}
好了,揹包就簡單的介紹到這裏。(之後會更新複雜的揹包)
點個關注,給個讚唄!