使用Unity完成簡(jiǎn)單的背包功能
用UGUI布局成一下這個(gè)樣子
設(shè)置BackGround的tag為Bag?
Lft,Center,Right設(shè)置為Groove
所有的Item設(shè)置為BagItem
在BackGround中添加組件Grid Layout Group,使拖動(dòng)上去之后能夠正確排版
并且為所有item添加CanvasGroup組件,當(dāng)BlockRaycasts為false時(shí)使射線能夠穿透該物體,反則則不能
編寫腳本
在BackGround上掛載的腳本.m_BagPageMgr,這是一個(gè)管理類
using UnityEngine;
public class m_BagPageMgr : MonoBehaviour
{? ??
Transform _Panle; ? //保存Panle的Transform?
Transform BackGound; ? ?//保存BackGround的Transform
void Awake()? ??
{? ? ? ??
_Panle = transform.parent.GetComponent<Transform>(); ? ? ? //獲取到Transform組件
BackGound = GetComponent<Transform>();//獲取到Transform組件
Inst = this;//初始化實(shí)例
}
private m_BagPageMgr()//私有化構(gòu)造方法,使外部不能隨意實(shí)例化該類
{
}
static m_BagPageMgr Inst;//定義一個(gè)靜態(tài)的私有的實(shí)例
public static m_BagPageMgr Instance//使用屬性獲取上面的實(shí)例
{
get
{
return Inst;
}
}
public? Transform getPanle//使用屬性獲取Panle的Transform
{
get
{
return _Panle;
}
}
public Transform getBG//使用屬性獲取BackGround的Transform
{
get
{
return BackGound;
}
}
}
在Item上掛載的組件
using UnityEngine;
using UnityEngine.EventSystems;
public class m_ItemDarg : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler//繼承能夠?qū)崿F(xiàn)拖拽的接口
{? ??
CanvasGroup _canvasGroup;? ? //定義一個(gè)CanvasGroup的引用變量
Transform _selfParent; ? ?//這個(gè)用來保存當(dāng)前的父對(duì)象
void Awake()? ??
{? ? ? ??
_canvasGroup = transform.GetComponent();//獲取Item上的CanvasGroup組件
}
public void OnBeginDrag(PointerEventData eventData)//當(dāng)開始拖動(dòng)時(shí)調(diào)用該方法,且只調(diào)用一次
{
_selfParent = transform.parent;//記錄下當(dāng)前對(duì)象的父物體
_canvasGroup.blocksRaycasts = false;//使射線能夠穿過鼠標(biāo)拖拽的物體
transform.SetParent(m_BagPageMgr.Instance.getPanle.transform);//當(dāng)鼠標(biāo)開始拖拽時(shí),將其父物體設(shè)置為Panle,使其能夠顯示在在所有的游戲?qū)ο笊厦?/p>
}
public void OnDrag(PointerEventData eventData)//當(dāng)鼠標(biāo)正在拖動(dòng)時(shí)調(diào)用,在這期間該方法一直調(diào)用
{
transform.position = eventData.position;//使鼠標(biāo)拖拽的物體的位置等于鼠標(biāo)的位置
}
public void OnEndDrag(PointerEventData eventData)//當(dāng)鼠標(biāo)拖拽完成,松開鼠標(biāo)時(shí)執(zhí)行該方法,且只執(zhí)行一次
{
GameObject pointobj = eventData.pointerEnter;//獲取鼠標(biāo)拖拽的物體下面的游戲?qū)ο?/p>
if (pointobj == null)//當(dāng)該游戲?qū)ο鬄榭諘r(shí)
{
transform.SetParent(_selfParent);//將其返回至原來的位置,也就是將其父對(duì)象設(shè)置成初始的父對(duì)象
transform.localPosition = Vector3.zero;//坐標(biāo)歸零
}
else if (pointobj.tag == "Bag")//當(dāng)射線檢測(cè)到的是BackGround時(shí)
{
transform.SetParent(m_BagPageMgr.Instance.getBG.transform);//將其父物體設(shè)置為BackGround
transform.localPosition = Vector3.zero;
}
else if (pointobj.tag == "Groove")//當(dāng)射線檢測(cè)到的是Lft,Center,Right,這三個(gè)的時(shí)候
{
transform.SetParent(pointobj.transform);//將該物體的父物體設(shè)置為檢測(cè)到的物體
transform.localPosition = Vector3.zero;
}
else if (pointobj.tag == "BagItem")//當(dāng)射線檢測(cè)到的是Item時(shí),交換兩個(gè)的父物體
{
transform.SetParent(pointobj.transform.parent);
transform.localPosition = Vector3.zero;
pointobj.transform.SetParent(_selfParent);
pointobj.transform.localPosition = Vector3.zero;
}
else//以上都不滿足時(shí),這是我們并不期望的一個(gè)結(jié)果,所以返回初始的父對(duì)象
{
transform.SetParent(_selfParent);
transform.localPosition = Vector3.zero;
}
_canvasGroup.blocksRaycasts = true;//使射線不能穿過Item,也就是不能檢測(cè)到Item下面的物體
}
}