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

Unity Mirror玩家加入游戏时重置两队比分问题求助

解决方案

针对你用Unity 2022.3.16f1 + 最新版Mirror开发1v1足球游戏时,新玩家加入重置比分的问题,以下是具体实现步骤:

核心思路

比分属于服务器权威数据,必须在服务器端完成初始化,客户端仅通过SyncVar同步数据更新UI,避免作弊或数据不一致问题。最新版Mirror已废弃旧的OnPlayerConnected方法,需使用新的服务器端回调。

具体实现

1. 创建权威比分管理脚本

新建ScoreManager.cs,挂载到场景中的网络对象(需添加NetworkIdentity组件,勾选Server Only):

using Mirror;
using UnityEngine;

public class ScoreManager : NetworkBehaviour
{
    // SyncVar自动同步到所有客户端,hook触发UI更新
    [SyncVar(hook = nameof(OnTeamScoreUpdated))]
    public int teamAScore;
    [SyncVar(hook = nameof(OnTeamScoreUpdated))]
    public int teamBScore;

    // 仅服务器可调用的重置方法
    [Server]
    public void ResetMatchScores()
    {
        teamAScore = 0;
        teamBScore = 0;
    }

    // 客户端收到比分更新时的回调,用于刷新UI
    private void OnTeamScoreUpdated(int oldScore, int newScore)
    {
        // 替换为你的UI更新逻辑
        // Example:
        // GameObject.Find("TeamAText").GetComponent<TMPro.TMP_Text>().text = teamAScore.ToString();
        // GameObject.Find("TeamBText").GetComponent<TMPro.TMP_Text>().text = teamBScore.ToString();
    }
}

2. 自定义NetworkManager处理玩家连接

新建CustomNetworkManager.cs,继承自Mirror的NetworkManager,重写服务器端玩家连接回调:

using Mirror;
using UnityEngine;

public class CustomNetworkManager : NetworkManager
{
    public ScoreManager scoreManager; // 在Inspector中拖入ScoreManager对象

    public override void OnServerPlayerConnected(NetworkConnectionToClient conn)
    {
        base.OnServerPlayerConnected(conn);

        // 根据你的需求选择触发时机:
        // 方案1:每次有玩家加入都重置比分(适合重新匹配场景)
        // scoreManager.ResetMatchScores();

        // 方案2:仅当第二个玩家加入时重置(适合1v1开局场景)
        if (numPlayers == 2)
        {
            scoreManager.ResetMatchScores();
        }
    }
}

3. 替换默认NetworkManager

在Unity编辑器中,删除场景中原有的NetworkManager组件,添加CustomNetworkManager,并在Inspector中关联ScoreManager对象。

问题原因说明

  • 你之前使用的OnPlayerConnected是旧版Mirror的废弃方法,最新版需使用OnServerPlayerConnected(NetworkConnectionToClient conn),方法签名必须完全匹配才会被触发。
  • 不存在OnClientConnect方法是因为最新版Mirror的客户端连接回调为OnClientConnected()(在NetworkManager中),但由于比分是服务器权威,客户端无需处理初始化,仅需监听SyncVar更新即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 11:47:12