Unity全方位拖拽物体攻略

本文详细介绍了在Unity中如何实现UGUI控件和3D物体的拖拽功能。通过射线检测和鼠标位置增量转换,结合IBeginDragHandler, IDragHandler, IEndDragHandler接口或EventSystem,实现拖拽效果。同时,文章还提供了3D物体拖拽的实现方法,包括射线检测和移动逻辑,并强调了不同空间坐标系的处理注意事项。" 8532980,911179,Android代码与XML设置组件间距指南,"['Android开发', '布局管理', 'UI设计', 'Java', 'XML']
摘要由CSDN通过智能技术生成

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
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值