實(shí)現(xiàn)一個(gè)簡(jiǎn)單的背包功能(可以拖動(dòng)物體续扔,如果不屬于有效范圍會(huì)自動(dòng)返回原來(lái)父物體的下面)
布局格式
BagPackUI是一個(gè)panel控件
BagGrid:空物體
bag_bg:背景
Item:物體需添加圖1-2所示組件(Canvas Group組件)
當(dāng)Blacks Raycasts=false時(shí)射線可以檢測(cè)到下一層物體為true是不可以檢測(cè)下一層
布局層次如圖1-3所示
實(shí)現(xiàn)代碼
管理類
using UnityEngine;
using System.Collections;
public class BagPackMgr : MonoBehaviour{??
? //tag標(biāo)簽的常量字符串? ?
?public const string groove = "groove";?
?? public const string bagpackItem = "bagpackItem";??
? public const string bag = "bag";? ?
?Canvas GlobalCanvas;//畫布??
? Transform BagGrid;//背包的道具父物體??
? //單件模式(單例模式)
? ? static BagPackMgr Inst;?
?? public static BagPackMgr Instance? ? {? ??
? ? get? ? ? ? {? ? ? ??
? ? return Inst;? ??
? ? }? ??
}? ?
?void Awake()? ? {? ? ? ?
?Inst = this;? ? ? ?
GlobalCanvas = transform.parent.GetComponent();
BagGrid = transform.Find("BagGrid");
}
public Canvas getGlobalCanvas
{
get {
return GlobalCanvas;
}
}
public Transform GetBagGrid
{
get {
return BagGrid;
}
ItemDrag類
ItemDrag類
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using System;
public class ItemDrag : MonoBehaviour,IBeginDragHandler,IDragHandler,IEndDragHandler {??
? Transform _saveSelfParent;//保存自己的父物體? ?
?CanvasGroup _canvasGroup;//CanvasGroup組件??
//鼠標(biāo)點(diǎn)的那一幀執(zhí)行
? public void OnBeginDrag(PointerEventData eventData)??
? {? ? ?
?? _canvasGroup = GetComponent();
_canvasGroup.blocksRaycasts = false;//不阻擋向下檢測(cè)控件
_saveSelfParent = transform.parent;//將該物體的父物體保存在_saveSelfParent中
//設(shè)置父物體為畫布Canvas
transform.SetParent(BagPackMgr.Instance.getGlobalCanvas.transform);
}
//拖動(dòng)的過(guò)程中執(zhí)行
public void OnDrag(PointerEventData eventData)
{
transform.position = eventData.position;//當(dāng)下的位置賦給該物體(物體隨鼠標(biāo)移動(dòng))
}
//拖動(dòng)結(jié)束時(shí)執(zhí)行
public void OnEndDrag(PointerEventData eventData)
{
GameObject pointEenterobj = eventData.pointerEnter;
//空白出或外面,非響應(yīng)區(qū)域
if (pointEenterobj == null)
{
transform.SetParent(_saveSelfParent);
transform.localPosition = Vector3.zero;
}
//拖動(dòng)到了裝備欄
else if (pointEenterobj.tag == BagPackMgr.groove)
{
transform.SetParent(pointEenterobj.transform);
transform.localPosition = Vector3.zero;
}
//拖到了道具上(交換位置)
else if (pointEenterobj.tag == BagPackMgr.bagpackItem)
{
transform.SetParent(pointEenterobj.transform.parent);
transform.localPosition = Vector3.zero;
pointEenterobj.transform.SetParent(_saveSelfParent);
pointEenterobj.transform.localPosition = Vector3.zero;
}
//卸下道具
else if (pointEenterobj.tag == BagPackMgr.bag)
{
transform.SetParent(BagPackMgr.Instance.GetBagGrid);
transform.localPosition = Vector3.zero;
}
//射線檢測(cè)到了物體,但是不是我們邏輯需要的三種類型(無(wú)效操作)
else
{
transform.SetParent(_saveSelfParent);
transform.localPosition = Vector3.zero;
}
//重置射線檢測(cè)
_canvasGroup.blocksRaycasts = true;
}