Noticias

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

Collider Character no puede subir Escalones ni obstaculos pequeños

Iniciado por ftejada, Agosto 19, 2017, 11:03:55 AM

Tema anterior - Siguiente tema
Hola gente!!! estoy teniendo problemas para poder conseguir que mi character pueda subir obstaculos pequeños, (estilo escalones donde una de las superficies es totalmente vertical), sin tener que llenar todo el escenario de miles de planos invisibles que hagan de "pequeñas cuestas" para que el CapsuleCollider de mi character lo deje subir por esos pequeños obstaculos.
 
La otra opcion que he visto es poner el collider (en este caso un capsuleCollider) con un radio mas grande, pero entonces el character no puede acercarse mucho a ningun objeto de la escena porque el collider con ese radio mas grande se lo impide.
 
 
 
He probado a poner un collider en cada pie, ajustandolo en tamaño, posicion y rotacion, para que cubran de la mejor manera cada pie del Character sin sobresalir, he quitado el capsuleCollider y le dado al play. Pero esto no soluciona el problema... es más, lo agrava ya que con este "diseño" no es capaz de subir ni el mas minimo escalon por chico que sea este. Dejo video para que veais a lo que me refiero.
 
Tambien he probado algunas cosillas más pero no consigo solucionarlo..
 
¿De qué manera se puede hacer esto adecuadamente? Lo ideal para mi y lo que quiero hacer es que el character no llevase el capsuleCollider  que suelen llevar, sino que llevase un collider en cada pie. Pero como he dicho antes, de esta manera parece que el problemas es peor. ¿Exite alguna manera de poder hacer esto? ¿Y de qué manera se puede hacer con el CapsuleCollider normal?
 
https://youtu.be/1G69BgHwwoU
 
 
 
Saludos y gracias por adelantado.

Respuesta corta: los rigidbodies no se usan para personajes, salvo que tu "personaje" sea una bola en esos juegos de fisicas.
 
Respuesta larga: , podrias usarlos? si, yo los use toda la vida, pero terminas haciendo malabares mientras que con un charactercontroller lo conseguis lo mismo en 7 lineas de codigo. Los rigidbodies no se usan para personajes prinicipalmente por la falta de control y por ende prediccion, en este caso se te rompio todo el sistema por un *** escalon, tenes que modificar otras cosas que antes andaban bien por el maldito escalon, quizas hasta tengas que cambiar el como lo movias (vel cte, aceletacion cte, etc) solo por el escalon. quizas llegaste a un punto de equilibrio, luego tenes otro escalon distinto y no funciona, a cambiar todo de vuelta, quizas tenes que poner rampas en los cientos de escalones de tu escena, y asi y asi. Si todavia no te convencí, la mayoria de los juegos que ves no usan rigidbodies (tengo mucha GDC y entrevistas leidas ), usan un characterCOntroller que no es mas que un objeto comun (una malla sola, sin necesidad de un collider para el movimiento) que va detectando por raycast los objetos de alrededor y determinando donde "deberia" estar la malla, aca no hay rigidbodies ni fisicas de por medio. En 2D tambien se usa y mucho.
 
Seguro vas a escuchar que el rigidbody se comporta de forma real, vs a un character controller, no importa, vos elegis el movimiento de manera deterministica. Usa lerps, fabrica tu propia gravedad, setea la altura maxima de los escalones, la pendiente maxima de la rampa y listo, tenes un personaje totalmente funcional para cualquier tipo de juego que quieras hacer.
 
 

Gracias por contestar @lightbug. Me di cuenta de que publiqué este post en "Interface" en vez de en "Scripting"... Me pegao un rato buscandolo pq no lo encontraba jajaja.
 
Dicho esto. Voy a mirar como programar un buen CharacterController. Empezaré por estudiar como está hecho el del "FirstPersonCharacter" de Unity, pero... me recomendais alguna información, manual o lo que sea para poder hacerlo lo más real y mejor posible?. Teniendo en cuenta que necesitaré modificaciones de IK en las animaciones (Aunque no creo que esto sea incompatible con un CharacterController).
 
 
 
Saludos.

Cita de: ftejada date=1503214738me recomendais alguna información, manual o lo que sea para poder hacerlo lo más real y mejor posible?. Teniendo en cuenta que necesitaré modificaciones de IK en las animaciones (Aunque no creo que esto sea incompatible con un CharacterController).
   


Nunca use ni conozco bien las IK, pero me suenan a que son parte puramente de la animacion y no del movimiento.
 
Mas alla de todo, lo primero que te diria que hagas con el personaje (y con cualquiera) es tener el charactercontroller con una capsula (o algo solido a modo de visualizarlo nada mas) y probar sin nada "real" que se mueva correctamente por los lugares que deseeas. Una vez pases esto podes agregar la parte "real", por ejemplo acelerar el arranque, la parada es tipico. Aca podes meter e ingeniartelas para lo que a vos te parezca que no es real, acordate que ahora todo lo seteas vos mediante un vector de movimiento. El ABC del charactercontroller es la funcion Move: https://docs.unity3d.com/ScriptReference/CharacterController.Move.html . Una vez este listo esto te pasas a la parte de animacion y visuales del personaje, pero la parte mas dificil ya la hiciste y tenes certeza de que todo va a funcionar bien.
 
Siempre usa una Move por cuadro, el caso tipico seria hacer algo asi (sacado del mio un FPS + gravedad):
 

//UPDATE
//m.controller es el CC
// Horizontal y Vertical son Vector3
if (m_controller.isGrounded)
{
//le pongo un valor y no la suma cuadro a cuadro para que se pegue algo al suelo ante bajada de rampas
m_vertical = 2 * Physics.gravity * Time.unscaledDeltaTime;
 
if (Input.GetButtonDown("Jump"))
   m_vertical = Vector3.up * m_jumpFactor;
 
} else {   
   //Choque de la cabeza con el techo
   Vector3 headTip = transform.position + Vector3.up * m_controller.height;
   if (Physics.Linecast(headTip, headTip + Vector3.up * 0.2f))
   {
      if (m_vertical.y > 0)
         m_vertical = Vector3.zero;
   }
   //gravedad afectando al movimiento vertical
   m_vertical += Physics.gravity * Time.unscaledDeltaTime;
      
}
 
m_moveVector = (transform.forward * Input.GetAxisRaw ("Vertical") +
      transform.right * Input.GetAxisRaw ("Horizontal"))
      * m_walkSpeed * Time.unscaledDeltaTime;
 
//Funcion MOVE
m_controller.Move(m_moveVector + (m_vertical * Time.unscaledDeltaTime));

 
Fijate que vos vas modificando tus vectores y solo al final se lo pasas a Move, no se si el codigo estara bien bien porque destripe mucho (habia un jetpack dando vueltas jaja) igual es para darte una idea del Move. Para hacerlo real podes hacer un Lerp de velocidad:
 

//arranque
if(input-> alguna tecla de mov)
speed = Mathf.Lerp(speed , m_walkSpeed , factorT * TIme.unscaledDeltaTime);
//parada
if(input-> ninguna tecla de mov)
speed = Mathf.Lerp(speed , 0 , factorT * TIme.unscaledDeltaTime);

 
 

Agosto 21, 2017, 12:47:28 AM #4 Ultima modificación: Agosto 21, 2017, 12:51:47 AM por J_L
Échale un vistazo a esto, creo que te puede servir y ayudar:
 
 
 
Este video tiene 4 partes
 


   
eature=oembed" width="480">

 
 
 
 
 


   
eature=oembed" width="480">

 
 

Cita de: ftejada date=1503214738Gracias por contestar @lightbug. Me di cuenta de que publiqué este post en "Interface" en vez de en "Scripting"... Me pegao un rato buscandolo pq no lo encontraba jajaja.
   
   
      Dicho esto. Voy a mirar como programar un buen CharacterController. Empezaré por estudiar como está hecho el del "FirstPersonCharacter" de Unity, pero... me recomendais alguna información, manual o lo que sea para poder hacerlo lo más real y mejor posible?. Teniendo en cuenta que necesitaré modificaciones de IK en las animaciones (Aunque no creo que esto sea incompatible con un CharacterController).
   
   
       
   
   
      Saludos.
   


Negativo compañero, utilizo IK en mi character controller y son perfectamente compatibles. Sobre lo de hacerlo real no puedo ayudarte mucho, yo consigo realismo con ragdoll, IK en manos y pies y luego añadir funciones como cuando te acerques a una pared, haciendo uso de las ik, pones las manos en la pared... Échale imaginación.

Gracias por las respuestas. Voy a seguir indagando estas semanas, a ver que soy capaz de hacer.  @lightbug ¿Por qué multiplicas por el Time.unscaledDeltaTime en vez por el Time.DeltaTime? ¿Es mejor para la fisica?
 
 
 
Saludos

Cita de: ftejada date=1503342901¿Por qué multiplicas por el Time.unscaledDeltaTime en vez por el Time.DeltaTime?
   


Porque mi juego tiene slowMotion  todo lo que no sea Player tiene (mejor dicho tenía) deltaTime, pero como el player se mueve en su propia linea temporal le puse unscaledDeltaTime. Aunque ahora tengo un sistemita de multiples lineas temporales que se actualizan mediante un simple Update entonces puedo usar no solo "la unscaled vs la scaled", sino las que quiera, incluso si pauso el juego todas se ven afectadas.

Etiquetas: