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

本文关键字:执行 方法 中的 OnMouseDown Unity | 更新日期: 2023-09-27 18:18:23

所以我把这段代码附加到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<ShapeBehavior>();
            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()有时执行,有时不执行。我不知道为什么,也不知道如何修复。

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

可能有很多原因。

  1. 对撞机冲突。OnMouseDown()是在引擎盖下的光线投射。如果来自鼠标位置的光线击中另一个碰撞器(可见或不可见),你不会得到OnMouseDown()调用。
  2. 与相机的距离。OnMouseDown实现使用光线投射的深度限制,这可能导致对象不注册点击。
  3. RigidBody。如果在层次结构中有一个RigidBody, OnMouseDown的工作方式完全不同。它实际上不会在被点击的对象上调用OnMouse函数,而是会在RigidBody的游戏对象上调用它们(这又是一个bug)。
  4. 对撞机失踪。OnMouseDown当用户在gui元素或Collider上按下鼠标按钮时被调用,所以你必须为你的对象添加Collider。
  5. 多个摄像头。由于光线投射,有几个相机可能会导致问题。
  6. 碰撞器在鼠标位置上与另一个碰撞器碰撞。
  7. 只是个野虫子。关闭和重新打开Unity编辑器是最后的希望。

如果这些都没有帮助,你应该实现IPointerDownHandler接口,并使用它来代替OnMouseDown。

可能你必须为所有对象添加碰撞器,因为OnMouse事件是基于碰撞的。Unity Docs - OnMouseDown

编辑:经过讨论,我们发现问题是由Instantiate方法引起的。

填充实例化方法中的所有参数总是更好的方法,例如

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

如果您愿意,您可以在实例化对象后更改这些参数中的任何一个。