Jump to content
UnitySpain
Centauro5legs

Ayuda con Script de Movimiento a través de animaciones.

Recommended Posts

Bien, esto es complicado de explicar, así que me tomare mi tiempo: Como ya saben, y si no saben yo les explico, en Unity 3D hay dos modos de hacer Scripts de Movimiento, el primero es moviemto a tu personaje con un Script, y usar animaciones en la que el personaje se encuentra caminando sobre su mismo sitio, sin desplazarse realmente, y el segundo es usar animaciones en las que el personaje se despasa de su punto de origen, y dejar que sean las animaciones las que muevan al personajes, y vía script solo controlamos en AnimatorControler. Mi proyecto es de este segundo tipo.

En general el proyecto funciona correctamente, el problema yace en que mi personaje principal esta formado por varias partes; estas serian "Cuerpo, Casco, Peto, Calzas, Botas, Guantes, Cinturón, Armas y Extras". Todas con el mismo esqueleto, y todas compartiendo las mismas animaciones. Esto lo hago de este modo, porque el personaje tiene la capacidad de cambiar su equipamiento.

El problema es que, si a todas estas partes les pongo un CharacterController, al mover al personaje, los CharacterControllers se empujan entre si, y todo se me desacomoda, y si solo le pongo un CharacterControler a uno de ellos, cuando este colisiona con algo, todos los demás siguen su camino y el personaje se me desacomoda. Además de que por la estructura del juego, me resulta mas fácil que todas las piezas se encuentren dentro de un mismo GameObject, que sea el que lo mueva todo, pero de ser así, los "hijos" se moverán gracias a sus animaciones, mientras que el padre se quedara en su sitio, sin poder detectar colisiones. 

La solución a este problema, fue colocar todas las piezas dentro de un GameObject, y a ese GameObject añadirle el CharacterController y con el siguiente código corregir la posición;

private void CorrecionDeTransformaciones()
    {
        transform.position = transform.GetChild(0).transform.position;
        transform.rotation = transform.GetChild(0).transform.rotation;
        transform.localScale = transform.GetChild(0).transform.localScale;

        for (int i = 0; i < transform.childCount; i++)
        {
            transform.GetChild(i).localPosition = Vector3.zero;
            transform.GetChild(i).localRotation = Quaternion.identity;
            transform.GetChild(i).localScale = Vector3.one; 
        }
    }

Como ven, la solución fue sencillamente igualar la posición, rotación y escala del Padre al de el primero de los hijos, y después devolver la posición, rotación y escala de todos los hijos, a "ceros". Y hasta cierto punto funciona bien. El problema es que cuando el personaje se topa con una pared, empieza a vibrar muy bruscamente. Me imagino que lo que pasa, es que el CharacterControler devuelve al personaje a su posición anterior, y luego mi script lo hace avanzar. 

La función anteriormente mostrada la ejecuto en un "LateUpdate()", pero me imagino que para que este código funcione correctamente, sin "convulsiones", es necesario que se ejecute justo después de las colisiones del "CharacterControler". ¿Alguien sabe como corregir este problema?, ¿En que evento llamar mi función? o ¿Cómo adaptar mi código?

 

De antemano, gracias por leer.....

Share this post


Link to post
Share on other sites
On 8/9/2019 at 10:43 PM, Centauro5legs said:

el segundo es usar animaciones en las que el personaje se despasa de su punto de origen, y dejar que sean las animaciones las que muevan al personajes, y vía script solo controlamos en AnimatorControler.

Mmm depende, por personaje uno entendería a la típica cápsula (en 3D) visible solo en la escena, invisible en el juego, este sería tu character controller. Por supuesto podés mover algo mediante una animación, el problema con esto es que un character controller no puede ser usado mediante modificación de Transform (o animación), la única manera de aprovechar al CC es usando la función "Move" y esto solamente se puede realizar por código. Por lo que no se que tan válido sea este tipo de "movimiento" ni que tanto estás usando al CC, ya que me imagino que lñas animaciones están haceindo de cinemáticas, en lugar del gameplay típico, es así?.

 

On 8/9/2019 at 10:43 PM, Centauro5legs said:

El problema es que, si a todas estas partes les pongo un CharacterController,

Colliders o Character controllers? Si es CC eso estaría mal, el personaje es una unica entidad, el character controller representa la colisión de cuerpo completo entre este y (por lo general) el nivel (meshes estáticos, dinámicos, triggers) u otras entidades similares (por ej NPCs ), no tiene nada que ver con las colisiones que puede llegar a haber entre distintas partes del cuerpo (Por ej una bala que colisiona con el antebrazo derecho), esto ya sería secundario al CC. En resumen deberías usar un solo character controller que cubra todo el cuerpo, y aplicarle el movimiento a este (de la forma que sea).
 

On 8/9/2019 at 10:43 PM, Centauro5legs said:

¿Alguien sabe como corregir este problema?, ¿En que evento llamar mi función? o ¿Cómo adaptar mi código?

De antemano, gracias por leer.....

No me termina de cerrar el caso, osea, no lo puedo visualizar, podrías subir algun gif o video mostrando la situación. En resumen te diría que regla básica es 1 CC + animaciones aparte (como describiste al comienzo, el método 1 es como se suele utilizar). El temblequeo se puede estar dando por no usar Move y modificar transforms directamente, no lo se.

 

Saludos.

Share this post


Link to post
Share on other sites

×
×
  • Create New...