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

Unity Mirror是否内置计时器?多人游戏计时功能实现咨询

Mirror多人游戏计时器实现说明

Mirror框架没有内置专门的游戏计时器功能,需要你自行实现,且由于是多人游戏,必须遵循「服务器权威」原则来设计计时逻辑,避免客户端不同步或作弊问题。

核心实现思路

  • 服务器端维护唯一的权威计时器,所有计时更新仅在服务器执行
  • 通过Mirror的SyncVar同步计时器数值到所有客户端,确保显示一致
  • 计时归0时,服务器通过ClientRpc通知所有客户端触发游戏结束逻辑

示例代码(GameManager)

using Mirror;
using UnityEngine;
using UnityEngine.UI;

public class GameTimerManager : NetworkBehaviour
{
    [SerializeField] private float totalGameDuration = 300f; // 总时长5分钟
    [SerializeField] private Text timerDisplayText;

    [SyncVar(hook = nameof(OnTimerUpdated))]
    private float currentRemainingTime;

    // 服务器初始化计时器
    public override void OnStartServer()
    {
        base.OnStartServer();
        currentRemainingTime = totalGameDuration;
    }

    private void Update()
    {
        // 仅服务器执行计时逻辑
        if (!isServer) return;

        if (currentRemainingTime > 0)
        {
            currentRemainingTime -= Time.deltaTime;
            // 防止出现负数
            if (currentRemainingTime < 0) currentRemainingTime = 0;
        }

        // 计时归0触发游戏结束
        if (currentRemainingTime <= 0)
        {
            EndGame();
            // 禁用Update里的计时逻辑,避免重复调用
            enabled = false;
        }
    }

    // 客户端同步计时器并更新UI
    private void OnTimerUpdated(float oldValue, float newValue)
    {
        int minutes = Mathf.FloorToInt(newValue / 60);
        int seconds = Mathf.FloorToInt(newValue % 60);
        timerDisplayText.text = $"{minutes:00}:{seconds:00}";
    }

    // 通知所有客户端游戏结束
    [ClientRpc]
    private void EndGame()
    {
        // 这里添加游戏结束的客户端逻辑:显示结束界面、禁用玩家控制等
        Debug.Log("游戏结束!");
    }
}

关键注意事项

  • 永远不要让客户端修改计时器数值,所有计时逻辑必须由服务器主导
  • 若需要暂停计时,可在服务器端添加一个[SyncVar] bool isTimerRunning变量来控制计时更新
  • 使用SyncVar的hook函数是最简洁的客户端UI同步方式,无需额外编写同步逻辑

内容的提问来源于stack exchange,提问作者UNREAL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:30:38