Unity3D中如何计算时钟指针角度实现与系统时钟同步
独立指针时钟同步角度换算方案
首先明确基础换算系数,完全匹配你给出的Z轴角度规则:
时钟一圈为360度,结合0点偏移-90度、3点对应0度的规则,可以推导出:
- 时针12小时转一圈,每小时对应转角为
360 / 12 = 30度 - 分针60分钟转一圈,每分钟对应转角为
360 / 60 = 6度 - 秒针60秒转一圈,每秒对应转角为
360 / 60 = 6度
注意不要直接用整时/整分/整秒数值计算角度,否则指针会出现整点/整分/整秒才跳一格的生硬效果,需要把下级时间单位折算成上级单位的小数部分,实现指针连续平滑转动。
各指针角度公式
- 秒针:将当前毫秒折算为秒的小数部分,公式为
(秒数 + 毫秒/1000f) * 6f - 90f - 分针:将当前秒、毫秒折算为分钟的小数部分,公式为
(分钟数 + 秒数/60f + 毫秒/60000f) * 6f - 90f - 时针:24小时制时间先对12取模(适配12小时一圈的时钟逻辑),再将分、秒、毫秒折算为小时的小数部分,公式为
(小时数%12 + 分钟数/60f + 秒数/3600f + 毫秒/3600000f) *30f -90f
可直接运行的修正代码
void Update() { // 单次循环只取一次系统时间,避免多次读取产生时间误差 DateTime now = DateTime.Now; // 计算时针角度 float hourTotal = (now.Hour % 12) + now.Minute / 60f + now.Second / 3600f + now.Millisecond / 3600000f; float hourZ = hourTotal * 30f - 90f; hourPointer.transform.eulerAngles = new Vector3(0f, 0f, hourZ); // 计算分针角度 float minuteTotal = now.Minute + now.Second / 60f + now.Millisecond / 60000f; float minuteZ = minuteTotal * 6f - 90f; minutePointer.transform.eulerAngles = new Vector3(0f, 0f, minuteZ); // 计算秒针角度 float secondTotal = now.Second + now.Millisecond / 1000f; float secondZ = secondTotal * 6f - 90f; secondPointer.transform.eulerAngles = new Vector3(0f, 0f, secondZ); }
可选调整项
- 如果需要做石英钟跳秒效果,直接去掉所有毫秒、秒、分的折算偏移,用整数值计算即可,指针会按对应单位一格格跳动。
- Unity中
eulerAngles会自动处理超过360度的角度值,不需要额外做取模运算,当然你也可以对最终算出来的角度值做%360处理,让数值更整洁。
内容的提问来源于stack exchange,提问作者KiynL
相关产品推荐
相关产品推荐

