2015-10-20 501 views
1

因此,我将此代码附加到Quad。有时Unity中的OnMouseDown()方法执行,有时它不会

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事件()执行,有时它没有。我无法弄清楚为什么,以及如何解决它。

回答

0

也许你必须添加碰撞器到所有的对象,因为OnMouse事件是基于碰撞。这里是详细的信息:Unity Docs - OnMouseDown

编辑:经过一些谈判后,我们发现问题是由实例化方法引起的。

这是百达一个更好的方式来填补所有的实例化方法参数e.g

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

如果你愿意,你可以实例化对象后,更改其中的任何参数。

+0

ShapeGrid类中的形状已经有一个碰撞器。因此,如果我在每个克隆的游戏对象上添加碰撞器,我都会收到此错误:无法将组件'BoxCollider'添加到圆圈(克隆),因为它与现有的'BoxCollider2D'派生组件冲突! – jeanl

+0

你说“有时候”,你可以检查问题是否存在于同一个对象上,或者是这个随机的东西吗?你也可以检查图层,对象不能在忽略Raycast图层上。 –

+0

一直试图找到一种模式。我认为这是随机的。我不认为我使用Raycasts – jeanl

0

有很多可能的原因。

  1. 对撞机冲突。 OnMouseDown()在后台进行光线投射。如果鼠标位置的光线照到另一个对撞机(可见或不可见),则不会得到OnMouseDown()调用。
  2. 与相机的距离。 OnMouseDown实现使用光线投射的深度限制,这可能会导致对象不注册点击。
  3. RigidBody。如果在层次结构中存在某个RigidBody,OnMouseDown将完全不同。它实际上不会在被点击的对象上调用OnMouse函数,而是将其称为RigidBody的游戏对象,而不是另一个bug。
  4. 碰撞失踪。当用户在GUIElement或Collider上按下鼠标按钮时会调用OnMouseDown,因此必须将碰撞器添加到对象中。
  5. 多台摄像机。由于有多台摄像机进行射线照相,可能会导致问题。
  6. 碰撞器碰撞鼠标位置上的另一个碰撞器。
  7. 只是野生的bug。关闭并重新打开Unity编辑器是最后的希望。

如果没有这个不能帮助您应该实现IPointerDownHandler接口并使用它而不是OnMouseDown。

+0

1)我不认为这是与位置,因为有时它在一个特定的位置,有时不工作。 2)再次,不是与位置。 3)没有任何物体的刚性体。 4)对象已经有对撞机。 5)我只使用1个相机。 6)我仍然不认为这是位置? 7)仍然没有。 :(谢谢你,但 – jeanl

相关问题