Megadok 11 Report post Posted February 27 Buenas gente!😅 Tengo un gameobject desde donde proyecto raycast2d a través de un "for". Todo va de maravilla pero he detectado que, si por ejemplo lanzo 4 rayos desde el "for", cuando colisiono con el "0" me cambia de color el "1", cuando colisiono con el "1" me cambia de color el "2", y si colisiono con el "2" me cambia de color el "3". La colisión la he comprobado y funciona correctamente pero solo es que el color asignado desde el Debug.DrawRay me colorea el "siguiente" rayo. Y si colisiono con el último, me colorea el primero.😱 void rayo_deteccion() { for(int i = 0; i < numero_rayos; i++) { switch (_direccion) { case movimiento_2D.mirada.abajo: hit = Physics2D.Raycast((Vector2)transform.position - new Vector2(-0.5f + (i * rango_distancia_rayos), offset_rayo), transform.TransformDirection(Vector2.down), alcance_rayo); Debug.DrawRay((Vector2)transform.position - new Vector2(-0.5f + (i * rango_distancia_rayos), offset_rayo), transform.TransformDirection(Vector2.down) * alcance_rayo, r); colisiona_rayo(hit,i); ; break; } } } void colisiona_rayo(RaycastHit2D hit, int i) //con este metodo obtengo gracias a la "i" del "for" el rayo correcto PERO no el DebugDraw { if (numero_rayos > 0) { if (hit.collider != null) { Debug.Log("choca " + hit.collider.gameObject.name); r = Color.red; Debug.Log("Rayo i " + i.ToString()); } else { r = Color.green; } } } ¿Alguna solución? Gracias!. Share this post Link to post Share on other sites
lightbug 846 Report post Posted February 28 Hola, sí eso pasa porque efectivamente "colisiona_rayo" se llama después del del Debug.DrawRay. Podrías organizarlo un poco mejor así: Share this post Link to post Share on other sites
Megadok 11 Report post Posted February 28 (edited) Gracias @lightbug! Una cosita más. Ahora que todo funciona bien y en orden, me gustaría que cuando los rayos colisionen con mi gameobject, mi gameobject se pare(para eso reduzco su velocidad a 0), sin problema. El caso es que he añadido un método para cuando hit != null y otro método en el "else" de la condición en el caso que sea null. Lo que me ocurre es que me da los dos resultados a la vez, entonces hace la llamada a los dos métodos a la vez, y mi gameobject no se para, porque se para y se mueve al mismo tiempo. Y creo que esto es debido a los resultados de los múltiples rayos que se elaboran en el "for" y se mezclan. ¿Cómo puedo hacer para que si al menos un rayo colisiona, me de un valor "true" y éste predomine sobre el resultado de los demas rayos que no colisionan y producen null? ¿Cómo puedo hacer para que si ninguno de los rayos colisionan me de un valor "false"? Gracias!😻 Edited February 28 by Megadok Share this post Link to post Share on other sites
lightbug 846 Report post Posted March 1 (edited) 21 hours ago, Megadok said: Y creo que esto es debido a los resultados de los múltiples rayos que se elaboran en el "for" y se mezclan. Es muy probable, igual si tenés el código sería mucho mejor. 21 hours ago, Megadok said: ¿Cómo puedo hacer para que si al menos un rayo colisiona, me de un valor "true" y éste predomine sobre el resultado de los demas rayos que no colisionan y producen null? Podrías definir un flag (bool) que simplemente se ponga en true si algun rayo colisiona. bool stopFlag = false; for(int i = 0; i < numero_rayos; i++) { ... mismo que antes if( hit ) stopFlag = true; } if( stopFlag ) Stop(); // velocity = 0 esto que puse acá podés replicarlo así: bool stopFlag = false; for( ... ) { ... stopFlag |= hit; } Que básicamente significa "si algún hit es true, stopFlag será siempre true, solamente si todos los hit son falsos stopFlag será falso" Edited March 1 by lightbug Share this post Link to post Share on other sites
Megadok 11 Report post Posted March 1 Gracias @lightbug, me vino muy bien la explicación, pude al final conseguirlo.☺️ 1 Share this post Link to post Share on other sites