《Unity》 实现UI的拖动

7 篇文章 0 订阅
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
 public class SyncUIDrag : MonoBehaviour
    {
        private bool isDraging = false;
        private RectTransform rect;
        private Vector2 lastMousePosition;
        private Vector2 lastAnchorPosition;
        public List<GameObject> ingoreList = new List<GameObject>();
        public float interval = 2;
        public Camera UICamera;

        public void OnClick()
        {
            isDraging = true;
            lastMousePosition = Input.mousePosition;
            lastAnchorPosition = rect.anchoredPosition;
        }
        private void Start()
        {
            rect = transform as RectTransform;
     
          

        }
        /// <summary>
        /// point 屏幕空间
        /// </summary>
        /// <param name="point"></param>
        /// <returns></returns>
        private bool IsPointInRectTransform(Vector2 rPosition)
        {
            bool bOK =  RectTransformUtility.RectangleContainsScreenPoint(rect, rPosition, UICamera);
            if(!bOK)
            {
                return false;
            }
            //只能是当前UI物体
            if (ingoreList.Count>0)
            {
                for (int i = 0; i < ingoreList.Count; i++)
                {
                    RectTransform ingoreRect = (RectTransform)(ingoreList[i].transform);
                    bOK = RectTransformUtility.RectangleContainsScreenPoint(ingoreRect, rPosition, UICamera);
                    if (bOK)
                    {
                        return false;
                    }
                }
            }
            return true;
        }
        private void Update()
        {
 
            if(isDraging)
            {
                Vector3 mousePosition = Input.mousePosition;
#if UNITY_ANDROID && !UNITY_EDITOR
                Vector3 mousePosition = Input.GetTouch(0).position;
#endif
                Vector2 delta = new Vector2(mousePosition.x,mousePosition.y) - lastMousePosition;
                if(Mathf.Abs(delta.x)> interval || Mathf.Abs(delta.y)>interval)
                {
                    rect.anchoredPosition = lastAnchorPosition + delta;
                }
            }
            if (Input.GetMouseButtonDown(0))
            {
                if (IsPointInRectTransform(Input.mousePosition))
                {
                    OnClick();
                }
            }
            if (Input.GetMouseButtonUp(0))
            {
                isDraging = false;
            }
        }
    }
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JustEasyCode

谢谢您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值