unity3d Unity C# OnMouseDown()不起作用..为什么?

3npbholx  于 2023-01-09  发布在  C#
关注(0)|答案(8)|浏览(530)

我有一个关于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");
    }

}
c6ubokkw

c6ubokkw1#

检查以下几点:

  • 检查你的目标有一个碰撞器(这个系统的工作原理就像使用光线投射一样),并且它是启用的
  • 检查碰撞器是否没有被调整大小或移动。
  • 检查你是否有任何其他物体与对撞机之间。

希望有帮助,祝你好运!

92dk7w1h

92dk7w1h2#

试试这个:

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>();
}
wko9yo5t

wko9yo5t3#

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

qyuhtwio

qyuhtwio4#

调试日志是否给予“鼠标按下”消息?如果是,则问题可能出在RotateforDisplay类中。
你的问题里没有这个。

shstlldc

shstlldc5#

我也有同样的问题,根本原因似乎是在你的相机和你想点击的物体之间有碰撞器的物体的数量。
它最终是基于光线投射的,所以如果在两者之间有任何东西,光线很可能没有击中游戏对象。

epggiuax

epggiuax6#

有一件事是要检查是确保箱碰撞大小属性周围的对象,你希望得到的点击事件,因为这是什么难倒我。

kknvjkwl

kknvjkwl7#

OnMouseDown()仅在单击其所附加的对象时才有效

lf3rwulv

lf3rwulv8#

如果您使用新的输入系统,则需要为相机添加PhysicRaycast

相关问题