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

如何借助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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:55:34