关于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
添加对应的方法调用即可。