You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 22:37:31