Unity中摆锤与系统时钟(秒级)同步问题求助
解决Unity摆锤与系统时钟稳定同步的问题
你的核心问题在于使用了Time.time(游戏启动后的运行时间)作为摆动的时间基准,这导致同步状态完全依赖游戏启动时机。要实现和系统时钟的稳定同步,必须基于真实系统时间来计算摆锤位置,确保每到整秒时刻(系统秒针跳动时)摆锤精准处于中间位置。
解决方案思路
- 用
System.DateTime.Now获取真实系统时间,提取秒数和毫秒值,生成与系统时钟绑定的时间基准 - 调整摆动计算逻辑,让整秒时刻(如0秒、1秒、2秒...)正弦函数值为0,对应摆锤回到初始中间位置
- 移除原代码中判断中间位置的冗余逻辑,通过时间计算直接实现精准对齐
修改后的完整代码
using UnityEngine; using System; // 引入命名空间以使用DateTime public class SwingPendulo : MonoBehaviour { public Transform pendulum; public float amplitude = 45f; // 摆动最大角度 public float swingCycle = 1f; // 摆动周期(秒,对应系统秒针节奏) private float initialAngle; private void Start() { initialAngle = pendulum.rotation.eulerAngles.z; } private void Update() { // 获取当前系统时间的秒数(包含毫秒的小数部分) DateTime now = DateTime.Now; float currentTimeInSeconds = now.Second + now.Millisecond / 1000f; // 计算摆动角度:整秒时刻Sin值为0,摆锤回到初始中间位置 // 2π/swingCycle 确保周期符合设定的swingCycle秒 float angleOffset = Mathf.Sin(currentTimeInSeconds * 2 * Mathf.PI / swingCycle) * amplitude; float targetAngle = initialAngle + angleOffset; // 应用旋转 pendulum.rotation = Quaternion.Euler(0f, 0f, targetAngle); } }
关键代码说明
currentTimeInSeconds:将系统时间的秒数和毫秒合并为连续浮点值,比如第5秒300毫秒时值为5.3f,确保摆动与真实时间完全绑定- 正弦函数参数
currentTimeInSeconds * 2 * Mathf.PI / swingCycle:保证每经过swingCycle秒,摆锤完成一次完整摆动,且整秒时刻必然处于中间位置(整秒时currentTimeInSeconds为整数,Sin值为0) - 移除原代码中角度判断逻辑,新计算方式已精准对齐系统时钟的整秒节点
额外优化建议
- 若要让摆锤节奏和秒针完全匹配(每秒完成一次从左到右再回中间),可将
swingCycle设为0.5f,半秒摆到一侧,半秒摆回中间,整秒时刚好回到初始位置 - 如需旋转平滑,可使用
Quaternion.Lerp实现帧间过渡,避免角度突变
内容的提问来源于stack exchange,提问作者Migralepsia
相关产品推荐
相关产品推荐

