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

