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

Unity+Mirror开发:相机仅沿X轴移动,Y轴无法移动问题求助

问题分析与解决方案

你的代码中,相机的视角控制逻辑是通过玩家物体绕Y轴旋转实现左右视角,相机作为子物体跟随转动;而上下视角则是相机自身绕X轴旋转。如果相机无法沿Y轴(左右)转动,或者你需要相机独立控制Y轴旋转,可按以下方案处理:

一、排查当前左右视角不生效的原因

如果是相机左右视角无法转动,先确认以下几点:

  • 你控制的是本地玩家:代码中Update开头的if (!isLocalPlayer) return;确保只有本地玩家执行旋转逻辑,非本地玩家不会响应输入。
  • Input轴设置正常:在Unity编辑器的Edit > Project Settings > Input Manager中,确认Mouse X轴参数未被修改(默认对应鼠标横向输入)。
  • 相机父子关系正确:运行游戏后,在Hierarchy面板中查看主相机是否已成功设为玩家物体的子物体(OnStartLocalPlayer中执行了playerCamera.transform.SetParent(transform))。

二、修改为相机独立控制Y轴旋转(玩家物体不转)

如果需要相机自主控制左右视角(而非玩家物体旋转),修改视角控制和移动逻辑:

修改后的完整代码

using Mirror;
using UnityEngine;

namespace QuickStart
{
    public class PlayerScript : NetworkBehaviour
    {
        public float mouseSensitivity = 100f;
        public float moveSpeed = 4f;
        float xRotation = 0f;

        // 用于访问相机的公共变量
        public Camera playerCamera; 

        public override void OnStartLocalPlayer()
        {
            if (Camera.main != null)
            {
                playerCamera = Camera.main;
                playerCamera.transform.SetParent(transform);
                playerCamera.transform.localPosition = new Vector3(0, 1.5f, 0); // 调整相机高度适配第一人称
                Cursor.lockState = CursorLockMode.Locked;
            }
            else
            {
                Debug.LogError("场景中未找到主相机!");
            }
        }

        void Update()
        {
            if (!isLocalPlayer) { return; }

            // 相机视角控制
            float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
            float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;

            // 上下视角控制(X轴旋转)
            xRotation -= mouseY;
            xRotation = Mathf.Clamp(xRotation, -90f, 90f);

            // 左右视角控制(相机独立Y轴旋转)
            if (playerCamera != null)
            {
                playerCamera.transform.localRotation = Quaternion.Euler(xRotation, playerCamera.transform.localEulerAngles.y + mouseX, 0f);
            }

            // 移动逻辑:基于相机朝向移动
            float moveX = Input.GetAxis("Horizontal");
            float moveZ = Input.GetAxis("Vertical");

            Vector3 moveDir = transform.right * moveX + playerCamera.transform.forward * moveZ;
            moveDir.y = 0; // 保持水平移动,避免斜向移动时Y轴偏移
            moveDir.Normalize();

            transform.Translate(moveDir * Time.deltaTime * moveSpeed, Space.World);
        }
    }
}

三、添加第一/第三人称视角切换逻辑

如果需要在两种视角间切换,可扩展代码如下:

  1. 在Inspector面板中分别拖入第一、第三人称相机
  2. 添加切换逻辑:
public Camera firstPersonCam;
public Camera thirdPersonCam;
private bool isFirstPerson = true;

void Update()
{
    if (!isLocalPlayer) { return; }

    // 按Tab键切换视角
    if (Input.GetKeyDown(KeyCode.Tab))
    {
        isFirstPerson = !isFirstPerson;
        firstPersonCam.gameObject.SetActive(isFirstPerson);
        thirdPersonCam.gameObject.SetActive(!isFirstPerson);
        playerCamera = isFirstPerson ? firstPersonCam : thirdPersonCam;
    }

    // 其余逻辑...
}

四、如果是相机无法沿Y轴位置移动(比如上下位移)

若你需要相机随玩家进行Y轴移动(如跳跃),可在移动逻辑中加入Y轴输入处理:

// 示例:跳跃逻辑
float moveY = 0;
if (Input.GetKey(KeyCode.Space))
{
    moveY = Time.deltaTime * 5f; // 可调整跳跃速度
}
// 加入Y轴移动到总位移中
moveDir.y = moveY;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 06:17:13