Unity中UGUI控件和3D物体拖拽实现
基本原理
Unity拖拽的基本原理:射线检测,鼠标位置增量转换为统一空间的位置增量,将位置增量添加到拖拽物体原位置上。
统一空间指的是将所有向量转换为同一空间下再进行计算。
项目演示
左测:UGUI Button
中间:UGUI Image
右侧:3D物体
dragdemo.gif
UGUI拖拽实现
方式有两种:其一直接继承拖拽三个接口IBeginDragHandler,IDragHandler,IEndDragHandler,重写内部函数。 其二通过EventSystem实现。
其一:脚本继承了拖拽三个接口IBeginDragHandler,IDragHandler,IEndDragHandler直接上代码,在开始拖拽的函数中初始化拖拽物和鼠标的位置,在拖拽过程中,不断的将鼠标的位置增量转换到画布空间,并附加给拖拽物。代码如下(项目演示中中间image是用此种方法拖拽):
public class DragTest : MonoBehaviour,IBeginDragHandler,IDragHandler,IEndDragHandler
{
private Vector3 pos; //控件初始位置
private Vector2 mousePos; //鼠标初始位置(画布空间)
private Vector3 mouseWorldPos; //鼠标初始位置(世界空间)
private RectTransform canvasRec; //控件所在画布
private void Start()
{
canvasRec = this.GetComponentInParent<Canvas>().transform as RectTransform;
}
//开始拖拽
public void OnBeginDrag(PointerEventData eventData)
{
//控件所在画布空间的初始位置
pos = this.GetComponent<RectTransform>().anchoredPosition;
Camera camera = eventData.pressEventCamera;
//将屏幕空间鼠标位置eventData.position转换为鼠标在画布空间的鼠标位置
RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRec, eventData