Unity3D-背包

背包逻辑

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;
    }
}

猜你喜欢

转载自blog.csdn.net/fuliyefly/article/details/78288994