Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Sistema de colisiones

Iniciado por Jordi432, Octubre 28, 2016, 11:34:32 AM

Tema anterior - Siguiente tema
Bueno, sigo con mi jueguecillo y sigo con mis dudas.
 
El caso es que estoy ya intentando hacer las colisiones entre los objetos. Tengo ya los personajes con sus armas y todo fucniona correctamente.
 
Ahora, para programar los daños que hacen las diferentes balas que tengo en las armas estoy bloqueado porque no acabo de entender el sistema de colisiones de Unity...por ejemplo, tengo 2 personajes, uno que es el principal y otro que lo "ataca". He usado un par de "triggers"  en el rival (uno mas pequeño y otro más grande) para que cuando el personaje principal se acerca al otro, empiece a ***guirlo y cuando esté más cerca se pare, también lleva un trigger el personaje principal.
 
Quiero conseguir que cuando se lance la granada o se dispare, la bala solo afecte a los "cuerpos", o a objectos concretos. He estado probando la función "OnTriggerEnter2D" y el "OnCollisionEnter2D", en el primero detecta cualquier trigger que lleve el personaje, y no veo como poner un "tag" a los triggers para que solo detecte el que me interesa, que sería el mismo que uso para que pare de caminar, por ejemplo, entonces seria la colisión entre el trigger de la granada y este del "atacante". El segundo caso no he conseguido que detecte la colisión entre el rigidbody y el collider de la granada..y no se por que...
 
No se si me he explicado bien, espero que alguno de vosotros pueda darme alguna pista, que siempre hacen que se me ilumine la neurona..
 
Salu2, gracias de antemano!

Buenas,
 
en cuanto al trigger, para sólo tratar las colisiones que te interesan tienes dos opciones:
 


  1.    Configurar la Layer collision matrix del proyecto para que sólo se detecten colisiones entre objetos de determinadas layers. Yo utilizo bastante esta opción para mejorar el rendimiento en general, no hace falta que se detecten colisiones entre rocas por ejemplo, pero entre el player y las rocas sí. Es un ejemplo, aquí tienes la documentación: https://docs.unity3d.com/Manual/LayerBasedCollision.html


  2.    Siempre que el trigger te detecta una colisión puedes comprobar el objeto contra el que has chocado ya que como parámetro te llega un Collider (un Collider2D en tu caso). Dentro del código del OnTrigger() puedes hacer algo así: 



void OnTriggerEnter2D(Collider2D other) {
  switch(other.tag)
  {
   case "Bullet":
      // ...
      break;
   case "Grenade":
      //...
      break;
   Default:
       Console.Log("Collision not handled");
      break;
  }
}

 
Si en lugar del Tag quieres comprobar otras cosas siempre puedes hacer ohter.gameObject.loQueSea (por ejemplo other.gameObject.getComponent<MiScript>().miVariable para saber qué daño le tiene que hacer el impacto al player). En fin no me enrollo más :)

Octubre 28, 2016, 02:48:57 PM #2 Ultima modificación: Octubre 28, 2016, 03:20:09 PM por Jordi432
Vale, me gusta la idea de los layers, creo que es lo que necesito. Aquí tengo el problema que dije, el personaje rival tiene 2 triggers, subo dibujo para verlo mejor...cuando el personaje principal entra en la zona verde lo persigue y cuando está en la zona roja se para, porque no tiene sentido que siga andando si está tan cerca ya que choca y queda un poco raro. Luego, para usar los layers, por lo que entiendo no se puede tener los 2 colliders como componentes de un mismo objeto ya que la selección de layer se hace para ese objeto, o sea, que los dos colliders estarán en el mismo layer. Así que lo que se me ocurre es crear un empty object dentro del rival con el otro collider y asignarlo al segundo layer. Luego ya con que las balas solo afecten al collider que está en este layer ya debería funcionar. Está bien hecho así?
 
-- EDIT --
 
Acabo de probar lo de hacer un empty object con el collider y no lo detecta, supongo que al ser otro objeto no funciona el mismo script del obejto padre (o algo así). Lo unico que se me ocurre es separar en otro script el tema colisiones y aplicarlo al empty object que está dentro del otro collider...
 
 
 




   
       
   

[/quote]
 
Bueno pues nada, la solución era más simple de lo que pensaba. Tenía un error (grave) y era que tenía las balas asignadas al jugador, no separadas, instanciaba la bala y le cambiaba el parent a null o al mapa.
 
Pues nada, para que no molesten los colliders de los personajes con los de las balas los he separado en layers diferentes. He puesto las balas separadas y LISTO!! Ya funciona a las mil maravillas.

Etiquetas: