Unity新手:如何在相机脚本中检测鼠标按下、移动与抬起事件
相机脚本中检测鼠标输入的实用方法
嘿,作为Unity新手从相机脚本入手做控制完全没问题!我给你整理了两种实用的实现方式,直接就能在你挂载在相机上的脚本里用:
一、基础帧检测法(适合大多数场景)
这种方法用Unity内置的Input类,在Update帧更新里检测鼠标状态,简单直观,新手很容易上手:
- 检测鼠标按键按下(仅触发一次):用
Input.GetMouseButtonDown(按键编号),比如Input.GetMouseButtonDown(0)代表左键按下,适合触发“开始相机移动”的逻辑。注意:0=左键,1=右键,2=中键 - 检测鼠标按键持续按住:用
Input.GetMouseButton(按键编号),每帧都会返回true,适合在按住期间持续处理相机移动/旋转 - 检测鼠标按键抬起(仅触发一次):用
Input.GetMouseButtonUp(按键编号),适合触发“停止相机移动”的逻辑 - 检测鼠标移动:用
Input.GetAxis("Mouse X")和Input.GetAxis("Mouse Y"),返回每帧鼠标在X/Y轴的移动增量,数值经过平滑处理,能让相机控制更流畅
完整示例代码
using UnityEngine; public class CameraController : MonoBehaviour { // 可在Inspector面板调整的参数 public float rotateSpeed = 1f; public float moveSpeed = 2f; // 标记是否处于相机控制状态 private bool isControllingCamera = false; void Update() { // 左键按下:启动相机控制 if (Input.GetMouseButtonDown(0)) { isControllingCamera = true; Debug.Log("鼠标左键按下,开始控制相机"); } // 按住左键时:处理鼠标移动来控制相机 if (isControllingCamera && Input.GetMouseButton(0)) { // 获取鼠标移动增量 float mouseX = Input.GetAxis("Mouse X") * rotateSpeed; float mouseY = Input.GetAxis("Mouse Y") * rotateSpeed; // 这里以相机旋转为例,你可以替换成平移逻辑 transform.Rotate(-mouseY, mouseX, 0); } // 左键抬起:停止相机控制 if (Input.GetMouseButtonUp(0)) { isControllingCamera = false; Debug.Log("鼠标左键抬起,停止控制相机"); } } }
二、进阶事件系统法(适配UI交互)
如果你的场景里有UI,不想点击UI时触发相机控制,可以用Unity的事件系统接口,自动过滤UI交互:
- 先给相机添加
PhysicsRaycaster组件(3D场景)或GraphicRaycaster组件(2D/UI场景) - 确保场景中有
EventSystem对象(创建UI时默认生成,没有的话右键→UI→EventSystem手动创建)
完整示例代码
using UnityEngine; using UnityEngine.EventSystems; public class CameraController : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler { public float rotateSpeed = 0.1f; private bool isDragging = false; private Vector2 lastMousePosition; // 鼠标按下时触发 public void OnPointerDown(PointerEventData eventData) { isDragging = true; lastMousePosition = eventData.position; Debug.Log("鼠标按下(仅场景区域生效)"); } // 鼠标抬起时触发 public void OnPointerUp(PointerEventData eventData) { isDragging = false; Debug.Log("鼠标抬起"); } // 鼠标拖动时触发 public void OnDrag(PointerEventData eventData) { if (!isDragging) return; // 计算鼠标移动差值 Vector2 mouseDelta = eventData.position - lastMousePosition; float rotateX = mouseDelta.x * rotateSpeed; float rotateY = mouseDelta.y * rotateSpeed; transform.Rotate(-rotateY, rotateX, 0); lastMousePosition = eventData.position; } }
新手建议先从第一种方法入手,理解帧更新和输入检测的逻辑,等后续遇到UI交互冲突的问题,再切换到第二种方法。
内容的提问来源于stack exchange,提问作者hexeditor
相关产品推荐
相关产品推荐

