Unity 简单的背包实现

使用Unity完成简单的背包功能

用UGUI布局成一下这个样子

Unity 简单的背包实现_第1张图片


设置BackGround的tag为Bag 

Lft,Center,Right设置为Groove

所有的Item设置为BagItem

在BackGround中添加组件Grid Layout Group,使拖动上去之后能够正确排版

Unity 简单的背包实现_第2张图片

并且为所有item添加CanvasGroup组件,当BlockRaycasts为false时使射线能够穿透该物体,反则则不能

Unity 简单的背包实现_第3张图片

编写脚本

在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组件

BackGound = GetComponent();//获取到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下面的物体

}

}

你可能感兴趣的:(Unity 简单的背包实现)