欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Unity UI实现拖拽旋转

程序员文章站 2022-06-25 12:33:42
本文实例为大家分享了unity ui实现拖拽旋转的具体代码,供大家参考,具体内容如下跟随鼠标旋转第一种效果是跟随鼠标旋转,原理是计算下鼠标位置与拖拽物体的相对位移旋转方向即可注意转换对应空间坐标新建脚...

本文实例为大家分享了unity ui实现拖拽旋转的具体代码,供大家参考,具体内容如下

跟随鼠标旋转

第一种效果是跟随鼠标旋转,原理是计算下鼠标位置与拖拽物体的相对位移

旋转方向即可

注意转换对应空间坐标

新建脚本mono类继承 ibegindraghandler, idraghandler, ienddraghandler 接口

[serializefield] private canvas m_canvas;
    
    private vector3? calculateworldtoscreenpos(vector3 worldpos)
    {
        if (m_canvas.rendermode == rendermode.screenspacecamera)
        {
            return m_canvas.worldcamera.worldtoscreenpoint(worldpos);
        }
        else if (m_canvas.rendermode == rendermode.screenspaceoverlay)
        {
            vector3 screenpos = m_canvas.transform.inversetransformpoint(worldpos);
            var recttrans = m_canvas.transform as recttransform;
            screenpos.x += recttrans.rect.width * 0.5f * recttrans.localscale.x;
            screenpos.y += recttrans.rect.height * 0.5f * recttrans.localscale.y;
            return screenpos;
        }

        return null;
    }
    
    public void ondrag(pointereventdata eventdata)
    {
        if (eventdata.button != pointereventdata.inputbutton.left) return;
        
        //计算当前物体距离画布左下角位置
        vector3? curscreenpos = calculateworldtoscreenpos(transform.position);
        if (curscreenpos == null) return;
        //鼠标位置偏移量
        vector2 offset = eventdata.position - (vector2)curscreenpos.value;
        if (offset != vector2.zero)
        {
            transform.rotation = quaternion.fromtorotation(vector3.up, offset);
        }
    }

设置下箭头锚点

Unity UI实现拖拽旋转

效果如下:

Unity UI实现拖拽旋转

手指拖拽旋转

第二种是根据旋转速度来旋转ui 可以实现一些齿轮交互滚动和车把方向盘交互滚动

//旋转速度
[serializefield] private float m_rotatespeed;
    
    public void ondrag(pointereventdata eventdata)
    {
        if (eventdata.button != pointereventdata.inputbutton.left) return;

        //手指滑动偏移量
        vector2 mousexy = eventdata.delta;
        mousexy *= m_rotatespeed;

        //计算当前物体距离画布左下角位置
        vector3? curscreenpos = calculateworldtoscreenpos(transform.position);
        if (curscreenpos == null) return;
        //手指位置偏移量
        vector2 offset = eventdata.position - (vector2)curscreenpos.value;

        float value;
        if (mathf.abs(mousexy.x) > mathf.abs(mousexy.y)) // 判断水平滑动还是垂直滑动
        {
            //手指往水平滑动   下面旋转跟随偏移参数  上面与偏移参数相反
            value = mousexy.x * mathf.sign(-offset.y);
        }
        else
        {
            //手指垂直滑动    右边跟随偏移参数    左边与偏移参数相反
            value = mousexy.y * mathf.sign(offset.x);
        }

        transform.rotate(vector3.forward, value, space.self);

    }

效果如下:

Unity UI实现拖拽旋转

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。