Jump to content
UnitySpain
Sign in to follow this  
banics

ANSWERED Problema con fisicas del MainCharacter

Recommended Posts

Hola, buenas a todos. Me esta ocurriendo un problema, que si bien, seguro que se resuelve rápido y es una bobada, no tengo ni idea de por que esta ocurriendo.

La cosa es la siguiente. En mi juego, el personaje principal  tiene un rigibody2D y un collider2D. El personaje salta mediante un AddForce muy sencillo, y, al principio, el movimiento lo hacia directamente (seteando transform.position). Pues bien, lo decidí cambiar seteando la velocidad del rigibody (_rigibody.velocity = new Vector3(Input.acceleration.x * _movementSpeed, _rigibody.velocity.y, 0f)). El personaje se mueve por acalerómetro (aunque en el editor lo tengo para que se pueda mover por flechas).

Pues bien. Todo va normal excepto cuando me choco con una pared lateral, en la cual el personaje se queda pegado como si fuera spiderman y no cae al suelo mientras el rigibody tenga suficiente velocidad en x.

Gracias de antemano y un saludo.

Share this post


Link to post
Share on other sites

Hola Pioj, gracias por contestar.

No hay otra manera de que nos e quede pegado al collider? Entonces tendré que tirar un raycast para comprobar colisión con muro?

Y otra cosa. El movimiento por transform va perfecto. Puede haber problemas al usar físicas y ese movimiento a la vez o es recomendable hacerlo todo por físicas?

Gracias de antemano y un saludo.

----------------------EDITO-------------------------------

Hola de nuevo, ya solucione el problema. Gracias a dios que me dio por comprar un curso de udemy por 11 euros en donde, milagrosamente, encontré la solución XD. A los colliders hay que asignarles un rigibody (en este caso 2D) y luego asignarles un physic material (en este caso 2D)en dicho rigibody, en donde puedes controlar el bote y la fricción que este provoca. En cuanto he puesto fricción a 0, el personaje ya no hace el spiderman.

Espero que le sea de ayuda a alguien, pro que buscando profundamente en internet, no logre encontrar la solución a este problema.

Un saludo.

Edited by banics

Share this post


Link to post
Share on other sites

Es mejor transform sin rigidbody y al revés. También tienes physics materials para controlarlo mejor y que sea más realista.

Share this post


Link to post
Share on other sites
5 hours ago, banics said:

Pues bien. Todo va normal excepto cuando me choco con una pared lateral, en la cual el personaje se queda pegado como si fuera spiderman y no cae al suelo mientras el rigibody tenga suficiente velocidad en x.

Solamente necesitas asignar el physics material al personaje, y me parece que si tenés más de un collider podés usar directamente el material en el rigidbody2D (no estoy seguro, me parece que por esto se creó ese campo).

Podés crearlo por código:

PhysicsMaterial2D material = new PhysicsMaterial2D();            
material.friction = friction;
material.bounciness = bounciness;
collider2D.sharedMaterial = material;

 

2 hours ago, banics said:

Y otra cosa. El movimiento por transform va perfecto. Puede haber problemas al usar físicas y ese movimiento a la vez o es recomendable hacerlo todo por físicas?

Mezclar Transform y físicas es como darle una ametralladora a un chimpancé jaja nada bueno puede salir.

Si vas a mover al personaje usando físicas podés hacerlo mediante velocidad, fuerzas, MovePosition incluso, depende del grado de realismo e interacción con el entorno, también del tipo de cuerpo que deseas mover. Usando esto el Rigidbody y el Transform se actualizan en diferentes momentos, si tenés autoSync activado cada vez que toques el Transform el Rigidbody actualiza sus datos  internos (pos, rot, etc) pero esto no es recomendado en versiones modernas, donde autoSync está desactivado por defecto. Al final de cada step de simulación el resultado del Rigidbody (pos, rot, etc) pasa al transform, haciendo un mini sync entre los dos (por esto es que visualmente se puede apreciar un objeto moviendolo con físicas).

En resumen, no deberías tocar el transform si querés un comportamiento físico correcto, es decir usando el motor de físicas (no necesariamente realista). Cada vez que el transform de modifica (segun el manual) se recalculan todos los colliders asociados al Rigidbody.

Si querés mover algo de PosA a PosB usando las físicas podés usar

position:

Si es dinámico o kinemático esto lo lleva directamente a posB. Esto no responde a interpolación.

rb.pos = posB;

MovePosition:

Si es dinámico lo lleva a posB pero reacciona a las colisiones. Si es kinemático esto lo lleva hacia posB, usando interpolación.

rb.MovePosition( posB );

Velocity:

La velocity de toda la vida, esto responde a interpolación también. Si es kinemático no pasa nada, pero si al kinemático se lo está moviendo (con otro método) podés leer su velocidad con "velocity."

rb.velocity = ( posB - posA ) / Time.fixedDeltaTime;

AddForce:

Si vas a usar fuerzas la cosa es un tanto más difícil, la jodita es agregar fuerza F para llegar a una velocidad V, pero claro la fuerza necesaria va a ir variando con el paso del tiempo, para esto necesitas darle al sistema un señal de entrada e ir modificandola basado en algún tipo de control. En la rama de control se suele usar un PID para reducir el error (vDeseada - vActual) y llegar al valor deseado (el set point, o tu referencia de entrada)... muy chulo. Acá te dejo un lindo link con una implementación básica:  PID

 

3 hours ago, banics said:

Hola de nuevo, ya solucione el problema. Gracias a dios que me dio por comprar un curso de udemy por 11 euros en donde, milaghrosamente, encontré la solución XD.

Si hubiera llegado antes te hubiera puesto este vid:    

https://youtu.be/s7vSUk6gN3o?t=226

 

Share this post


Link to post
Share on other sites

Hola chicos. Gracias por las respuestas.

La verdad es que soy algo novato en el tema de físicas, pero me habéis aclarado muchas dudas que tenía. Yo de momento le he asignado el material a las paredes, ya que por definición me parecía mas correcto (por si algún momento se quiere hacer que cierta pared produzca bote o fricción).

Lo de AddForce ya lo comprobé que es fastidiado, por que cada vez que saltaba iba acumulando mas y mas impulso. Al final lo que hice fue la chapuza de que, justo antes de dar el salto, pasara a ser kinematic o static para acto después que fuera dynamic de nuevo. De esta forma no acumulaba impulso y nos e iba a la luna la tercera vez que saltabas.

 

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...