Noticias

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

Enemigo no cae al suelo

Iniciado por FNP, Diciembre 12, 2015, 01:53:22 PM

Tema anterior - Siguiente tema
Buenas, llevo una semana volviéndome loco con esto, el problema que tengo es que estoy haciendo un FPS y cuando disparo al enemigo tengo el problema de que se me queda muerto en el aire. El enemigo en cuestion, es un modelo de la asset store, en concreto este: https://www.assetstore.unity3d.com/en/#!/content/44560 El modelo soporta Mecanim, esta correctamente rigeado, funcionan todas las animaciones, etc. Lo utilizo en el juego como un preFab y lo instancio dinamicamente para que aparezcan los zombies desde un spawner, El enemigo tiene un Character Controller, un RigidBody kinematico y un mesh collider para que las colisiones sean exactas con su malla.El disparo lo estoy haciendo con un objeto bala, que es un prefab y se genera dinámicamente al disparar, cuando esta está en movimiento lanza un Raycast y comprueba mediante el tag si colisiona con un zombie, si se hace esta colisión antes de que el proyectil se destruya, este se mueve a la posición del RaycastHit, por lo que en la bala se ejecuta el OnCollisonEnter desde donde instancio un salpicon de sangre en su posición, destruyo el proyectil y lanzo un método en el enemigo que se encarga de quitar vida, comprobar si muere, etc.Este sistema me funciona a la perfección, en el método que quita vida al enemigo, le resto la vida correspondiente y si se ha llevado a cabo un cierto numero de disparos le mato, haciendo un efecto con partículas y la animación de muerte.El problema lo tengo aquí, la animación esta configurada en el correspondiente animator con su transición y tal, pero cuando lo animo el zombie se queda en el aire.Creo que el problema puede estar en el Character Controller, que al tener forma de cápsula, se queda "en pie", he intentado desactivarlo antes de hacer la animacion, pero parece que o no funciona o no es tan facil, mirando, leyendo y preguntando por ahi, perece ser que la forma correcta es:- Desactivar el script de control del enemigo que gestiona sus movimientos.- Descativar el Character Controller.- Poner el RigidBody como NO kinematico (ya está asi).- Activar un nuevo Collider (Ya tiene un MeshCollider activo).Pero ya os imagináis que nada de nada, sobre esta fórmula he hecho todas las variantes que se me han ocurrido y de hecho he conseguido de todo, que salga volando, que patine y mil cosas mas, menos que se caiga al suelo. Os adjunto dos fotos, una de como se queda en el aire y otra del editor de Unity con el modelo seleccionado, el "ataud" que arrastra es el mesh collider que me lo representa asi, me imagino que porque esta el Charactyer Controller que tambien es un collider, pero el caso es que funciona perfectamente todo menos lo de la altura.¿Alguien me puede dar alguna idea al respecto?Gracias a todos por anticipado.Un saludo,Fernando.


pareciera que está flotando en el centro de la cápsula del coliionador, puedes reducirle la altura al capsulecollider para que baje al suelo

Buena idea, perooooooo, estaría bien si los zombies estuviesen en una piscina xDDDDDDDD. La puñeta del Unity es que aunque no necesites las físicas tienes que meterlas por las colisiones y demás.

Tambien he probado a modificar el height desde el script y mediante un Debug.Log veo que se ha modificado correctamente, pero en realidad no me hace caso., a lo único que parece responder es a la destrucción del MeshCollider, pero claro, pierde la colisión contra el suelo y lo atraviesa. 

Prueba a modificar el collider en la animación; abres una ventana Animation, seleccionas la animación y modificas el collider en los frames que creas necesario.

jajaja no hombre, le bajas la altura cuando muere... prueba lo que dice juanma, sino tiens que programarlo

Gracias, no sabía que se pudiese modificar el Collider en ciertos frames, lo que no consigo es averiguar como hacerlo, desde el Animator no me deja tocar la animación, solo las transiciones y si edito la animación, ahí no aparece ninguna forma de tocar el Collider.Finalmente he conseguido hacerlo, ya que al buscar la forma he descubierto que al editar la animación, puedo cambiar el Root Transform Position, haciendo un Bake into Pose y un Base upon center of mass, así aplicando un offset negativo un poco mayor que la mitad de la altura del modelo queda clavado.Menos mal, ya estaba yo pensando en poner unas partículas para hacer que el alma fuese al cielo y así no cantase que estaban flotando  

Diciembre 13, 2015, 04:09:54 PM #7 Ultima modificación: Diciembre 13, 2015, 04:11:02 PM por Antonio
/-----/ Edit /-----/
LOL, lo has descubierto mientras escribia XD, bueno, pues nada más que contar entonces

/---------------------------------------------------/Si bueno, yo dejaría lo de las modificaciones del collider para un plan B.

Estás usando Mecanim, ¿estás seguro de que las animaciones están configuradas correctamente? (a lo mejor lo has hecho pero yo desde aquí no lo sé, y no he visto que menciones nada de ello en los posts @_@ ).  Es decir.

- Selecciona el modelo que tiene la animación de muerte. (Si no sabe cual es, abre el esquema del mecanim, busca el estado de la animación de muerte, y al seleccionar la animación del inspector, debería localizarte el modelo en la ventana del proyecto).
- Al seleccionarlo, en el inspector saldrán un porrón de opciones, y arriba 3 pestañas, Model, Rig y Animations, la de Rig supongo que ya estará en Humanoid. (Como el modelo que las ejecuta y todas las animaciones), y en Animations, verás que hay varias más, entre ellas está la de Root Transform Position (Y).
- Se ejecutas la animación en la ventana inferior, verás como se comporta en el terreno, si ves que el enemigo se hunde en el suelo al reproducir la animación, en el juego con su collider puede pasar, que el enemigo le de por flotar como te pasa a tí, (puede que eso ocurra por más razones, pero esta es una de las posibles), para ello, hay que probar a cambiar las configuraciones, por lo general me vale activando la "Bake Into Pose" (del position Y), eso hará que el transform no se mueva arriba/abajo durante esa animación, haciendo que el esqueleto baje en su lugar, es decir, haría que el enemigo cayese al suelo completamente.
- Aún así, ya dependiendo de cómo haya sido realizada la animación, puede que funcione bien o no, para ello tienes la opción "Based Upon" que puede estar en "Center of Mass", "Feets" o "Origina" que es la que coge la información directamente de la animación. Si la animación se ha hecho bien, Original debería ser la ideal, si no, pues prueba con Feets (versión rápida) o Center of Mass que tendrías que aplicarle un Offset (para decirle que el suelo está a -1.03 unidades de altura contando desde ese punto o tal).
- Al terminar, y ver que la animación se reproduce correctamente en ese preview, dale a "Apply" y prueba el jeugo, si era eso, pues el problema ya debería estar solucionado. O.ò


Recuerdo, eso es Mecanim pero usando el Rig Humanoid, (los modelos por defectos al importarlos, se ponen con el Rig Generic, por lo que si no lo has tocado, podría ser, recuerda que tienes que cambiar a Humanoid el modelo que las ejecuta y las animaciones.

/---------------------------------/

Si optas por seguir con el asunto de cambiar la colisión del collider, puedes hacerlo, programando, y ayudándote de una curva para conseguir el momento exacto en que decrementar la altura.

Para ello, selecciona la animación de muerte y sus atributos de animación (igual que antes), debajo verá la opción de Curves, crea una nueva, ponle el nombre que veas (por ejemplo, ColliderHeight) pero recuerda que ese nombre, tendrás que repetirlo después varias veces. De momento, una vez tengas creado la curva, ponle los valores, por ejemplo, que empiece en 1, o la altura a la que esté puesta tu collider, y cuando veas que la animación empieza a caer, le creas otro key frame (al 1) y cuando veas que el enemigo ha terminado de caer, le pones otro keyframe con la altura final (¿al 0.1?),  después de eso, le das a Apply para aplicar los cambios (si no te gusta siempre puedes cambiar la curva o quitarla, no es algo irreversible).

Lo siguiente es ir al panel de Mecanim y crear un nuevo atributo, tipo float que tenga el mismo nombre que el que pusiste en la curva (¿ColliderHeight?), ponle el valor inicial y déjalo ahí, la curva será quien modifique su contenido cuando sea necesario.

Finalmente saltamos al código donde has programado al enemigo, cuando muere, tendrás que crear otro apartado en la función Update (el achicamiento del collider tiene que hacerse durante varios ciclos, como dura la animación, no se puede hacer en 1) así que crea esa nueva región en el update que se active al morir, en esta región es donde tendrás que cambiar la altura del collider (eso quiere decir que tendrás que coger también el componente del Capsulecollider que es que tiene las variables de height y center del collider), luego, dentro del update también tendrás que coger el valor de la curva (accediendo al animator y usar la función "GetFloat.ColliderHeight" (o como hayas llamado a la curva). Una vez lo tengas todo recolectado, pues ya haces los cambior pertinentes, que sería multiplicar la altura por ese ColliderHeight (así, si está de pié, suponiendo que la altura sea 2 ->   2 x 1 = 2, si está muerto en el suelo, 2 x 0.1 = 0.2. También tendrás que cambiar el radio, (la altura no puede ser menor que el radio, si lo intenta ,se quedará con el valor del radio como mínimo).

Cuando terminé de morir, entonces ya puedes dejar la función update y pasar a algún estado más económico, si lo deseas.

Efectivamente la animación está en Humanoid, ya venian asi, aunque en algún otro modelo, mas antiguo, si que las he tenido que arreglar ya que estaban con el Mecanim pero al importarlo me marcaba las animaciones como legacy. Finalmente lo hice aplicando la opcion BaseUpon a Center of mass y ajustando el offset.De todas formas miraré tranquilamente lo de la curva, mas que nada por conocer otra forma de hacerlo.Gracias por la explicación.Un saludo,Fernando.

Etiquetas: