使用Unity完成简单的背包功能
用UGUI布局成一下这个样子
设置BackGround的tag为Bag
Lft,Center,Right设置为Groove
所有的Item设置为BagItem
在BackGround中添加组件Grid Layout Group,使拖动上去之后能够正确排版
并且为所有item添加CanvasGroup组件,当BlockRaycasts为false时使射线能够穿透该物体,反则则不能
编写脚本
在BackGround上挂载的脚本.m_BagPageMgr,这是一个管理类
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;//初始化实例
}
private m_BagPageMgr()//私有化构造方法,使外部不能随意实例化该类
{
}
static m_BagPageMgr Inst;//定义一个静态的私有的实例
public static m_BagPageMgr Instance//使用属性获取上面的实例
{
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//继承能够实现拖拽的接口
{
CanvasGroup _canvasGroup; //定义一个CanvasGroup的引用变量
Transform _selfParent; //这个用来保存当前的父对象
void Awake()
{
_canvasGroup = transform.GetComponent();//获取Item上的CanvasGroup组件
}
public void OnBeginDrag(PointerEventData eventData)//当开始拖动时调用该方法,且只调用一次
{
_selfParent = transform.parent;//记录下当前对象的父物体
_canvasGroup.blocksRaycasts = false;//使射线能够穿过鼠标拖拽的物体
transform.SetParent(m_BagPageMgr.Instance.getPanle.transform);//当鼠标开始拖拽时,将其父物体设置为Panle,使其能够显示在在所有的游戏对象上面
}
public void OnDrag(PointerEventData eventData)//当鼠标正在拖动时调用,在这期间该方法一直调用
{
transform.position = eventData.position;//使鼠标拖拽的物体的位置等于鼠标的位置
}
public void OnEndDrag(PointerEventData eventData)//当鼠标拖拽完成,松开鼠标时执行该方法,且只执行一次
{
GameObject pointobj = eventData.pointerEnter;//获取鼠标拖拽的物体下面的游戏对象
if (pointobj == null)//当该游戏对象为空时
{
transform.SetParent(_selfParent);//将其返回至原来的位置,也就是将其父对象设置成初始的父对象
transform.localPosition = Vector3.zero;//坐标归零
}
else if (pointobj.tag == "Bag")//当射线检测到的是BackGround时
{
transform.SetParent(m_BagPageMgr.Instance.getBG.transform);//将其父物体设置为BackGround
transform.localPosition = Vector3.zero;
}
else if (pointobj.tag == "Groove")//当射线检测到的是Lft,Center,Right,这三个的时候
{
transform.SetParent(pointobj.transform);//将该物体的父物体设置为检测到的物体
transform.localPosition = Vector3.zero;
}
else if (pointobj.tag == "BagItem")//当射线检测到的是Item时,交换两个的父物体
{
transform.SetParent(pointobj.transform.parent);
transform.localPosition = Vector3.zero;
pointobj.transform.SetParent(_selfParent);
pointobj.transform.localPosition = Vector3.zero;
}
else//以上都不满足时,这是我们并不期望的一个结果,所以返回初始的父对象
{
transform.SetParent(_selfParent);
transform.localPosition = Vector3.zero;
}
_canvasGroup.blocksRaycasts = true;//使射线不能穿过Item,也就是不能检测到Item下面的物体
}
}