我对 OnMouseDown() 事件有疑问。这个脚本所属的对象是一个电脑柜,点击它可以执行某些动作。但我被困在第 1 个方块上。我已经尝试在网上搜索这个问题一段时间了,但似乎几乎没有人遇到同样的问题,而且其他解决方案也没有完美运行。有人可以帮我吗?我很困惑..
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");
}
}
检查以下几点:
希望对您有所帮助,祝您好运!
试试这个:
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>();
}
这些函数非常易于使用,但它们的实现充满了隐藏的案例,使它们的使用存在问题。
例如,如果对象 C 设置了碰撞器但没有刚体,并且是具有刚体的对象 P 的子对象,则当您与 C 交互时,父对象 P 将调用其方法,并且 C 的方法将 不被称为。
即使对象 P 根本没有碰撞器,也会发生这种不良行为。
刚体(没有边界)与鼠标输入有什么关系?什么都没有。
我想到的唯一解决办法是用无用的刚体(重力=假和运动学,也许)来散布所有鼠标感知对象,以避免它们的鼠标事件被盗。这样做的间接费用是多少?这是一个谜。
Unity对此的想法非常巧妙和简单,但似乎执行起来很糟糕。
它是否为调试日志提供“鼠标按下”消息?如果是,那么问题可能出在您的 RotateforDisplay 类中。
你的问题中没有包含。
我遇到了同样的问题,根本原因似乎是在你的相机和你想要点击的物体之间有对撞机的物体数量。
它最终是基于光线投射的,所以如果两者之间有任何差异,很可能是光线没有击中游戏对象。
要检查的一件事是确保盒子碰撞器的大小属性围绕着您希望获得点击事件的对象,因为那是难倒我的东西。
OnMouseDown() 仅在您单击它所附加的对象时起作用
如果您使用新的输入系统,您需要为您的相机添加
PhysicRaycast
可能是当您点击对象时它没有响应您的点击。要使其响应,请确保启用刚体组件中的模拟框。 (我在 OnMouseDown() 中遇到了同样的问题。)