关于2D拖拽-精灵与UI

2D Sprite 的拖拽方法:

1.前置条件:

2D碰撞盒检测,添加碰撞器

2.方法调用:

public class TouchSprite : MonoBehaviour
{
	private void OnMouseDown()
	{
		//Debug.Log("ClickDown");
	}

	private void OnMouseUp()
	{
		//Debug.Log("ClickUp");
	}

	private void OnMouseDrag()
	{
   
   //屏幕坐标转换为世界坐标
		transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
	}

	void Start()
	{
   
   //还记得链式编程吗,这里进行扩展,一句话进行检测【无则自动添加】并获取组件
		gameObject.Get_CP_Auto<BoxCollider2D>();
	}

}

public static class GameObjectExtension
{
	//获取组件-没有自动添加 最后返回此组件
	public static T Get_CP_Auto<T>(this GameObject go) where T : Component
	{
		if (!go.GetComponent<T>())
		{
			go.AddComponent<T>();
		}
		return go.GetComponent<T>();
	}
}

链式编程传送门

链式编程传送门

UI元素的拖拽:

1.前置条件:
射线可以检测到,底层使用射线实现的
比如CanvasGroup组件的blocksRaycasts字段:是否允许射线通过本对象,发射到本对象之后的UI元素,使其接收到射线信息。

2.方法1:
继承接口,案例如下:

public class Item_Dragable : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler
{
	//在此面板下拖拽图片
	Transform DragPanel;
	
	public void OnBeginDrag(PointerEventData eventData)
	{
	}

	public void OnDrag(PointerEventData eventData)
	{
   
   //屏幕坐标-UI坐标
		transform.localPosition = ConvertSC_2_UI(DragPanel, Input.mousePosition);
	}

	public void OnEndDrag(PointerEventData eventData)
	{
		//如果鼠标未检测到UI元素
		if (eventData.pointerEnter == null)
		{
			return;
		}
		
		//鼠标拖拽时检测到UI元素
		Transform enterObject = eventData.pointerEnter.transform;
		print("鼠标抬起接触到了UI元素"+enterObject.name);
	}

	Vector3 ConvertSC_2_UI(Transform target_ui, Vector3 ScPos)
		{
            //屏幕坐标转换世界坐标
            Vector3 worldPos = Camera.main.ScreenToWorldPoint(ScPos);

            //世界坐标转换位本地坐标
            Vector2 uiPos = target_ui.transform.InverseTransformPoint(worldPos);

		return uiPos;
        }
}

3.事件触发器 - EventTrigger
添加对应的方法调用即可。

猜你喜欢

转载自blog.csdn.net/weixin_38531633/article/details/118470342
2D