Jump to content
UnitySpain
crisvg

Mecanicas de sigilo, esconderse en la sombra

Recommended Posts

Estoy haciendo un proyecto que tiene mecánicas de sigilo y he estado pensando que seria bueno que el jugador se pudiera esconder en lugares oscuros, al estilo de splinter cell. Me gustaría saber la cantidad de luz que le llega al personaje, ¿se puede saber eso de alguna manera? He leido que se podría hacer con sphereCast pero no tengo la mas mínima idea de como se usan.

En este video muestran lo que me gustaría lograr pero no dicen como se podrida hacer https://www.youtube.com/watch?v=ByI5YuKa2y8

Gracias de antemano por su ayuda

Share this post


Link to post
Share on other sites

¿Y si compruebas si hay algun objeto entre el personaje y las fuentes de luz mas cercanas? Usando Raycast

Edited by Uli

Share this post


Link to post
Share on other sites

Pero recuerda que la luz se puede colar por pequeñas partes y no seria exacto en decir cuanta luz le llega al personaje

Share this post


Link to post
Share on other sites

Hola @crisvg

Nunca he intentado programar ese sistema (aunque la verdad que es un trabajo interesante el pensar como realizarlo, quizas me anime ^.^) ... dicho eso y poniendo como ejemplo el titulo que has nombrado, Splinter Cell, realmente dudo bastante que este basado en la luz que le llega al personaje. Si tuviera que apostar, diria que la caracteristica de esconderse en las sombras se "activa" por zonas y que despues en el diseño del nivel simplemente se trata de hacer las distintas zonas oscuras o iluminadas segun necesidad para que sean coherentes con el comportamiento de sigilo.

En cualquier caso, lo que si puedo garantizarte es que por el funcionamiento que tiene SphereCast te seria imposible (no se de donde habras leido eso). SphereCast lo que hace es proyectar una esfera del diametro que tu le digas y te devuelve cualquier objeto con el que colisiona, como si fuera un SphereCollider con la unica diferencia que lo "instancias" (realmente no instancia nada, solo realiza la comprobacion) en tiempo de ejecucion y en el momento que tu lo necesites.

Teniendo en cuenta lo anterior, podria parecer buena idea utilizar SphereCast; simplemente deberias utilizarlo en cada foco de luz configurando el radio para que coincida con el area iluminada y listo, cuando el personaje estuviera a rango de la esfera significaria que estaria iluminado. Pero en el caso de que el personaje estuviera tras una pared, por ejemplo porque hay una esquina o en otra habitacion contigua al foco de luz, con sphereCast dara siempre positivo si estas a rango aunque en ese punto te encuentres en un lugar oscuro (no se si se entiende muy bien a lo que me refiero ^.^)

Como sea tienes un buen trabajo (cuantitativamente hablando) entre manos, primero de pensar y despues de llevarlo a la practica. Un saludo y suerte

Share this post


Link to post
Share on other sites

Hay un tutorial en Unity que trata ese tema en específico. Pero alguien se los ha hecho antes de empezar a programar lo suyo?

Share this post


Link to post
Share on other sites

Hay un tutorial en Unity que trata ese tema en específico. Pero alguien se los ha hecho antes de empezar a programar lo suyo?

Pero alguien lee lo que pregunta la gente ? xD

Nada, es coña ... imagino que te refieres al proyecto que se llama Stealth de Unity, la verdad es que nunca lo he hecho (ninguno de los que salen en la pagina oficial para ser mas exacto) pero tu lo has hecho ? porque me parece que en ese tutorial no sale lo que quiere hacer el chico, aunque quizas me equivoque pero si estoy en lo cierto ... señal de que tu tampoco lo has hecho o no has leido lo que quiere hacer el chico, aunque otra posibilidad sea que no hayas jugado al Splinter Cell

Share this post


Link to post
Share on other sites

Y si usa el SphereCast al contrario? No en el foco sino en la sombra, así dependiendo de la distancia al centro de la esfera puedes decir si estás más o menos iluminado?? Siendo el centro 0% iluminado y fuera del SphereCast 100% (De esta forma también tendrían sentido los valores muy superiores a 100 que obtiene en el vídeo). En definitiva yo creo que el del vídeo mide la distancia a algún punto de la sombra, ya sea con SphereCast o un objeto vacío.

Share this post


Link to post
Share on other sites

Pero alguien lee lo que pregunta la gente ? xD

Nada, es coña ... imagino que te refieres al proyecto que se llama Stealth de Unity, la verdad es que nunca lo he hecho (ninguno de los que salen en la pagina oficial para ser mas exacto) pero tu lo has hecho ? porque me parece que en ese tutorial no sale lo que quiere hacer el chico, aunque quizas me equivoque pero si estoy en lo cierto ... señal de que tu tampoco lo has hecho o no has leido lo que quiere hacer el chico, aunque otra posibilidad sea que no hayas jugado al Splinter Cell

Vale, me has pillado. Ni he jugado nunca al Splinter Cell ni he leído bien la pregunta. Ahora le contesto, espero que correctamente.

Estoy haciendo un proyecto que tiene mecánicas de sigilo y he estado pensando que seria bueno que el jugador se pudiera esconder en lugares oscuros, al estilo de splinter cell. Me gustaría saber la cantidad de luz que le llega al personaje, ¿se puede saber eso de alguna manera? He leido que se podría hacer con sphereCast pero no tengo la mas mínima idea de como se usan.

En este video muestran lo que me gustaría lograr pero no dicen como se podrida hacer https://www.youtube.com/watch?v=ByI5YuKa2y8

Gracias de antemano por su ayuda

Puedes obtener el UV Lightmap del punto de impacto del raycast. Esto te puede ayudar a saber el valor de iluminación. También tienes la normal del impacto en el RaycastHit:

http://docs.unity3d.com/ScriptReference/RaycastHit-lightmapCoord.html

http://docs.unity3d.com/ScriptReference/RaycastHit.html

 

Share this post


Link to post
Share on other sites

Vale, me has pillado. Ni he jugado nunca al Splinter Cell ni he leído bien la pregunta. Ahora le contesto, espero que correctamente.

Puedes obtener el UV Lightmap del punto de impacto del raycast. Esto te puede ayudar a saber el valor de iluminación. También tienes la normal del impacto en el RaycastHit:

http://docs.unity3d.com/ScriptReference/RaycastHit-lightmapCoord.html

http://docs.unity3d.com/ScriptReference/RaycastHit.html

 

Tu solucioón suena interesante, voy a leer pa ver que se me ocurre.

 

Hola @crisvg

Nunca he intentado programar ese sistema (aunque la verdad que es un trabajo interesante el pensar como realizarlo, quizas me anime ^.^) ... dicho eso y poniendo como ejemplo el titulo que has nombrado, Splinter Cell, realmente dudo bastante que este basado en la luz que le llega al personaje. Si tuviera que apostar, diria que la caracteristica de esconderse en las sombras se "activa" por zonas y que despues en el diseño del nivel simplemente se trata de hacer las distintas zonas oscuras o iluminadas segun necesidad para que sean coherentes con el comportamiento de sigilo.

En cualquier caso, lo que si puedo garantizarte es que por el funcionamiento que tiene SphereCast te seria imposible (no se de donde habras leido eso). SphereCast lo que hace es proyectar una esfera del diametro que tu le digas y te devuelve cualquier objeto con el que colisiona, como si fuera un SphereCollider con la unica diferencia que lo "instancias" (realmente no instancia nada, solo realiza la comprobacion) en tiempo de ejecucion y en el momento que tu lo necesites.

Teniendo en cuenta lo anterior, podria parecer buena idea utilizar SphereCast; simplemente deberias utilizarlo en cada foco de luz configurando el radio para que coincida con el area iluminada y listo, cuando el personaje estuviera a rango de la esfera significaria que estaria iluminado. Pero en el caso de que el personaje estuviera tras una pared, por ejemplo porque hay una esquina o en otra habitacion contigua al foco de luz, con sphereCast dara siempre positivo si estas a rango aunque en ese punto te encuentres en un lugar oscuro (no se si se entiende muy bien a lo que me refiero ^.^)

Como sea tienes un buen trabajo (cuantitativamente hablando) entre manos, primero de pensar y despues de llevarlo a la practica. Un saludo y suerte

En el foro de unity, el oficial en ingles, hay varios post sobre este tema, en uno dicen que se podrida almacenar todos los colliders con los que choca un spherecast desde el foco y comparar las distancias, si hay un objeto entre la luz y el personaje entonces debe estar en la sombra. El problema es que no se usar ese spherecast así que estoy leyendo y miando posibles soluciones, tampoco me quiero matar. ;)

 

Y si usa el SphereCast al contrario? No en el foco sino en la sombra, así dependiendo de la distancia al centro de la esfera puedes decir si estás más o menos iluminado?? Siendo el centro 0% iluminado y fuera del SphereCast 100% (De esta forma también tendrían sentido los valores muy superiores a 100 que obtiene en el vídeo). En definitiva yo creo que el del vídeo mide la distancia a algún punto de la sombra, ya sea con SphereCast o un objeto vacío.

Este caso funcionaria siempre y cuando tenga luces estaticas, no es mal idea y voy a pensar que solución le doy a mi problema.

 

Creo que ya tengo varias formas de solucionar el problema, solo me hace falta documentarme y decidir cual opcion tomar. En el momento que tenga mi sistemas creado lo comparto :emoticon_cincin:

Share this post


Link to post
Share on other sites

En el foro de unity, el oficial en ingles, hay varios post sobre este tema, en uno dicen que se podrida almacenar todos los colliders con los que choca un spherecast desde el foco y comparar las distancias, si hay un objeto entre la luz y el personaje entonces debe estar en la sombra. El problema es que no se usar ese spherecast así que estoy leyendo y miando posibles soluciones, tampoco me quiero matar. ;)

Vale, si despues compruebas con RayCast es otra historia ... yo me referia a que con SphereCast, por si solo, es imposible. Aunque para utilizar el SphereCast y despues tener que utilizar RayCast, es mejor utilizar RayCast directamente (que es lo que te decia otro compañero del foro en la primera respuesta) y de este modo te ahorrarias todos los calculos que se realizan al utilizar SphereCast. Lo siento porque todo junto a quedado como un trabalenguas xDD

No obstante, coincido con que la opcion de obtener los UV lightmap de los puntos de impacto de los RayCast (aunque no he entendido una mierda) parece muy interesante ... me lo mirare con mas calma yo tambien.

Share this post


Link to post
Share on other sites

Vale, me has pillado. Ni he jugado nunca al Splinter Cell ni he leído bien la pregunta. Ahora le contesto, espero que correctamente.

Puedes obtener el UV Lightmap del punto de impacto del raycast. Esto te puede ayudar a saber el valor de iluminación. También tienes la normal del impacto en el RaycastHit:

http://docs.unity3d.com/ScriptReference/RaycastHit-lightmapCoord.html

http://docs.unity3d.com/ScriptReference/RaycastHit.html

 

El RaycastHit-lightmapCoord devuelve la coordenada de el lightmap que el raycast toca pero que puedo hacer con esa coordenada?

Share this post


Link to post
Share on other sites

A lo que me refería era a usar varios raycast a puntos claves del personaje, uno a la cintura, otro al pecho, al hombro, la mano, etc...Todos enviados desde las fuentes de luz que podrían afectar al personaje. Si en cada uno hay un colisionador de por medio, estaría oculto. Lo de detectar las sombras sobre el personaje no lo veo factible...

Edited by Uli

Share this post


Link to post
Share on other sites

ufff, yo pondria triggers para saber las zonas oscuras y arreando xD las luces dinamicas que puedas tener las controlas y sabes cuando iluminan al jugador.

Ahora parece interesante lo que quieres hacer, supongo que el orden seria

 

raycast ---> sacas lightmapCoord para las cordenadas UV y el  renderer.lightmapIndex para saber que lightmap es el que toca, ya que hay varios por escena y se guardan en una array, asi accedes al   lightmapData que toca,en este estran lightmapFar y lightmapNear que ya son las texturas, entonces con las coordenadas UV que habias conseguido ya sabes que zona de la textura mirar.Aunque no te quita de mirar las luces dinamicas este metodo.

Todo esto lo digo sin tener ni puta idea,que conste,pero mirando la api parece que seria el camino.

Otra manera seria con algun shader que te diera la iluminacion del personaje,aunque ni puta idea tampoco(si unity se dignara a tener un editor de materiales mas facil seria),incluso se me ocurre que al igual que los image effects intentar conseguir el framebuffer del personaje solo y mirar ahi los niveles,ni idea tampoco xD ahha es posible que lo dicho no sean mas que tonterias.

ya iras contando que parece interesante.

Cheers.

Edited by hammer

Share this post


Link to post
Share on other sites

El RaycastHit-lightmapCoord devuelve la coordenada de el lightmap que el raycast toca pero que puedo hacer con esa coordenada?

Pues no tengo ni idea de lo que puedes hacer con eso referente al objetivo que quieres alcanzar ... yo dije que me sonaba interesante la idea, pero tambien que no habia entendido una mierda xDD supongo que el compañero te pueda guiar mejor de que debes hacer con ese dato (si es que se puede hacer algo)

En cualquier caso, yo sigo pensando lo mismo que dije en mi primer post sobre este tema : lo mas factible, y apostaria a que juegos comerciales como Splinter Cell es la "tecnica" que utilizan, es activar y desactivar el sigilo en distintas zonas del nivel segun desees sin importar la iluminacion (eso se puede hacer desde la forma mas rudimentaria y bruta que seria utilizando triggers, a formas mas elegantes que seria comprobando el punto en el que esta el jugador) y una vez tengas hecho esto, cuando diseñes el tema luces en el nivel hacerlo en coherencia a lo anterior.

Haciendolo asi, ademas de que creo es un proceso bastante mas sencillo (lo que no quita que puedas hacerlo de forma mas "profesional") ... tendras el punto a favor de que ahorraras muchos recursos en calculos que serian necesarios al escoger cualquier otro metodo como por ejemplo RayCast ;)

Share this post


Link to post
Share on other sites

También puede "falsearlo", es decir, hacerlo estático.  Planificas unas zonas que sabes que van a tener sombra. Generas polygon colliders en base a esas formas y las colocas justo encima.

Mientras el personaje esté dentro de esos colliders, está "en la sombra".

 

Simple, rápido, y efectivo.  Déjate de calcular iluminaciones en tiempo real y gastar recursos porque sí...

Share this post


Link to post
Share on other sites

×
×
  • Create New...