Noticias

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

Character Controller - Evitar que el collider del CC (Esfera) suba encima de otros pequeños.

Iniciado por ArkFantasy, Enero 01, 2018, 05:27:31 AM

Tema anterior - Siguiente tema
Ante todo Feliz año a todos y todas :)
 
Estoy haciendo un proyecto (juego estilo FPS) para un curso de Desarrollo de videojuegos, haciendo uso de C# y Unity, y estoy teniendo un problema que no sé cómo resolver de forma efectiva sin estropear otra  cosa...
 
Problema relacionado con: Character Controller y su Collider
 
Mi problema es que mi CharacterController tiende a subirse encima de otros objetos con Collider que son más bajos que él, el Collider de mi CharacterController es como una esfera por necesidad de separarlo de las paredes, pero al colisionar con objetos bajos o insistir en algunos de altura media, tiende a subirse encima....y quedarse flotando en esa altura o no volver a bajar del todo.
 
¿Se os ocurre qué puede ser? He probado de todo un poco pero nada, no puedo ponerle Collider "Box" también, no son los grados que tiene para controlar qué cosas puede subir o no, y he leído por el foro algo de ponerle un material físico, pero se supone que el Collider por defecto del CharacterController no puede añadírsele un material físico.
 
Cuando paso por encima de un pastel/tarta que puse en el suelo con un Box Collider, la esfera sube al pasar entre él y una pared, o si insisto en una esquina del Box Collider, lo mismo me pasa con unos enemigos con NavMesh/NavAgent y una Cápsula o Box que también probé, o se sube encima, o se hunde en el suelo tras insistir frente a varios enemigos bajitos con Cápsula o Box (en este caso hasta se hunde en el suelo), si me quedo parado además los enemigos (si van en masa hacia mi y me quedo quieto), se meten dentro de mi, aunque al moverme me "transporta" al borde del Collider del más lejano o algo así creo ver.
 
 
 
Os pongo GIF de ejemplos a ver si podéis aconsejarme algo, es urgente pero haced lo que podáis :( , gracias.
 
También os dejo cómo muevo al CharacterController (SimpleMove) y cómo lo movía antes (Move).
 
Usé SimpleMove porque vi que hacía uso de gravedad para que el personaje volviera al suelo al menos, que lo hace como deslizándose y normalmente invirtiendo los controles de delante y atrás (W y S) mientras la gravedad lo lleva al suelo como en los GIF, con Move haría lo mismo pero no bajaría, mantendría la altura de cuando sube a algo y podría moverme como si estuviera en el suelo, no perdía el control ni se invertía en ningún momento.
 

public float speed = 5.0f;
    CharacterController controller;
    private Vector3 moveDirection;
    void Start () {
        controller = GetComponent<CharacterController>();
    }

void Update () {
//Asi movía antes con MOVE
        moveDirection = new Vector3(Input.GetAxis("Horizontal"), , Input.GetAxis("Vertical"));
        moveDirection = transform.TransformDirection(moveDirection.normalized) * speed;
        controller.SimpleMove(moveDirection * Time.deltaTime);
        Vector3 forward = transform.TransformDirection(Vector3.forward);
        float curSpeed = speed * Input.GetAxis("Vertical");
        controller.SimpleMove(forward * curSpeed);
//Así muevo ahora con SIMPLEMOVE
        Vector3 forward = transform.TransformDirection(Vector3.forward);
        Vector3 left = transform.TransformDirection(Vector3.left);
        float ForSpeed = speed * Input.GetAxis("Vertical");
        float LeftSpeed = speed * -Input.GetAxis("Horizontal");
        if (Input.GetAxis("Vertical") > || Input.GetAxis("Vertical") < )
        {
            controller.SimpleMove(forward * ForSpeed);
             }
        if (Input.GetAxis("Horizontal") > || Input.GetAxis("Horizontal") < )
        {
            controller.SimpleMove(left * LeftSpeed);
             }

 
GIFs del problema:
 
Link al GIF1 (CloudApp, es un servicio en la nube)
 
Link al GIF2 (CloudApp, es un servicio en la nube)
 
Quiero dejar algunos datos más de algunas de las pruebas, si no me equivoco ahora mismo cuando uso un Box Collider en el jugador (dejando el del CharacterController dentro para no usarlo), no tengo ese problema, es la esfera la que se sube en las cosas si no me equivoco, tanto si no hay espacio entre los dos objetos, o si insisto en esquinas y tal del mismo.
 
He dejado los parámetros del CharacterController a 0 (movimiento mínimo, ángulo que sube, skin, etc...) y en esos casos, subiendo además el box collider de altura (sin tocar el suelo) del objeto que sube, en este caso la tarta, evita en parte problemas pero siguen pasando las dos cosas, sigue flotando y perdiendo el control en el aire cuando choca entre pared y tarta a veces, y si insisto contra esquinas de la tarta se sube igualmente encima.
 
He probado más cosas, pero no me interesa poner Box Collider a todo, o usar Rigidbody a la vez que el CharacterController, ya que el profesor no lo vería bien (como usar NavMesh y Character Controller a la vez), y tampoco uso físicas en nada en el juego, solo enemigos con Capsule Collider (o Box en pruebas), y con Colliders en manos o partes que me golpean (donde tiende a subirse también a los mini Collider enemigos al pegarme y andar hacia ellos aunque al enemigo no subiera teniendo por ejemplo una Box Collider si no me atacara). En fin, que al final acaba subiendo a todo y no sé qué hacer con el jugador :(
 
Link al GIF3

El problema es que Charactercontroller no maneja la gravedad no es un cuerpo con físicas.
 
Para añadir fisica al character controller te recomiendo utilizar un vector donde contengan las velocidades del objeto.
 

private Vector3 _motion;
private void Update()
{
Vector3 axis = //////
if(characterC.isGround)
{
   axis.Normalize();
   _motion = axis;
   _motion *= 10; << o variable de velocidad
   if(Input.GetButton("Jump"))
      _motion.y = 10;
}
_motion.y -= 50 * Time.deltaTime; // Aca le aplicas las fisicas para que el objeto vuelva al suelo --
characterC.Move(_motion * Time.deltaTime);
}

 
Por otro lado, deberias de omitir tener un collider tan grande, deberias de pensar en limitar los movimientos con otra alternativa.

Cita de: francoe1 date=1514787711El problema es que Charactercontroller no maneja la gravedad no es un cuerpo con físicas.
   
   
      Para añadir fisica al character controller te recomiendo utilizar un vector donde contengan las velocidades del objeto.
   
   

private Vector3 _motion;
private void Update()
{
Vector3 axis = //////
if(characterC.isGround)
{
   axis.Normalize();
   _motion = axis;
   _motion *= 10; << o variable de velocidad
   if(Input.GetButton("Jump"))
      _motion.y = 10;
}
_motion.y -= 50 * Time.deltaTime; // Aca le aplicas las fisicas para que el objeto vuelva al suelo --
characterC.Move(_motion * Time.deltaTime);
}

   
      Por otro lado, deberias de omitir tener un collider tan grande, deberias de pensar en limitar los movimientos con otra alternativa.
   


¿En ese caso no es mejor usar el Rigidbody para moverme sin más?¿O eso ya implicaría problemas como que empujaría enemigos y tal?
 
El tema del collider es una de las soluciones del profesor a la pared, ya que al mirar hacia abajo se inclina todo el cuerpo y atraviesa mucho las paredes y se ve detrás, etc.
 
En clase solo llegamos a hacer 2 cámaras con capas para poner el arma en una cámara a parte para que no atraviese paredes, pero no evitaría el problema, y el personaje no tiene el Mesh "trozeado" para poder desactivar la cabeza y poner la cámara más atrás, si la cabeza la "giro" para hundirla en el cuerpo en la sombra no tendría cabeza aunque así podía alejar la cámara y lo solucionaba...
 
Antes estaba usando NavMesh para poner una separación a las paredes, pero me dijo que no debería usar CharacterController+NavAgent en el personaje a la vez...y quité ya no tiene Nav, así que la única opción que quedaba y dio era la del Collider del CC grande.
 
Ahora mismo el personaje vuelve al suelo pero como deslizándose poco a poco, al usar "SimpleMove" en vez de Move, probaré este script a ver, ya había hecho pruebas parecidas pero aquí aplicas más cosas, ¡gracias :)!

Puedes verificar las colisiones de la cámara con un Sphere collider tomar los point para evitar que el jugador traspase las paredes, podrias hacer uso de IK para que se vea bien-
 
Para el problema de la malla de la cabeza, lo que yo hago es poner el Mesh de la cabeza o en su defecto de todo el modelo en un layer donde la camara no la renderize, de esta manera puede localizar la camara mejor -
 
Otra opción es utilizar la ubicación del Hueso de la cabeza y realizar un offset para que esta se mueva junto a la cabeza, pero esto hace que la rotación y los movimientos de la animación afecten la camara, pero con un smoth se puede lograr un buen resultado.
 
Por último, deduzco que el jugador solo se puede inclinar para adelante, por lo que podrias lanzar un RayCast en dirección forward con la distancia mínima permitida según el grado de inclinación y si este colisiona entonces no podrias seguir inclinándose, y no obstante se corregiría tu inclinación segun la información de hit. 

Cita de: francoe1 date=1514834536Puedes verificar las colisiones de la cámara con un Sphere collider tomar los point para evitar que el jugador traspase las paredes, podrias hacer uso de IK para que se vea bien-
   
   
      Para el problema de la malla de la cabeza, lo que yo hago es poner el Mesh de la cabeza o en su defecto de todo el modelo en un layer donde la camara no la renderize, de esta manera puede localizar la camara mejor -
   
   
      Otra opción es utilizar la ubicación del Hueso de la cabeza y realizar un offset para que esta se mueva junto a la cabeza, pero esto hace que la rotación y los movimientos de la animación afecten la camara, pero con un smoth se puede lograr un buen resultado.
   
   
      Por último, deduzco que el jugador solo se puede inclinar para adelante, por lo que podrias lanzar un RayCast en dirección forward con la distancia mínima permitida según el grado de inclinación y si este colisiona entonces no podrias seguir inclinándose, y no obstante se corregiría tu inclinación segun la información de hit. 
   


Uff soy bastante novato para entenderte todo bien.
 
El tema de la cabeza es que es un Mesh completo, no puedo desactivar solo la cabeza (y aún así perdería la sombra), animaciones no uso, el juego es en primera persona y de momento tiene poco más que mover el dedo al pulsar el gatillo del arma.
 
Sobre inclinar al jugador, se inclina hacia abajo y hacia arriba (en este caso no hay problema), es decir, roto la "columna" del modelo 3D y la cámara se mueve al estar dentro de la cabeza (no se ve por el Near de la cámara), por eso atraviesa la pared la cámara al inclinarse arriba/abajo si no lo separo de la pared.
 
Ahora mismo no me importaría usar el Collider del Character Controller si no fuera porque se sube a las cosas como en los GIF, no meteremos ya animaciones ni tengo otros Collider a parte de el del Character Controller, lo de "IK" no sé si te refieres a Inverse Kinematics (es lo que encuentro buscándolo, no hemos visto nada de eso).
 
 
 
Sobre usar un Raycast para "limitar" la rotación hacia abajo quizás sí que pueda hacerlo, distinguiendo en mi caso la capa (layer) de las paredes que la llamo "Wall", para que no atraviese las paredes impidiendo que apunte más abajo si estoy pegado...así quizás pueda quitar el Collider tan grande que uso (el del Character Controller por defecto que es el radio que deja modificar). Si consigo hacerlo funcionar con la información del Hit cuando es una pared quizás sea la mejor opción :), ya que con los enemigos no me preocupa tanto o tendrán un collider más grande y evitaría atravesarles con la cámara.
 
 
 
Gracias voy a probar con esto y probar el script de antes para intentar mantenerlo en el suelo :), y si no haciendo uso del Raycast par las paredes puedo reducir el Collider a ver si no se sube tan fácil en las cosas con SimpleMove (que aplica gravedad por lo que veo) o lo que me dices arriba para la gravedad y usando Move.

 
 
Cita de: ArkFantasy date=1514780851Mi problema es que mi CharacterController tiende a subirse encima de otros objetos con Collider que son más bajos que él, el Collider de mi CharacterController es como una esfera por necesidad de separarlo de las paredes, pero al colisionar con objetos bajos o insistir en algunos de altura media, tiende a subirse encima....y quedarse flotando en esa altura o no volver a bajar del todo.
   


Hola, segun ese personaje le pondria a ojo un radio 0.25, altura 1. Por esta razon en el gif2 se queda flotando, en realidad no es un problema de gravedad sino que tenés una esfera grande de CC. y eso lleva al problema de la inclinación.
 
 
 
EL tema de la inclinación lo solucionás siempre confinando la camara dentro del CC, o por lo menos es una forma "segura" de hacerlo, lo del raycast también es una opción, buscás la distancia del ray y si es menor a X evitás que se incline. De la forma segura, si la cámara está en la cabeza del modelo, el modelo deberá estar dentro del CC. Si no te cierra, parate e imitá lo que debería hacer el personaje, cuando vos mirás así abajo no inclinas tu torso, solo rotás tu cuello un 20% un 50% tu cabeza, y el resto es movimiento de los ojos, es decir que si tenés bien seteado el CC, con una cámara metida en la cabeza, con un near muy chico no deberías tener problemas si solo rotás la cabeza (siempre que hablo de rotación me refiero respecto a su hueso y no respecto a su centro). Si decidís separar camara de cabeza (lo que yo haría para dar un efecto un poco más real) podés pensarlo como que la camara y brazos rotan a la vez y la cabeza rota un 0.5 de la rotacion anterior, y te quedaría mas o menos el efecto. por lo menos si ves a un personaje (tercera persona) haciendo esto sabés que se está inclinando, y desde tu punto de vista (primera persona) ni lo notás.
 
Saludos
 
 
 
 

    

 
 

Cita de: lightbug date=1515041823Hola, segun ese personaje le pondria a ojo un radio 0.25, altura 1. Por esta razon en el gif2 se queda flotando, en realidad no es un problema de gravedad sino que tenés una esfera grande de CC. y eso lleva al problema de la inclinación.
   
   
       
   
   
      EL tema de la inclinación lo solucionás siempre confinando la camara dentro del CC, o por lo menos es una forma "segura" de hacerlo, lo del raycast también es una opción, buscás la distancia del ray y si es menor a X evitás que se incline. De la forma segura, si la cámara está en la cabeza del modelo, el modelo deberá estar dentro del CC. Si no te cierra, parate e imitá lo que debería hacer el personaje, cuando vos mirás así abajo no inclinas tu torso, solo rotás tu cuello un 20% un 50% tu cabeza, y el resto es movimiento de los ojos, es decir que si tenés bien seteado el CC, con una cámara metida en la cabeza, con un near muy chico no deberías tener problemas si solo rotás la cabeza (siempre que hablo de rotación me refiero respecto a su hueso y no respecto a su centro). Si decidís separar camara de cabeza (lo que yo haría para dar un efecto un poco más real) podés pensarlo como que la camara y brazos rotan a la vez y la cabeza rota un 0.5 de la rotacion anterior, y te quedaría mas o menos el efecto. por lo menos si ves a un personaje (tercera persona) haciendo esto sabés que se está inclinando, y desde tu punto de vista (primera persona) ni lo notás.
   
   
      Saludos
   
   
       
   
   
       
   
   
       
   
   
       
   


La cámara está en una parte del cuerpo dentro de la jerarquía del modelo que es el CC, el tema de altura y tal real era aproximadamente 1,71 y el ancho no recuerdo ahora mismo, pero al final haciendo otros ajustes (alejé la cabeza más hacia atrás y la incliné para mirar más arriba para dejar la cámara en Near al mínimo sin que se dibujara la cabeza del modelo y que en la sombra no se notara mucho, ya que el modelo lleva todo el cuerpo "pegado" y no podía usar capas con varias cámaras para quitar la cabeza.
 
Con eso ya pude luego hacer el  truco que nos enseñó el profesor en su momento de dos cámaras "fusionadas" para poner el arma (en mi caso arma y personaje) en una capa y cámara, y el resto el mundo en otra, para que no atravesara el arma y tal la pared, a su vez hice pruebas y ya con el Near y la cabeza fuera de cámara no atravesaba paredes :), de paso ya reduje al mínimo el CC Collider.
 
Cita de: francoe1 date=1514834536Puedes verificar las colisiones de la cámara con un Sphere collider tomar los point para evitar que el jugador traspase las paredes, podrias hacer uso de IK para que se vea bien-
   
   
      Para el problema de la malla de la cabeza, lo que yo hago es poner el Mesh de la cabeza o en su defecto de todo el modelo en un layer donde la camara no la renderize, de esta manera puede localizar la camara mejor -
   
   
      Otra opción es utilizar la ubicación del Hueso de la cabeza y realizar un offset para que esta se mueva junto a la cabeza, pero esto hace que la rotación y los movimientos de la animación afecten la camara, pero con un smoth se puede lograr un buen resultado.
   
   
      Por último, deduzco que el jugador solo se puede inclinar para adelante, por lo que podrias lanzar un RayCast en dirección forward con la distancia mínima permitida según el grado de inclinación y si este colisiona entonces no podrias seguir inclinándose, y no obstante se corregiría tu inclinación segun la información de hit. 
   


francoe1  Gracias por la ayuda, al final tuve que quitar el tema de pegarlo al suelo, ya que en ciertos momentos sin venir a cuento el personaje decidía que estaba en el aire, en el isGrounded, y ya no podía moverme (aunque solucione eso dejando que me moviera en el aire en tu script), pero igualmente el problema estaba con el tema del -50 para pegarlo al suelo, por algún motivo se atascaba el personaje y aparecía como estando en el aire en algunas zonas del suelo (que es un cubo gigante) cuando no había colliders ni objetos ni nada encima, es un cubo gigante escalado y tal..
 
Por otro lado al haber adaptado lo que comento arriba (Near, mover la cabeza más atrás...) ya pude reducir el Collider y no es una esfera, se seguía subiendo en objetos bajos (y no volvía a bajar al no  tener tu -50 para bajarlo), pero casualmente solo tenía una "Tarta" en una parte del nivel, que es donde podría subirse, ya no se sube a los enemigos :). Presentamos el juego y todo salió bien, aunque sigo sin saber por qué pasa lo de que se atasque y quede como en el aire y ahora se sube aún en cosas de poca altura. Ya acabé el curso pero agradezco vuestra ayuda, mi intención es seguir aunque sea como pasatiempo intentando mejorar el juego y solucionar problemas, así que gracias a ambos.

Etiquetas: