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

Unity(C#)右键控制相机移动指定位置故障排查

右键按住相机无法移动的问题排查与解决

问题详情

右键按下时能打印“Hello”、松开打印“Hi”,但相机始终无法移动到目标位置。怀疑问题出在transform.localPosition = MagicWandReg1Pos;和transform.localPosition = CameraReg1Pos;两行代码,同时推测可能和Cinemachine插件有关。

相关脚本代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Camscript : MonoBehaviour
{
    public Vector3 MagicWandReg1Pos;
    public Vector3 CameraReg1Pos;
    
    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
        MagicWandReg1Pos = new Vector3(0.9525713f,2,2400557f);
        CameraReg1Pos = new Vector3(-5.601483f,3,150208);
        transform.localPosition = CameraReg1Pos;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Mouse1))
        {
            transform.localPosition = MagicWandReg1Pos;
            print("Hello");
        }
        if (Input.GetKeyUp(KeyCode.Mouse1))
        {
            transform.localPosition = CameraReg1Pos;
            print("Hi");
        }
    }
}

解决办法

1. 处理Cinemachine的控制权冲突

如果你的相机使用了Cinemachine Virtual Camera,Cinemachine会每帧强制覆盖相机的transform属性,直接修改transform.localPosition的代码会被覆盖,导致位置不生效。

方案A:临时禁用Virtual Camera

在右键按下时禁用Virtual Camera,松开时重新启用:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Cinemachine; // 引入Cinemachine命名空间

public class Camscript : MonoBehaviour
{
    public Vector3 MagicWandReg1Pos;
    public Vector3 CameraReg1Pos;
    public CinemachineVirtualCamera virtualCam; // 在Inspector面板拖入你的虚拟相机
    
    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
        MagicWandReg1Pos = new Vector3(0.9525713f,2,2400557f);
        CameraReg1Pos = new Vector3(-5.601483f,3,150208);
        transform.localPosition = CameraReg1Pos;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Mouse1))
        {
            virtualCam.enabled = false;
            transform.localPosition = MagicWandReg1Pos;
            print("Hello");
        }
        if (Input.GetKeyUp(KeyCode.Mouse1))
        {
            transform.localPosition = CameraReg1Pos;
            virtualCam.enabled = true;
            print("Hi");
        }
    }
}

方案B:切换Cinemachine的目标点

创建两个空物体作为相机的目标位置,让Cinemachine跟随目标点切换,避免直接修改相机transform:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Cinemachine;

public class Camscript : MonoBehaviour
{
    public CinemachineVirtualCamera virtualCam;
    public Transform wandTarget; // 魔杖位置的空物体
    public Transform defaultTarget; // 默认相机位置的空物体
    
    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
        // 初始化时让相机跟随默认目标
        virtualCam.Follow = defaultTarget;
        virtualCam.LookAt = defaultTarget;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Mouse1))
        {
            virtualCam.Follow = wandTarget;
            virtualCam.LookAt = wandTarget;
            print("Hello");
        }
        if (Input.GetKeyUp(KeyCode.Mouse1))
        {
            virtualCam.Follow = defaultTarget;
            virtualCam.LookAt = defaultTarget;
            print("Hi");
        }
    }
}

2. 修正坐标数值问题

你的目标位置z轴数值过大(2400557、150208),可能导致相机移动后超出场景可视范围,看起来像是没移动。先换成小范围坐标测试:

MagicWandReg1Pos = new Vector3(0.95f, 2, 5f);
CameraReg1Pos = new Vector3(-5.6f, 3, 2f);

3. 区分localPosition与position

如果相机有父物体,localPosition是相对于父物体的坐标,而你可能需要修改世界坐标position。把代码中的transform.localPosition替换为transform.position测试:

// 按下右键时
transform.position = MagicWandReg1Pos;
// 松开右键时
transform.position = CameraReg1Pos;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:25:49