有时Unity中的OnMouseDown()方法执行,有时则不执行

所以我将此代码附加到Quad。

public class ShapeGrid : MonoBehaviour { public GameObject[] shapes; void Start(){ GameObject[,] shapeGrid = new GameObject[3,3]; StartCoroutine(UpdateGrid()); } IEnumerator UpdateGrid(){ while (true) { SetGrid (); yield return new WaitForSeconds(2); } } void SetGrid(){ int col = 3, row = 3; for (int y = 0; y < row; y++) { for (int x = 0; x < col; x++) { int shapeId = (int)Random.Range (0, 4.9999f); GameObject shape = Instantiate (shapes[shapeId]); shape.AddComponent(); Vector3 pos = shapes [shapeId].transform.position; pos.x = (float)x*3; pos.y = (float)y*3; shapes [shapeId].transform.position = pos; } } } 

上面的脚本在运行时生成游戏对象,我分配了另一个脚本:

 public class ShapeBehavior : MonoBehaviour { void OnMouseDown(){ Debug.Log ("Destroy"); Destroy (gameObject); } } 

问题是,有时OnMouseDown()执行,有时它不执行。 我无法弄清楚为什么,以及如何解决它。

可能你必须向所有对象添加碰撞器,因为OnMouse事件基于碰撞。 以下是详细信息: Unity Docs – OnMouseDown

编辑:经过一些会谈,我们发现问题是由Instantiate方法引起的。

它总是一种更好的方法来填充Instantiate方法中的所有参数,例如

Instantiate(prefab, Vector3.zero, Quaternion.Identity)

如果需要,可以在实例化对象后更改任何这些参数。

有很多可能的原因。

  1. 碰撞冲突。 OnMouseDown()是引擎盖下的光线投射。 如果来自鼠标位置的光线撞击另一个对撞机(可见或不可见),则不会进行OnMouseDown()调用。
  2. 与相机的距离。 OnMouseDown实现使用光线投射的深度限制,这可能导致对象不注册点击。
  3. 刚体。 如果层次结构中的某个地方存在RigidBody,则OnMouseDown的工作方式完全不同。 它实际上不会在被点击的对象上调用OnMouse函数,但它会改为在RigidBody的游戏对象上调用它们(还有另一个bug)。
  4. 碰撞失踪。 当用户在GUIElement或Collider上按下鼠标按钮时调用OnMouseDown,因此您必须向对象添加碰撞器。
  5. 多个摄像头。 由于使用了多台摄像机,可能会导致问题。
  6. 碰撞器与鼠标位置上的另一个碰撞器发生碰撞。
  7. 只是疯狂的虫子。 关闭并重新打开Unity Editor作为最后的希望。

如果没有任何帮助,您应该实现IPointerDownHandler接口并使用它而不是OnMouseDown。