Unity C# OnMouseDown() 不起作用.. 为什么?
Unity C# OnMouseDown() does not work.. Why?
我对 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>();
}
检查以下几点:
- 检查你的目标有碰撞器(这个系统像使用光线投射一样工作)并且它已启用
- 检查碰撞器是否未调整大小或移动。
- 检查您是否没有任何其他物体与碰撞体之间。
希望对你有所帮助,祝你好运!
它是否为您提供调试日志的 "Mouse Down" 消息?如果是,那么问题可能出在您的 RotateforDisplay Class 中。
你的问题中没有包含。
我遇到了同样的问题,根本原因似乎是在您的相机和您要单击的对象之间有碰撞体的对象数量。
它最终基于光线投射,因此如果两者之间存在任何差异,很可能是光线没有击中游戏对象。
要检查的一件事是确保盒子碰撞器的大小属性围绕着您希望为其获取点击事件的对象,因为那是困扰我的问题。
这些函数非常易于使用,但它们的实现充满了隐藏的案例,使它们的使用存在问题。
例如,如果对象 C 设置了碰撞器但没有刚体,并且是具有刚体的对象 P 的子对象,则当您与 C 交互时,父对象 P 将调用其方法,并且C 的方法将不会 被调用。
即使对象 P 根本没有碰撞器,也会发生这种不良行为。
刚体(没有边界)与鼠标输入有什么关系?什么都没有。
我想到的唯一解决方法是为所有 mouse-aware 对象洒上无用的刚体(重力=false 和运动学,也许)以避免它们的鼠标事件被盗。这样做的间接费用是多少?这是一个谜。
Unity对此的想法非常巧妙和简单,但似乎实施起来很糟糕。
OnMouseDown() 仅在您单击它附加到的对象时起作用
我对 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>();
}
检查以下几点:
- 检查你的目标有碰撞器(这个系统像使用光线投射一样工作)并且它已启用
- 检查碰撞器是否未调整大小或移动。
- 检查您是否没有任何其他物体与碰撞体之间。
希望对你有所帮助,祝你好运!
它是否为您提供调试日志的 "Mouse Down" 消息?如果是,那么问题可能出在您的 RotateforDisplay Class 中。
你的问题中没有包含。
我遇到了同样的问题,根本原因似乎是在您的相机和您要单击的对象之间有碰撞体的对象数量。
它最终基于光线投射,因此如果两者之间存在任何差异,很可能是光线没有击中游戏对象。
要检查的一件事是确保盒子碰撞器的大小属性围绕着您希望为其获取点击事件的对象,因为那是困扰我的问题。
这些函数非常易于使用,但它们的实现充满了隐藏的案例,使它们的使用存在问题。
例如,如果对象 C 设置了碰撞器但没有刚体,并且是具有刚体的对象 P 的子对象,则当您与 C 交互时,父对象 P 将调用其方法,并且C 的方法将不会 被调用。
即使对象 P 根本没有碰撞器,也会发生这种不良行为。
刚体(没有边界)与鼠标输入有什么关系?什么都没有。
我想到的唯一解决方法是为所有 mouse-aware 对象洒上无用的刚体(重力=false 和运动学,也许)以避免它们的鼠标事件被盗。这样做的间接费用是多少?这是一个谜。
Unity对此的想法非常巧妙和简单,但似乎实施起来很糟糕。
OnMouseDown() 仅在您单击它附加到的对象时起作用