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;
}
}
}
《Unity》 实现UI的拖动
最新推荐文章于 2024-06-24 16:47:20 发布