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

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交互:

  1. 先给相机添加PhysicsRaycaster组件(3D场景)或GraphicRaycaster组件(2D/UI场景)
  2. 确保场景中有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:02:39