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

Unity中C#脚本OnMouseUp()失效问题排查求助

搞定Unity OnMouseUp()失效+实现左键抬物右键取消的方案

我太懂这种翻遍资料还是卡壳的憋屈感了!你要实现左键点击抬起GameObject、右键任意位置取消操作,而且已经给物体加了碰撞器,但OnMouseUp()就是没反应,咱们先从最常见的坑开始排查,再给你适配需求的完整脚本。

一、先揪出OnMouseUp()失效的常见原因

  • 脚本挂载位置错了:OnMouse系列函数只认挂载在带碰撞器的那个GameObject上的脚本,要是你把Mover挂在了父物体、子物体或者别的无关物体上,肯定触发不了!赶紧检查下挂载对象。
  • 碰撞器设置踩坑:看看碰撞器是不是勾了Is Trigger?一旦勾了这个,OnMouse系列事件直接失效,得把这个勾选去掉。另外碰撞器的大小有没有完全包住你的模型?要是碰撞器太小,点击的时候根本没命中,自然没反应。
  • 相机没“看见”物体:检查相机的Culling Mask,是不是没包含这个GameObject所在的层?或者用了正交相机但物体不在相机的可视范围内?这些都会导致点击检测失败。
  • 输入被抢占了:有没有其他脚本在处理鼠标输入?比如用Input.GetMouseButtonDown()这类全局输入的脚本,可能会抢占事件,试试暂时禁用其他输入相关脚本,看OnMouseUp()能不能正常触发。

二、适配你需求的完整脚本

结合你的需求,我给你写了补全优化后的脚本,不仅解决OnMouseUp可能的问题,还完美实现左键抬物、右键取消的逻辑:

using UnityEngine;

public class Mover : MonoBehaviour
{
    // 标记是否处于抬物状态
    private bool isLifting = false;
    // 物体抬起时和相机的距离(避免贴脸)
    public float liftDistance = 2f;

    void Update()
    {
        // 右键点击直接取消抬物
        if (Input.GetMouseButtonDown(1))
        {
            StopLifting();
        }

        // 如果正在抬物,让物体跟着鼠标走
        if (isLifting)
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            transform.position = ray.GetPoint(liftDistance);
        }
    }

    // 左键点击物体时触发抬物
    void OnMouseDown()
    {
        isLifting = true;
        // 如果物体有刚体,禁用重力防止掉落
        Rigidbody rb = GetComponent<Rigidbody>();
        if (rb != null)
        {
            rb.useGravity = false;
        }
        Debug.Log("OnMouseDown触发啦!"); // 加个日志方便测试
    }

    // 松开左键时的操作(如果需要松开左键就取消抬物,就解开下面的注释)
    void OnMouseUp()
    {
        // StopLifting();
        Debug.Log("OnMouseUp触发啦!"); // 测试用日志
    }

    // 封装取消抬物的逻辑,方便复用
    private void StopLifting()
    {
        isLifting = false;
        Rigidbody rb = GetComponent<Rigidbody>();
        if (rb != null)
        {
            rb.useGravity = true;
        }
    }
}

三、额外测试小技巧

  • 先在OnMouseDown()和OnMouseUp()里加Debug.Log(),运行后点击物体,看控制台有没有输出。如果有输出,说明函数是正常触发的,问题出在你的逻辑上;如果没输出,就回到上面的原因排查。
  • 如果物体有Rigidbody,把它的Collision Detection设为Continuous,避免物体快速移动时碰撞检测失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:08:53