working unity not getmousebuttondown evento c# unity3d scripting

c# - not - A veces el método OnMouseDown() en Unity se ejecuta, a veces no funciona



unity mouse click (2)

Así que tengo este código adjunto a un 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; } } }

El script anterior genera Game Objects en tiempo de ejecución, a lo que asigné otro script:

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

El problema es que, a veces, OnMouseDown () se ejecuta, a veces no. No puedo entender por qué, y cómo solucionarlo.


Hay muchas razones posibles.

  1. Conflicto de colision OnMouseDown () está emitiendo rayos bajo el capó. Si el rayo desde la posición del mouse choca con otro colisionador (visible o no), no recibirá la llamada OnMouseDown ().
  2. Distancia de la cámara. La implementación de OnMouseDown utiliza un límite de profundidad para la difusión de rayos que puede hacer que el objeto no registre los clics.
  3. Cuerpo rígido. OnMouseDown funciona de forma completamente diferente si hay un RigidBody en algún lugar de la jerarquía. En realidad, no llamará a las funciones de OnMouse en el objeto cliqueado, sino que las llamará en su lugar al objeto de juego del RigidBody (otro error más).
  4. Collider faltante Se llama a OnMouseDown cuando el usuario ha presionado el botón del mouse sobre GUIElement o Collider, por lo que debe agregar collider a su objeto.
  5. Múltiples cámaras Debido al raycasting, tener varias cámaras puede causar un problema.
  6. El colisionador colisiona con otro colisionador en la posición del mouse.
  7. Solo error salvaje. Cerrando y volviendo a abrir el Editor de Unidades como la última esperanza.

Si nada de esto no ayuda, debería implementar la interfaz IPointerDownHandler y usarla en lugar de OnMouseDown.


Probablemente tenga que agregar colisionadores a todos los objetos porque los eventos OnMouse están basados ​​en colisiones. Aquí hay información detallada: Unity Docs - OnMouseDown

Editar: después de algunas conversaciones descubrimos que el problema fue causado por el método de creación de instancias.

Siempre es una mejor manera de completar todos los parámetros en el método de creación de instancias, por ejemplo

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

si lo desea, puede cambiar cualquiera de estos parámetros después de crear una instancia del objeto.