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

Unity NGO中主机切换至客户端相机问题求助

问题解决:Unity Netcode 多玩家相机控制冲突

问题根源

你的PlayerLook脚本虽然继承了NetworkBehaviour,但没有做本地玩家权限判断,导致所有客户端(包括主机)都会执行相机控制逻辑。当客户端加入后,主机的输入会同时作用于自己的玩家对象和客户端的玩家对象,客户端的输入也会作用于自身对象,最终出现双方共同控制客户端相机的情况。

解决步骤

  • 添加本地玩家权限校验:仅让本地玩家对应的对象执行鼠标控制逻辑,非本地玩家直接跳过Update里的控制代码。
  • 禁用非本地玩家的相机:避免非本地玩家的相机渲染干扰,同时减少不必要的逻辑运行。
  • 确保玩家引用可靠:通过NetworkObject的Owner属性或稳定方式获取玩家对象,避免parent引用在网络实例化时出现异常。

修改后的PlayerLook脚本

using Unity.Netcode;
using UnityEngine;

public class PlayerLook : NetworkBehaviour
{
    public float sensitivity = 100f;
    private Transform player;
    private float xRotation = 0f;
    private Camera playerCamera;

    void Start()
    {
        player = transform.parent;
        playerCamera = GetComponent<Camera>();
        
        // 非本地玩家禁用相机和控制脚本
        if (!IsLocalPlayer)
        {
            playerCamera.enabled = false;
            enabled = false;
            return;
        }
        
        // 本地玩家锁定鼠标
        Cursor.lockState = CursorLockMode.Locked;
    }

    void Update()
    {
        // 仅本地玩家执行控制逻辑
        if (!IsLocalPlayer) return;

        float mouseX = Input.GetAxis("Mouse X") * sensitivity * Time.deltaTime;
        float mouseY = Input.GetAxis("Mouse Y") * sensitivity * Time.deltaTime;

        xRotation -= mouseY;
        xRotation = Mathf.Clamp(xRotation, -90f, 90f);

        transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);
        player.Rotate(Vector3.up * mouseX);
    }
}

额外注意事项

  • 确保玩家预制体上的NetworkObject组件配置正确,默认就是客户端拥有自己的对象,无需额外修改。
  • 如果需要同步玩家视角到其他客户端,可以将旋转值设为NetworkVariable在服务器端同步,但相机控制本身只需要本地执行,视角同步为可选操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 03:52:41