Unity 简单的背包实现

作者: Unity学习的路上 | 来源:发表于2017-01-05 22:29 被阅读0次

    使用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下面的物体

    }

    }

    相关文章

      网友评论

        本文标题:Unity 简单的背包实现

        本文链接:https://www.haomeiwen.com/subject/acttbttx.html