using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class mapdrag : MonoBehaviour, IDragHandler, IEndDragHandler, IScrollHandler,IPointerDownHandler
{
private RectTransform m_DraggingPlane;
private GameObject m_DraggingIcon = null;
private Vector3 temp;
public void OnBeginDrag(PointerEventData eventData)
{
}
public void OnDrag(PointerEventData eventData)
{
//Debug.Log("OnDrag" + eventData.ToString());
if (eventData.pointerEnter != null && eventData.pointerEnter.transform as RectTransform != null)
{
m_DraggingPlane = eventData.pointerEnter.transform as RectTransform;
print(m_DraggingPlane.name);
}
var rt = transform.GetComponent<RectTransform>();
Vector3 GlobalVariableMousePos;
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(m_DraggingPlane, eventData.position, eventData.pressEventCamera, out GlobalVariableMousePos))
{
Vector3 pos = Camera.main.WorldToScreenPoint(GlobalVariableMousePos);
//pos.y = rt.rect.height;// pos.y +
rt.position = GlobalVariableMousePos - temp;
}
}
public void OnEndDrag(PointerEventData eventData) //结束拖动时调用
{
//Debug.Log("OnEndDrag" + eventData.ToString());
}
public void OnPointerDown(PointerEventData eventData) //鼠标按下时候调用
{
if (eventData.pointerEnter != null && eventData.pointerEnter.transform as RectTransform != null)
{
m_DraggingPlane = eventData.pointerEnter.transform as RectTransform;
print("OnPointerDown:"+m_DraggingPlane.gameObject.name);
}
else
return;
var rt = transform.GetComponent<RectTransform>();
Vector3 GlobalVariableMousePos;
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(m_DraggingPlane, eventData.position, eventData.pressEventCamera, out GlobalVariableMousePos))
{
temp = GlobalVariableMousePos - transform.GetComponent<RectTransform>().position;
}
}
public void OnScroll(PointerEventData eventData)
{
//Debug.Log("OnScroll" + eventData.scrollDelta.ToString());
//float gunlunspeed = eventData.scrollDelta.y*0.1f;
//transform.localScale += new Vector3(gunlunspeed, gunlunspeed, 0.0f);
//if (transform.localScale.x < 0.2f)
//{
// transform.localScale = new Vector3(0.2f, 0.2f, 1.0f);
//}
//GameObject.Find("Main Camera").GetComponent<cameramain>().ischenged = true;
}
}
关键在这一行RectTransformUtility.ScreenPointToWorldPointInRectangle(m_DraggingPlane, eventData.position, eventData.pressEventCamera, out GlobalVariableMousePos)
eventData.position :鼠标的屏幕坐标
m_DraggingPlane: 将屏幕坐标转换成m_DraggingPlane所在平面的世界坐标上,并且只转换m_DraggingPlane区域里面的屏幕坐标
注意我的用词:m_DraggingPlane是在这个区域内的屏幕坐标
FR:徐海涛(hunk Xu)