Unity C#中的OnMouseDown()不起作用。为什么?

3

我在OnMouseDown()事件上遇到了问题。这个脚本所属的对象是一个电脑机柜,可以点击执行某些操作。但是我卡在了第一步...我已经尝试在网上搜索这个问题有一段时间了,但几乎没有人似乎有同样的问题,其他解决方案也不完美。有人能帮帮我吗?我很困惑...

public class ComputerScript : MonoBehaviour 
{
    private RotateForDisplay displayRotation;
    private GameObject displayObjects;

    private void Start()
    {
        displayObjects = GameObject.Find("DisplayObjects");
        displayRotation = displayObjects.GetComponent<RotateForDisplay>();
    }

    // This does not seem to work for some reason..
    private void OnMouseDown()
    {
        displayRotation.isRotating = false;
        Debug.Log("Mouse is down");
    }

}

2
标签[tag:unity]的第一句话是“不要在关于Unity游戏引擎的问题上使用它(请改用[tag:unity3d])!” - Scott Chamberlain
请不要在“start”或“update”为空时包含它们。 - AustinWBryan
9个回答

8
请检查以下几点:
  • 确认目标物体有碰撞器(本系统使用像射线投射一样的方式),并且已启用
  • 确认碰撞器未被缩放或移动
  • 确认在目标物体和发射物之间没有其他带有碰撞器的物体
希望这些提示有所帮助,祝你好运!

当我第一次遇到这个问题时,原因是缺少了碰撞器。 - 0leg

3

试试这个:

void OnMouseOver(){
if(Input.GetMouseButtonDown(0){
displayRotation.isRotating = false;
Debug.Log("Mouse is down");
}
}

你可能也想使用 void Awake() 而不是 void Start()

void Awake()
{
    displayObjects = GameObject.Find("DisplayObjects");
    displayRotation = displayObjects.GetComponent<RotateForDisplay>();
}

1
这些函数非常容易使用,但它们的实现充满了隐藏的情况,使它们的使用问题重重。
例如,如果对象C设置了一个碰撞器但没有刚体,并且是具有刚体的对象P的子级,则当与C交互时将调用父对象P的方法,并且不会调用C的方法。
即使对象P根本没有碰撞器,也会发生这种不希望发生的行为。
刚体(没有边界)与鼠标输入有什么关系?根本没有。
唯一的解决方法是在所有鼠标感知对象中添加无用的刚体(可能是重力=false和动力学),以避免它们的鼠标事件被窃取。这样做的开销是多少?这是个谜。
Unity对此的想法非常聪明简单,但似乎实现得很差。

0

我遇到了同样的问题,根本原因似乎是在你的相机和想要点击的物体之间有太多带有碰撞器的对象。

最终它基于射线投射,所以如果中间有任何东西,很可能射线不会命中游戏对象。


0

它是否在调试日志中给出了“鼠标按下”消息?如果是,则问题可能出现在您的RotateforDisplay类中。

这不包含在您的问题中。


0

OnMouseDown() 只在你点击其所附加的对象时才起作用


0

有一件事要检查,就是确保盒子碰撞器大小属性围绕您希望获取点击事件的对象,因为这正是让我感到困惑的地方。


0
如果您使用新的输入系统,则需要将PhysicRaycast添加到您的相机中。

0

当你点击对象时,它可能没有响应。为了使其响应,请确保刚体组件中的模拟框已启用。(我在使用OnMouseDown()时遇到了同样的问题。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接