Así que mis amigos y yo estamos desarrollando un juego en el que juegas como una bola de nieve que rueda cuesta abajo evitando obstáculos. Sin embargo, estamos teniendo problemas con nuestro movimiento. Queremos que nuestra bola de nieve gane velocidad cuanto más grande sea y cuanto más tiempo pase sin golpear algo. Nuestro movimiento de avance está controlado por
void FixedUpdate(){ rb.velocity += Physics.gravity * 3f * rb.mass * Time.deltaTime; //to accelerate rb.AddForce(0, 0, 32 * rb.mass); }Estamos aplicando una fuerza lateral en la entrada clave
if (Input.GetKey(ControlManager.CM.left)) { if (rb.velocity.x >= -15 - (rb.mass * 8)) { rb.AddForce(Vector3.left * sidewaysForce * (rb.mass * .5f), ForceMode.VelocityChange); } } if (Input.GetKey(ControlManager.CM.right)) { if (rb.velocity.x <= 15 + (rb.mass * 8)) { rb.AddForce(Vector3.right * sidewaysForce * (rb.mass * .5f), ForceMode.VelocityChange); } }La masa aumenta a medida que aumenta la escala y viceversa.
El problema surge cuando la bola de nieve se vuelve más grande que cierta escala. Una vez que llega a ese punto, acelera masivamente hacia la izquierda y hacia la derecha mientras presiona las teclas y luego vuelve a su velocidad de avance cuando las suelta. Supongo que tiene algo que ver con la masa y la forma en que se combinan las fuerzas aplicadas.
¿Hay una mejor manera de acelerar nuestra bola de nieve cuesta abajo o moverla de izquierda a derecha? Probé transform.Translate y transform.MovePosition, pero conducen a un movimiento entrecortado hacia la izquierda y hacia la derecha.
Por un lado, la mayoría del código de movimiento debería multiplicar la velocidad por Time.deltaTime . En un juego hipotético, si aumentaste la velocidad en una cierta cantidad en cada cuadro, entonces alguien con una computadora robusta de 60 fps irá el doble de rápido que un pobre jugador de computadora portátil de 30 fps porque acelerará con menos frecuencia. Para arreglar esto, multiplicamos la aceleración por Time.deltaTime , que es el tiempo desde el último cuadro.
En lugar de este código, donde la velocidad de fotogramas determinaría la velocidad;
Vector3 example = new Vector3(1,1,1); void Update() { rb.AddForce(example); } Usaríamos este código. Si la velocidad de fotogramas es la mitad, Time.deltaTime será el doble, por lo que la aceleración será constante para todos los que la usen.
Vector3 example = new Vector3(1,1,1); void Update() { rb.AddForce(example * Time.deltaTime); } Puede haber otra fuente de este problema, aunque deshacerse de las dependencias de velocidad de fotogramas es un buen punto de partida. Parece que ya ha usado Time.deltaTime para la velocidad descendente, pero no para el movimiento lateral. Incluso si no soluciona el problema, usar Time.deltaTime es esencial para cualquier juego consistente.