功能需求,项目需求是,要在界面的右上角做一个小地图,这个小地图可以进行地理链接的,那么这个地图的功能是可以拖拽的,并且每一次的缩放都是以图片中心点去缩放,那么如果图片被拖拽去了别的地方,那么中心点就会改变,所以这时候就需要在地图上方加一层父物体,缩放的时候缩放的是父物体,拖拽才是地图本体,这时候又有个问题,就是边界检测,缩放到任何大小都要重新做边界检测,不能拖动到外面,,,总结了一个公式
((RectTransform.sizeDelta.x*parent.localScale.x-RectTransform.sizeDelta.x)/2)/parent.localScale.x,这里Y轴位置的边界检测原理是一样的,无论什么时候,都刷新这个,就不会被拖拽到外面。下面是上代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class MapProcessing : MonoBehaviour,IPointerEnterHandler,IPointerExitHandler,IDragHandler,IEndDragHandler
{
bool allowDrag = false; //允许拖动
public RectTransform parents;
public RectTransform map;
Vector2 offctV=Vector2.zero;
public void OnDrag(PointerEventData eventData)
{
if (parents.GetComponent <Transform >().localScale.x>1)
{
offctV = eventData.delta*0.2f;
float X = map.anchoredPosition.x + offctV.x;
X = Mathf.Clamp(X,-((parents.sizeDelta.x* parents.localScale.x- parents.sizeDelta.x)/2)/ parents.localScale.x, ((parents.sizeDelta.x * parents.localScale.x - parents.sizeDelta.x) / 2)/ parents.localScale.x);
float Y = map.anchoredPosition.y + offctV.y;
Y = Mathf.Clamp(Y, -((parents.sizeDelta.y * parents.localScale.y - parents.sizeDelta.y) / 2)/ parents.localScale.x, ((parents.sizeDelta.y * parents.localScale.y - parents.sizeDelta.y) / 2)/ parents.localScale.x);
map.anchoredPosition = new Vector2(X, Y);
}
}
public void OnEndDrag(PointerEventData eventData)
{
}
public void OnPointerEnter(PointerEventData eventData)
{
allowDrag = true;
}
public void OnPointerExit(PointerEventData eventData)
{
allowDrag = false;
}
private void Update()
{
BorderClamp();
if (allowDrag) {
if (Input.GetAxis("Mouse ScrollWheel") > 0) {
//放大
float f = parents.transform.localScale.x + 0.2f;
f = Mathf.Clamp(f, 1, 10);
parents.transform.localScale = new Vector3(f,f,f);
}
if (Input.GetAxis("Mouse ScrollWheel") < 0) {
//map.anchoredPosition = new Vector2(0,0);
float f = parents.transform.localScale.x - 0.2f;
f = Mathf.Clamp(f,1,10);
parents.transform.localScale = new Vector3(f, f, f);
BorderClamp();
}
}
}
void BorderClamp() {
float X1 = map.anchoredPosition.x;
X1 = Mathf.Clamp(X1, -((parents.sizeDelta.x * parents.localScale.x - parents.sizeDelta.x) / 2) / parents.localScale.x, ((parents.sizeDelta.x * parents.localScale.x - parents.sizeDelta.x) / 2) / parents.localScale.x);
float Y1 = map.anchoredPosition.y;
Y1 = Mathf.Clamp(Y1, -((parents.sizeDelta.y * parents.localScale.y - parents.sizeDelta.y) / 2) / parents.localScale.x, ((parents.sizeDelta.y * parents.localScale.y - parents.sizeDelta.y) / 2) / parents.localScale.x);
map.anchoredPosition = new Vector2(X1, Y1);
}
}