Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Colliders modelo animado fbx Unity

Iniciado por Manuns, 12 de Noviembre de 2016, 05:18:18 AM

« anterior - próximo »

Manuns

Buenas!
No estoy muy seguro de donde debe ir este tema, pero al final va la cosa de programación así que lo he colado aquí, si está mal disculpadme, soy novato y he buscado un rato, pero no he encontrado nada más apropiado.

Al tema... llevo un tiempo desarrollando un pequeño proyecto en Unity 3d, en el cual he utilizado assets gratuitos, ya que solo sé programar, y cuando le he dado cierto encuadre, he querido meter un sistema de combate cuerpo a cuerpo.

Para aclarar, mi intención es hacer un juego del estilo hack n slash, tomando como fuente Bayonetta ( obviamente estoy solo, todo es muy cutre, y soy novato, no osaría compararme, pero es para que se me entienda lo que quiero "conseguir"). El tema es que importé un modelo fbx de mixamo.com, que los hay gratuitos y me sacan del paso con sus animaciones y tal.... el problema viene a la hora de por ejemplo dar una patada, supongo que lo óptimo sería que tuviera un collider en la pierna, que al choque con un "enemigo", hiciese algo (daño, por poner)....

El tema es que buscando, buscando y buscando no he encontrado nada que me sirva, alguien tiene alguna idea?
Muchas gracias por adelantado!

P.S Lo siento si no es el foro correcto

TrOnTxU

#1
Para poner un collider como tu dices bastaria que con que lo añadieras a la jerarquia animada, lo marcaras como trigger, y luego le pongas la propiedad de "animate physics" a la animacion.

Pero no te lo recomiendo. porque si se mueve con la transformacion, seguramente puedas tener conflictos entre la interpolacion de la animacion, y el "fixed rate" de actualizacion de las fisicas. (vamos que pase de largo la detección de colision y salte ningun trigger). Esto tambien se puede solucionar con "sweep", pero la verdad es que Unity (a mi entender) tampoco es que controle magninficamente este tipo de cosas, así que si no hay nada que se pueda hacer en el Animator (que tampoco he tocado mucho) te recomendaria que no añadieras nada a la jerarquia movil.

Para estas cosas se suele utilizar un cast de una esfera por ejemplo (https://docs.unity3d.com/ScriptReference/Physics.SphereCast.html), para "sincronizar" el componente scriptado (Behaviour) con la animación te valdria con exponer propiedades del componente y animarlas, o contar tu mismo los frames en el script.
Y para colocar el shape tendrias que resolver la transformación relativa (LocalToWorld) en el transform que elijas (como te he dicho para mi es mejor elegir el "root" y aplicarle una transformacion relativa).
Utiliza la ventaja del dibujado de gizmos si quieres previsualizar la posicion del shape que vas a castear.

Un saludo.

EDIT: Creo que habia un tutorial bastante antiguo de Unity (de la version 3.1 si no recuerdo mal), con una demo de un "intento" de clon del Ratchet&Clank, que utlizaba esto mismo para detectar la colision del ataque de un puñetazo.
Vicent: Linked-In  ***  ¡¡Ya tengo blog!!

Manuns

Gracias por la respuesta, parece que sí, que como dices funciona incluso mejor que como lo planteaba yo, me has sacado de un bache importante, muchas gracias!

Aún así, ahora mismo estoy con el cuerpo a cuerpo, pongamos que le pongo un arma(espada, lanza, lo que sea),  y quiero que el choque se produzca en el area de acción de la misma, ahí... si debería quizas poner algún collider, o hay alguna manera de emitir un campo mas ancho? Realmente una esfera se me saldría de contexto, sería mas plano, y un rayo se me queda corto... he visto que existe tambien BoxCast o algo así, podría ser una solución, no?

De nuevo, muchas gracias y perdona mi insistencia, soy un tanto ... nuevo

TrOnTxU

Perdón por contestar tan tarde, pero es que voy bastante liado.

Yo sigo sin ver lo de los "colliders", porque los tienes que marcar como trigger, y a no ser que haya cambiado el Physix, en un principio los triggers en movimiento no garantizan que salte el callback. Y sino los marcas colisionarán de verdad y no creo que tengas los resultados esperados (además de que deberás animar las fisicas por la animación, que es marcar un checkbox, pero que incrementa, como es lógico, el consumo de CPU, por diversas razones que paso de explicar para no enrollarme más).

En el apartado de de métodos estáticos de la clase Physics ( https://docs.unity3d.com/ScriptReference/Physics.html ) tienes una serie de funciones que te permiten detectar que colliders se encuentran dentro de un shape determinado (Box, Sphere, Capsule, Ray o Line).

Puedes utilizar cualquier shape, dependiendo del uso que le quieras dar (lo de la esfera era solo una sugerencia).

Tambien puedes ver los tipos de comprobaciones: "Check" (solo para elementos dentro de el shape en un momento determinado) o "Cast" (para hacer "sweep", esto significa comprobar un shape en movimiento).

Puedes utilizar uno u otro dependiendo de lo que quieras hacer, pero para esto yo recomiendo un check simple (que es un poco más barato de procesar).
Tambien es muy aconsejable "publicar" las variables de posicion y dimensiones del shape en el componente que estes scriptando, y a la vez utilizar las previsualizaciones de Gizmos como https://docs.unity3d.com/ScriptReference/Gizmos.DrawSphere.html o https://docs.unity3d.com/ScriptReference/Gizmos.DrawCube.html para poder visualizar donde estaria exactamente el shape de colision (recuerda que esto solo se muestra en la pestaña de "Scene" y nunca en "Game"), mientras modificas estos valores desde el "Inspector".

Como decia en mi anterior post, es importante la sincronización de la animación con las "ventanas" de golpe, recuperación, etc. De manera que solo en momentos determinados de la animación se realicen este tipos de comprobaciones.
Una descripción muy buena es la que hay en este articulo de Sony Santa Monica sobre el God Of War http://www.gamasutra.com/view/news/108166/Combat_Canceled_God_of_War__Action_Game_Design.php
Aunque ellos utilizan un "script propio" que luego se "compila" a datos, siempre puedes hacer algo muy parecido con script o incluso un herramienta utilizando las ventajas de extension del Editor de Unity3D (que es muy sencillo y rapido de utilizar).
Supongo que igual también se puede hacer algo de esto desde "Animator", pero como dije en mi último post, no controlo mucho de esto, ya que es más nuevo, y yo utilicé Unity3D (para juegos comerciales) en versiones bastante anteriores de hace unos cuantos años.

Espero haberte solventado las dudas.
Un saludo.
Vicent: Linked-In  ***  ¡¡Ya tengo blog!!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.