如何编写类此触摸脚本的鼠标移动物体代码(透视相机)
适配透视相机的鼠标移动物体代码(对应原安卓触摸功能)
原安卓触摸代码的核心逻辑是:触摸拖动时,根据触摸的屏幕偏移量按比例修改物体的X、Y轴位置,Z轴保持固定。以下是功能完全一致、适配透视相机的鼠标控制版本:
public class MouseDragObject : MonoBehaviour { public Camera dragCamera; // 指定拖拽用的透视相机,可在Inspector面板设置 private float speedModifier = 0.01f; private void Start() { // 若未指定相机,默认使用主相机 if (dragCamera == null) { dragCamera = Camera.main; } } private void Update() { // 检测鼠标左键按住且鼠标有移动(对应触摸拖动状态) if (Input.GetMouseButton(0) && (Input.GetAxis("Mouse X") != 0 || Input.GetAxis("Mouse Y") != 0)) { // 获取鼠标每帧的偏移量 float mouseDeltaX = Input.GetAxis("Mouse X"); float mouseDeltaY = Input.GetAxis("Mouse Y"); // 计算物体到相机的屏幕深度,用于透视空间转换 float objectScreenDepth = dragCamera.WorldToScreenPoint(transform.position).z; // 将屏幕空间的鼠标偏移转换为世界空间的移动量 Vector3 screenOffset = new Vector3( mouseDeltaX * speedModifier * Screen.width, mouseDeltaY * speedModifier * Screen.height, objectScreenDepth ); Vector3 targetWorldPos = dragCamera.ScreenToWorldPoint(screenOffset); Vector3 worldDelta = targetWorldPos - dragCamera.ScreenToWorldPoint(new Vector3(0, 0, objectScreenDepth)); // 应用移动,保持Z轴位置不变 transform.position += new Vector3(worldDelta.x, worldDelta.y, 0); } } }
关键说明
- 适配透视相机:通过
ScreenToWorldPoint和WorldToScreenPoint转换,确保物体在不同距离相机的位置下,拖拽手感和原触摸操作一致,不会出现近快远慢的问题。 - 逻辑对齐:鼠标左键按住对应触摸按下状态,鼠标移动对应触摸的
TouchPhase.Moved状态,speedModifier作用和原代码完全相同,用于调整拖拽灵敏度。 - 兼容性:若未指定相机,自动使用场景中的主相机,需确保主相机为透视模式。
内容的提问来源于stack exchange,提问作者Axay Gadhia
相关产品推荐
相关产品推荐

