Jump to content
UnitySpain
Sign in to follow this  
Argantonio

Cómo uso OnColliderEnter en un Button?

Recommended Posts

Por favor, tened en cuenta que mi nivel es muy bajo, espero poder expresarme bien para que quede clara mi duda, llevo con Unity y la programación una semana y a ratos. Gracias por vuestra comprensión, mi consulta es para un proyecto 2d.

He creado un Button y a este le he añadido un colisionador, el cual he desplazado fuera del Button, al centro de la pantalla, con la idea de que un sprite pase por encima y yo haga click CON EL MOUSE sobre el Button y este destruya el sprite. Había fabricado esto mismo pero con un botón hecho a partir de un sprite, el problema es que hay que usar el teclado para que funcione y no es la intención, lo programé para que funcionara con el mouse, pero el problema es que se activa haciendo click en cualquier lado de la pantalla, otra cuestión aparte es que con asignación de teclas no me funcionaria en Android.

En concreto:

Activar desde un Button el colisionador asignado y destruya el sprite que pasa por encima.

Con esto daría un paso importante a mi primer proyecto. Muchas gracias.

Share this post


Link to post
Share on other sites

Entendí lo siguiente: Quieres que cuando un sprite pase por encima de un colisionador, si en ese momento de colisión se presiona un botón, dicho sprite se destruya. 

Si es así te recomiendo lo siguiente:

1. Crea un Empty GameObject (GameObject -> Create Empty) este será el objeto central en el cual los sprites tendrán que colisionar, centra el Empty GameObject, agregale un Collider2d (Add component -> Physics 2D -> Box collider) y posteriormente ajusta el tamaño del Collider2d. Recuerda también activar la propiedad Is trigger

2. Crea un botón por medio de UI Canvas (GameObject -> UI -> Button). 

3. Los sprites que serán destruidos añádeles un nuevo tag.  

4. Crea un Script (llámalo como quieras) en él escribirás las siguientes lineas de código: 

private bool isColl = false;
private Collider2D collider; 

void Start()
{
}

void Update()
{
}

public void destroyWithButton(){
  if(isColl){
  	Destroy(collider.gameObject);
  }
}

void OnTriggerEnter2D(Collider2D col){
	if(col.gameObject.tag == "nombredeltag"){
      	collider = col;
    	isColl = true;
    }
}

void OnTriggerExit2D(Collider2D col)
    {
        if(col.gameObject.tag == "nombredeltag"){
          isColl = false; 
        }
    	
    }

5. Arrastra el script al Empty GameObject. 

6. En el button busca el componente Button (Script) en lo ultimo de ese componente encontrarás una seccion llamada On click (Button), da click en el signo "+" y posteriormente arrastra el Empty GameObject hasta donde dice: "None (Object)". 

7. Una vez hecho lo anterior, da click en donde dice "No function" y busca el nombre que le pusiste al Script.

8. En el desplegable que aparece, busca el nombre de la función: "destroyWithButton()" 

9. habiendo hecho lo anterior en teoría debería funcionar, más tarde lo probaré (si tú no lo has hecho antes) y corregiré si he terminado tal vez cometiendo un error. 

Edited by DavidV

Share this post


Link to post
Share on other sites
2 hours ago, DavidV said:

Entendí lo siguiente: Quieres que cuando un sprite pase por encima de un colisionador, si en ese momento de colisión se presiona un botón, dicho sprite se destruya. 

 

Hola David, exacto! Eso eso es lo que pretendo... He probado tu código, lo que no me aparece es la opción de destruir "destroyWithButton()"  muchas gracias por tu interés y tu tiempo. 

Share this post


Link to post
Share on other sites
15 minutes ago, Argantonio said:

Hola David, exacto! Eso eso es lo que pretendo... He probado tu código, lo que no me aparece es la opción de destruir "destroyWithButton()"  muchas gracias por tu interés y tu tiempo. 

1. Si en el punto 7 te aparece el nombre del Script pero luego en el punto 8 no aperece el nombre de la función "destroyWithButton()" es porque la función no la has hecho pública. Busca en el script y has pública la función (debe quedar public void destroyWithButton()).

2. Si en el punto 7 no te aparece el nombre del script, es porque no has arrastrado el objeto correcto: El script debes adjuntarlo al Empty GameObject y luego arrastras ese GameObject hasta donde dice: None (Object) 

Ya lo he probado y me ha funcionado, intenta las soluciones que te he dado y me dices si te ha salido algún problema

Share this post


Link to post
Share on other sites

Funciona perfecto!! :1_grinning:. Te lo agradezco mucho estaba estancado con eso jejeje 

 

16 hours ago, DavidV said:

 

Ya lo he probado y me ha funcionado, intenta las soluciones que te he dado y me dices si te ha salido algún problema

Funciona siempre y cuando el botón quede dentro del rectángulo (zona de acción) del boxcollider, al sacarlo deja de tener el efecto... Sabes si se puede solucionar de alguna forma? porque no da libertad de colocación del botón. Gracias 

Share this post


Link to post
Share on other sites
16 hours ago, Argantonio said:

Funciona perfecto!! :1_grinning:. Te lo agradezco mucho estaba estancado con eso jejeje 

 

Funciona siempre y cuando el botón quede dentro del rectángulo (zona de acción) del boxcollider, al sacarlo deja de tener el efecto... Sabes si se puede solucionar de alguna forma? porque no da libertad de colocación del botón. Gracias 

Es extraño, a mí me funciona independientemente de donde esté el botón. El botón como tal no interactua con los demás GameObject, da igual donde esté ya que éste sólo responde a un evento (destroyWithButton()). ¿Podrías enviarme unas imágenes (del inspector) de los sprites, el Empty gameObject y del Botón?

Share this post


Link to post
Share on other sites
7 hours ago, DavidV said:

Es extraño, a mí me funciona independientemente de donde esté el botón. El botón como tal no interactua con los demás GameObject, da igual donde esté ya que éste sólo responde a un evento (destroyWithButton()). ¿Podrías enviarme unas imágenes (del inspector) de los sprites, el Empty gameObject y del Botón?

Hola David, ok edito todo lo que escribí. Son dos botones, cada uno tiene asignados sus correspondientes sprites, su correspondiente codigo, tags, etc. Modificando el radio del collider funciona, pero solo con un boton jjj que locura. Los botones los dupliqué y modifiqué, pero voy a crear desde cero el que no funciona y a ver que pasa. Las capturas tienen mezclados los Tag porque hice 2, uno por boton y no me fijé a la hora de hacerlas, pero te confirmo que todos los inspectores están idénticos.

bton.JPG

GameObjet.JPG

sprites.JPG

Edited by Argantonio

Share this post


Link to post
Share on other sites

Solucionado. El RigidBody2d asignado al colisionador debe tener activada la opción "Kinematic" para que un botón destruya un sprite que se mueve y pasa por encima del colisionador. El codigo de David funciona a la perfección y le agradezco mucho su tiempo y su interés por ayudarme. :96_ok_hand::96_ok_hand:

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...