Unity3D-背包

来源:互联网 发布:观后感怎么写 知乎 编辑:程序博客网 时间:2024/05/28 06:05

背包逻辑

1. 开始拖拽:记住当前父物体
2. 拖拽中:将当前物体的射线检测关闭,将物体的位置等于鼠标位置,将物体的父物体设为当前深度值高的物体
3. 拖拽后

    ①射线检测当前位置是否为空或者检测得到的tag不为bag或goods,为空则把物体的位置还原(位置和父物体);    ②如果检测到的是背包bag,则把物体的位置设置为背包格子的位置,父物体设置为各子;    ③如果检测到的是物品goods,交换两个物品        把物体的位置设为物品父物体的位置,父物体设为物品的父物体        把物品的位置设为原来物体的父物体位置(nowparent),父物体设为原来物体的父物体

代码


引用EventSystem(事件系统)
继承EventTrigger类,该类含有UGUI的回调方法

开始拖拽:
void OnBeginDrag(PointerEventData eventData)

所在接口IBeginDragHandler

拖拽中
void OnDrag(PointerEventData eventData)

所在接口 IDragHandler

拖拽后
void OnEndDrag(PointerEventData eventData)

所在接口 IEndDragHandler

eventData含有回调的信息

public class Bag :  EventTrigger{    //物品最开始的父物体    public Transform nowParent;    //物品拖拽中的父物体    private Transform dragParent;    public string[] tags = new string[] { "bag", "goods" };    public override void OnPointerClick(PointerEventData eventData)    {        //射线碰撞点的信息        print(eventData.pointerCurrentRaycast);    }    public override void OnBeginDrag(PointerEventData eventData)    {        nowParent = transform.parent;    }    /// <summary>    /// 当拖拽时跟着鼠标移动    /// </summary>    /// <param name="eventData"></param>    public override void OnDrag(PointerEventData eventData)    {        //当前物体的位置跟随鼠标进行移动        transform.position = Input.mousePosition;        //拖拽中将物体的射击检测关闭 以便结束拖拽的时候可以去检测物体下方的物体         IsRayCastOn(false);        //将拖拽中的物体父物体改为深度值较高的空物体,以便我们在拖拽中可以看到他         transform.SetParent(dragParent);    }    /// <summary>    /// 当结束拖拽时将物品放到格子里(格子有物品时交换位置)    /// </summary>    /// <param name="eventData"></param>    public override void OnEndDrag(PointerEventData eventData)    {           GameObject go = eventData.pointerCurrentRaycast.gameObject;        //类似于Array.Find          //Array.Find(要查询的数组,查询的条件)           //for (int i = 0; i < tags.Length; i++)           //{           //    if (go.tag == tags[i])           //    {            //    }           //}           //如果是别的UI或者go为空 让拖拽的物品回归原位          //go.tag!="bag"||go.tag!="goods"           if (go == null || Array.Find(tags, p => p == go.tag)==null)           {               SetPosAndParent(transform,nowParent);               return;           }       //射线检测我当前拖拽物品所到位置的物体标签        //射线怎么检测        //    当前射线碰撞事件UI的信息       // print(eventData.pointerCurrentRaycast);        //        //如果是格子 将拖拽的物品放到格子的位置,并且和格子成为父子物体的关系        if (go.tag == "bag")        {            transform.position = go.transform.position;            transform.SetParent(go.transform);        }        else if (go.tag == "goods")        {            //如果是格子当中有物品,那么交换两个物品位置            //将拖拽的物体放到当前格子中                                                                              SetPosAndParent(transform,go.transform.parent);            //将现在格子当中的物体移动到当前拖拽物体原来的位置            SetPosAndParent(go.transform,nowParent);        }           IsRayCastOn(true);    }    public void SetPosAndParent(Transform child, Transform parent)    {        child.position = parent.position;        child.SetParent(parent);    }    public void IsRayCastOn(bool flag)    {        GetComponent<Image>().raycastTarget = flag;    }}
原创粉丝点击