Unity如何反转transform欧拉角 实现顺时针旋转计数效果
Unity 煮蛋计时器顺时针旋转角度适配方案
Unity 中绕 UI 元素 Z 轴的 transform.eulerAngles.z 默认遵循右手坐标系规则,沿 Z 轴正方向(朝向屏幕外)的旋转为逆时针0-360度递增,和时钟类组件需要的顺时针计数方向相反。
目标实现的顺时针计数效果:
核心修改逻辑
不需要重构原有拖拽、吸附逻辑,只需要做两处调整:
- 计算鼠标拖拽角度时反转角度值,让表盘视觉旋转方向匹配顺时针拖拽手感
- 对最终拿到的Z轴欧拉角做值反转和归一化,得到0-360范围的顺时针角度值,直接除以6即可得到对应分钟数
注意:Unity 中欧拉角是四元数转换的导出值,直接修改
eulerAngles属性可能出现角度跳变、负角度问题,所有角度计算请先做0-360范围归一化。
调整后可直接运行的代码
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System.Linq; public class Test3 : MonoBehaviour { [SerializeField] RectTransform rectTransform; int[] snapValues = new int[13]{0,30,60,90,120,150,180,210,240,270,300,330,360}; public void Drag() { var screenPos = Camera.main.WorldToScreenPoint(rectTransform.anchoredPosition); var dir = Input.mousePosition - screenPos; // 反转Atan2计算出的角度,匹配顺时针旋转手感 var angle = -Mathf.Atan2(dir.x, dir.y) * Mathf.Rad2Deg; transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward); // 将默认逆时针的Z轴角度转换为顺时针0-360范围值 float clockwiseAngle = (360f - transform.eulerAngles.z) % 360f; // 匹配最近的吸附刻度 var nearestSnap = snapValues.OrderBy(x => Mathf.Abs(x - clockwiseAngle)).First(); // 按需求规则换算分钟:360度对应60分钟,每6度为1分钟 int setMinutes = nearestSnap / 6; print($"设置时长:{setMinutes}分钟,顺时针角度:{clockwiseAngle}"); } }
逻辑说明
- 旋转轴从
-Vector3.forward改为Vector3.forward配合角度取反,拖拽时表盘会跟随鼠标顺时针转动,和实体计时器旋钮操作手感一致 (360f - transform.eulerAngles.z) % 360f一步完成角度方向反转,自动处理0度与360度重合的边界问题,不会出现负角度- 原有刻度数组
snapValues、吸附逻辑、角度转分钟的/6规则完全保留,不需要额外调整
内容的提问来源于stack exchange,提问作者Raoul L'artiste
相关产品推荐
相关产品推荐

