如何借助Netcode for GameObjects与FPS Starter Assets实现FPS相机?
解决新客户端加入时全局相机切换问题
问题核心原因
FPS Starter Assets默认是单玩家架构,改成网络功能后未区分本地玩家与远程玩家的相机状态,导致所有玩家的相机都被标记为MainCamera或全局激活,新客户端加入时触发全局相机切换。
分步修复方案
1. 控制本地/远程玩家的相机激活状态
修改FirstPersonController脚本,仅让本地玩家激活自身相机,远程玩家相机保持禁用:
private void Start() { Camera playerCamera = GetComponentInChildren<Camera>(); NetworkIdentity netIdentity = GetComponent<NetworkIdentity>(); if (netIdentity == null) return; // 仅本地玩家启用相机并标记为MainCamera if (netIdentity.isLocalPlayer) { playerCamera.enabled = true; playerCamera.tag = "MainCamera"; } else { playerCamera.enabled = false; playerCamera.tag = "Untagged"; } }
2. 修正Network Manager与玩家预制体配置
- 玩家预制体的
NetworkIdentity组件需勾选Local Player Authority - 移除场景中独立的
MainCamera,所有相机作为玩家预制体的子物体存在 - 玩家预制体中的相机默认设置为禁用状态,避免远程玩家加载时自动激活
3. 适配射线检测逻辑
如果使用Camera.main做射线检测,需确保仅本地玩家的相机被标记为MainCamera,或直接使用本地玩家的相机实例:
// 替换Camera.main为本地玩家相机引用 Camera localCamera = GetComponentInChildren<Camera>(); NetworkIdentity netIdentity = GetComponent<NetworkIdentity>(); if (netIdentity.isLocalPlayer && localCamera.enabled) { Ray ray = localCamera.ScreenPointToRay(Input.mousePosition); // 执行射线检测逻辑 }
4. 额外排查项
- 检查是否存在全局脚本遍历所有相机并强制激活
- 确认网络同步逻辑未错误同步相机的激活状态
内容的提问来源于stack exchange,提问作者Yusuf
相关产品推荐
相关产品推荐

