三种常用拖拽方法OnMouseDrag等内置方法、Event Trigger组件、拖拽接口IDragHandler方法
Unity内置方法实现:
#region Drag2DSprite 加上2D碰撞体
//[SerializeField] private bool isSelected;
//void Start()
//{
//}
//void Update()
//{
// //Debug.Log(Input.mousePosition.x+" , "+Input.mousePosition.y);
// if (isSelected)
// {
// //屏幕坐标系转化世界坐标系 SCREEN POS -> WORLD SPACE
// Vector2 CursorPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
// transform.position = new Vector2(CursorPos.x,CursorPos.y);
// }
//}
//private void OnMouseOver()
//{
// if (Input.GetMouseButtonDown(0))
// isSelected = true;
// if (Input.GetMouseButtonUp(0))
// isSelected = false;
//}
#endregion
/// <summary>
/// OnMouseDrag方法不合适对UI对象来进行拖拽
/// </summary>
private void OnMouseDrag()
{
//SCREEN POS -> WORLD SPACE
Vector3 cursorPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
transform.position = new Vector3(cursorPos.x, cursorPos.y);
}
private void OnMouseEnter()
{
transform.localScale += Vector3.one * 0.2f;
}
private void OnMouseExit()
{
transform.localScale -= Vector3.one * 0.2f;
}
Event Trigger组件实现:
private Vector3 startPos;
private void Start()
{
//Debug.Log(transform.GetComponent<RectTransform>().localPosition);
startPos = transform.position;
}
public void DragMethod()
{
transform.position = Input.mousePosition;
}
public void DropMethod()
{
GameObject fillGo = GameObject.Find("Fill");
float dist = Vector3.Distance(transform.position, fillGo.transform.position);
if (dist <= 100)
{
transform.position = fillGo.transform.position;
}
else
{
transform.position = startPos;
}
}
接口实现:
(1)
[SerializeField] private RectTransform panelRectTrans;
//OPTIONAL
//private RectTransform panelRectTrans;
//private void Awake()
//{
// if (panelRectTrans == null)
// panelRectTrans = transform.parent.GetComponent<RectTransform>();
//}
public void OnDrag(PointerEventData eventData)
{
panelRectTrans.anchoredPosition += eventData.delta;
}
public void OnBeginDrag(PointerEventData eventData)
{
panelRectTrans.SetAsLastSibling();
}
//public void OnPointerDown(PointerEventData eventData)
//{
// panelRectTrans.SetAsLastSibling();
//}
(2)
public void OnBeginDrag(PointerEventData eventData)
{
Vector3 globalMousePos;
//将屏幕坐标转换成世界坐标
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, eventData.position, eventData.enterEventCamera, out globalMousePos))
{
//计算UI和指针之间的位置偏移量
dirV3 = rectTransform.position - globalMousePos;
}
}
public void OnDrag(PointerEventData eventData)
{
Vector3 pos;
RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, eventData.position, eventData.enterEventCamera, out pos);
rectTransform.position = pos + dirV3;
}
知乎/简书大佬有关坐标系的文章:
1.https://zhuanlan.zhihu.com/p/93813556
2.https://www.jianshu.com/p/695353725e7a
3.https://www.jianshu.com/p/baf6bedddb91
注,效果自行动手尝试哦!