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

