Unity 鼠标拖拽功能

继承3个处理拖拽方法的接口IBeginDragHandler, IDragHandler, IEndDragHandler

 /// <summary>
    /// 实现接口的OnBeginDrag方法,处理开始拖拽时要做的事情
    /// </summary>
    /// <param name="eventData"></param>
    public void OnBeginDrag(PointerEventData eventData)
    {
        startPosition = transform.position;//获取初始位置
        imageFather = transform.parent;//获取父物体的transform
        transform.SetParent(canvas.transform);//将物品放在canvas最下方,确保不会被遮挡
        canvasGroup.blocksRaycasts = false;//射线可以穿透物体
    }
/// <summary>
    /// 实现接口的OnDrag方法,处理拖动中要做的事情
    /// </summary>
    /// <param name="eventData"></param>
    public void OnDrag(PointerEventData eventData)
    {
        transform.position = screenPositionToWorldPositionBy_Z(Input.mousePosition, transform.position);
    }

/// <summary>
    /// 通过基准点的Z点坐标,转化屏幕坐标为世界坐标
    /// </summary>
    /// <param name="needToFixedScreenPosition">需要转化的屏幕坐标</param>
    /// <param name="baseWorldPosition">基准点(需要它的z点坐标做转换)</param>
    Vector3 screenPositionToWorldPositionBy_Z(Vector3 needToFixedScreenPosition, Vector3 baseWorldPosition)
    {
        Vector3 baseScreenPosition = Camera.main.WorldToScreenPoint(baseWorldPosition);
        needToFixedScreenPosition.z = baseScreenPosition.z;
        return Camera.main.ScreenToWorldPoint(needToFixedScreenPosition);
    } 

 

/// <summary>
    /// 实现接口的OnEndDrag方法,处理结束时的方法
    /// </summary>
    /// <param name="eventData"></param>
    public void OnEndDrag(PointerEventData eventData )
    {
        //获取鼠标下的物体
        GameObject go = eventData.pointerCurrentRaycast.gameObject;
        //交换物品
        if (go.tag.Equals(Enum_Tags.InventoryItemGird)) ExchangeOfGoods(go);
        //复原
        else
        {
            transform.SetParent(imageFather);
            transform.position = startPosition;
        }
        canvasGroup.blocksRaycasts = true;//ui事件穿透:置为不能穿透

    }
/// <summary>
    /// 将一个物体放在另一个物体下
    /// </summary>
    /// <param name="child">作为子物体</param>
    /// <param name="parent">作为父物体</param>
    private void SetParentAndPosition(Transform child, Transform parent)
    {
        child.SetParent(parent);
        child.position = parent.position;
    }
   /// <summary>
    /// 格子内的物品进行交换
    /// </summary>
    /// <param name="go">鼠标结束位置的格子</param>
    private void ExchangeOfGoods(GameObject go)
    {
        Transform[] childrens = go.GetComponentsInChildren<Transform>();
        bool isHaveChildren= childrens.Length > 1;
        if (isHaveChildren)
        {
            Transform child = go.transform.GetChild(0);
            SetParentAndPosition(child, imageFather);
          
        }
        SetParentAndPosition(gameObject.transform, go.transform);
        
    }
Vector3 screenPositionToWorldPositionBy_Z(Vector3 needToFixedScreenPosition, Vector3 baseWorldPosition)
    {
        Vector3 baseScreenPosition = Camera.main.WorldToScreenPoint(baseWorldPosition);
        needToFixedScreenPosition.z = baseScreenPosition.z;
        return Camera.main.ScreenToWorldPoint(needToFixedScreenPosition);
    } 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值