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

