Unity UI实现拖拽旋转
程序员文章站
2022-03-16 20:29:47
本文实例为大家分享了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); } }
设置下箭头锚点
效果如下:
手指拖拽旋转
第二种是根据旋转速度来旋转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); }
效果如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Oracle数据行拆分多行方法示例
下一篇: C语言智能指针之weak_ptr浅析