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
相关产品推荐
相关产品推荐

