Unity UI实现拖拽旋转
作者:ᴸᴵᴬᴺᴳᴬᴬ 发布时间:2023-04-10 06:44:59
标签: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);
}
效果如下:
来源:https://blog.csdn.net/weixin_44735353/article/details/117508710
0
投稿
猜你喜欢
- 1.多数据源配置类整体项目结构1).pom.xml 项目依赖<?xml version="1.0" encodin
- 1、继承Thread类方式这种方式适用于执行特定任务,并且需要获取处理后的数据的场景。举例:一个用于累加数组内数据的和的线程。public
- 枚举的定义1.题目枚举是JAVA 5.0后增加的一个重要类型。可以用来表示一组取值范围固定的变量。使用enum关键字,可以定义枚举类型。实现
- 前言一个简单的单机小游戏:flypybird ,用来巩固java基础。涉及主要知识点:JFrame 、 JPanel 、 继承、 键盘/鼠标
- 引言在Broker中,事务消息的初始化是通过BrokerController.initialTransaction()方法执行的。priva
- springBoot Junit测试用例出现@Autowired不生效前提条件:1,测试类上面添加支持的注解就能取到spring中的容器的实
- 一,网络编程中两个主要的问题一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协议中I
- 数字签名广泛用于保护PDF文档,可见数字签名在日常生活中是相当重要的。在这篇文章中我将与大家分享如何给PDF文件添加可见的数字签名。首先我下
- 我们经常需要对我们的开发的软件做各种测试, 软件对系统资源的使用情况更是不可少, 目前有多个监控工具, 相比JProfiler对系统资源尤其
- 本文实例为大家分享了使用PageHelper插件实现Service层分页的具体代码,供大家参考,具体内容如下使用场景:平时分页我们可以直接使
- 本文实例讲述了Java泛型类与泛型方法的定义。分享给大家供大家参考,具体如下:Java泛型类的定义一 点睛泛型类定义的语法如下:[访问修饰符
- Http通信概述Http通信主要有两种方式POST方式和GET方式。前者通过Http消息实体发送数据给服务器,安全性高,数据传输大小没有限制
- Gradle和Maven都是当前热门的自动化构建工具。使用Gradle去构建项目,由于没有办法像Maven一样配置Setting文件来修改本
- 加密代码using System;using System.IO;using System.Security.Cryptography;pu
- SpringBoot找不到映射文件org.apache.ibatis.binding.BindingException: Invalid b
- FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化
- java 使用foreach遍历集合元素的实例1 代码示例import java.util.*; public class ForeachT
- MultiFrameImageStreamCompleterMultiFrameImageStreamCompleter 是一个可组合的 I
- 在文件夹中,我们经常有类似s_1.txt、s_2.txt、s_10.txt、s_11.txt这样的命名方式,我们期望的排序方式是s_1.tx
- 第一步:引入jar包 <dependency> <gro