Jump to content
UnitySpain

Aceptamos donaciones vía Paypal.

UnitySpain.com es un servicio gratuito, pero mantener la Comunidad conlleva una serie de gastos.

Fondo Anual Unityspain: Donados 15,00€ de 150,00€

  • Servidor: Dominio.com y Hosting Web
  • Mantenimiento de los Foros
  • Contenido y Servicios Extras
  • Mantenimiento para Redes Sociales
Sign in to follow this  
nomoregames

ANSWERED Duda sobre colisiones

Recommended Posts

¡Hola a todos!

Vengo con otra duda

y es que necesito guardar en una variable tipo gameobject,  el objeto que este colisionando con el collider.

Se que no lo estoy explicando muy bien, pero ahora no se como definir mejor lo que quiero hacer :7_sweat_smile:.

 

En todo caso, gracias de antemano.

Share this post


Link to post
Share on other sites

Dentro del evento de OnCollisionEnter, ...

void OnCollisionEnter(Collision collision)
    {
        if (collision.transform.CompareTag("miobjeto"))
        {
           var objetillo = collision.transform.gameObject;
           //ahora que ya lo tengo, bla bla bla bla...
        }
    }
Edited by pioj

Share this post


Link to post
Share on other sites

@pioj

¿No sería más corto hacer

GameObject objetillo = collision.transform.gameObject;

directamente? ¿O hay alguna razón para hacer esa comparación de tag antes?

Share this post


Link to post
Share on other sites
On 12/20/2019 at 2:44 PM, Deaymon said:

GameObject objetillo = collision.transform.gameObject;

directamente? ¿O hay alguna razón para hacer esa comparación de tag antes?

Sólo lo filtro por precaución, por si hay más de un objeto que pueda colisionar con él, pero sólo nos interese detectar uno en concreto...

Share this post


Link to post
Share on other sites
On 12/27/2019 at 7:02 PM, nomoregames said:

habría alguna forma de hacer lo mismo con raycast???

No, porque los mensajes de collision se disparan cuando los objetos colisionan, en este caso cuando "entra" en una colisión. Creo que se dan cuando la distancia entre los puntos más cercanos es menor a la suma de los contact offset de los dos colliders (ProjectSettings/Physics(o Physics2D)). Con raycast, spherecast, y demás vos estás "prediciendo" el futuro choque (dependiendo de las características del "cast" obviamente). La desventaja es que necesitas "castear" (ya que estamos vamos a cagarnos en la RAE xD) todo el tiempo, y el cast necesita ser fiel a la forma del collider (si usas una caja será un boxcast, si es una capsula un capsuleCast, etc). En 2D (no se en 3D) tenés Rigidbody.Sweep, es más caro pero hace el cast con toda laforma del collider2D.

Lo que sí podés hacer con los "cast" es filtrar por capas usando LayerMasks, y posteriormente usando tags.

Share this post


Link to post
Share on other sites

Muchas gracias lightbug

pero lo que me explicas me plantea dos dudas

la primera (que me da un poquito de vergüenza) es que a que te refieres o que es offset.

la otra es; que son los layermask? me lo he mirado en la guía de unity pero entre los palabros que usa y que soy bastante pésimo con el ingles, pues... no me entero de nada :7_sweat_smile::61_sob:

 

Y en cuanto a la RAE... https://dle.rae.es/almóndiga tranquilo que ya se cagan ellos por ti.

Share this post


Link to post
Share on other sites
3 hours ago, nomoregames said:

Y en cuanto a la RAE... https://dle.rae.es/almóndiga tranquilo que ya se cagan ellos por ti.

Jajaj ya es todo una joda.

3 hours ago, nomoregames said:

la primera (que me da un poquito de vergüenza) es que a que te refieres o que es offset.

A eso que dije no le des mucha bola, sería algo así:

contact.jpg

los circulos rojos (los colliders) no se tocan, pero la suma de los contactOffsets de los circulos es menor que la distancia "d".

3 hours ago, nomoregames said:

la otra es; que son los layermask?

Con una layermask podés ser selectivo a la hora de hacer un cast, es decir, tenes en cuenta ciertas layers y otras no.

El ejemplo más claro es en un shooter, en la escena tenés triggers que activan ciertas cosas, health packs y enemigos, ponele (además de otras cosas). Cuando disparás no querés que el raycast que usas tome en cuenta al health pack o al trigger. Entonces, en el campo LayerMask sacás "Triggers" y "Health Pack" (suponiendo que fueron previamente asignados a estas capas).

Share this post


Link to post
Share on other sites

Buenas tardes lightbug,

y gracias por tus explicaciones.

Estuve investigando un poco y por lo visto si se puede hacer lo que quería.... 

 RaycastHit hit;
       if (Physics.Raycast(BulletSpawn.transform.position, BulletSpawn.transform.forward,out hit, 100f)){

            GameObject objetillo = hit.transform.gameObject;
        };

 

Share this post


Link to post
Share on other sites

Tú estás trazando un rayo desde donde disparas la bala hacia adelante, que es la forma típica de disparar una bala y calcular a qué collider le da instantáneamente. No necesitas que la bala tenga un collider ni un rigidbody para esto (de hecho si tienes muchas balas, mejor que no lo tengan).

Esos 100f recuerda que son la distancia máxima e igual tu mapa es mayor. Y recuerda que si el origen del rayo está dentro de un collider esa colisión no la detectará.

Pero lo que preguntaste es sobre el objeto "que está colisionando" con un collider, y eso normalmente no involucra raycasting. En vez de preguntar lo que quieres hacer, es mejor comentar qué problema tienes o qué quieres conseguir.

Lo que has hecho está perfecto para balas instantáneas. Si a la bala le afecta la gravedad, el viento o el tiempo, entonces tienes dos opciones:

  1. simular la bala en el tiempo como un rigidbody y usar un modo de detección de colisiones Continous o ContinuousDynamic (de lo contrario a velocidades altas perderás colisiones)
  2. simular la bala a mano, trazando un rayo en cada FixedUpdate, desde la posición anterior hasta la nueva, alternativamente usando spherecasting en lugar de raycasting si es que es una bala enorme... en ambos casos perderías colisiones con otros objetos que también se muevan muy rápido (por ejemplo, otras balas)

En todos los casos recuerda usar una capa para las balas (si es que al final tienen colliders) y otra para los objetos con los que sí quieres colisionar. Cuantos menos objetos haya en esa capa mejor, y utiliza la LayerMask para calcular el raycast sólo con los objetos que te interesen y ninguno más (el raycast y las físicas son computacionalmente costosas).

Edited by J Montes

Share this post


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

×
×
  • Create New...