nomoregames 35 Report post Posted August 20, 2020 Hola Esta duda es realmente sencilla, pero por desgracia no logro encontrar la solución, ni en foros, ni por mi cuenta Tengo lo típico, un jugador con un rigidbody, y quiero que avance hacia delante. Para eso tengo el siguiente script (que es el que mas se acerca a lo que busco) RB.velocity = transform.forward * Input.GetAxisRaw("Vertical") + (transform.right * Input.GetAxisRaw("Horizontal")) + new Vector3(0,RB.velocity.y,0); Qué es lo que busco? Que se vea afectada la velocidad de el rigidbody (y luego se pueda mostrar mediante .velocity) Que se vea afectado por factores externos (una explosión ) que lo lance... cosas así Y con mi script logro la primera cosa, pero no la segunda... Alguna idea para lograrlo?? Gracias Share this post Link to post Share on other sites
Igor 337 Report post Posted August 20, 2020 estas cambiando directamente la velocity del rigidBody, osea que si una fuerza afecta al rigidBody y cbia su velocity.... tu luego haces que el rigidBody la ignore porque sobreescribes su velocity. en vez de sobreescribir la velocity deverias usar AdForce que te valdria tanto como para moverlo como para añadirle la fuerza de una explosion. adForce modifica "internamente" la velocity de RB 1 Share this post Link to post Share on other sites
nomoregames 35 Report post Posted August 20, 2020 Si, pensé en usarlo, pero eso muestra un inconveniente Como hago para limitar la fuerza que se aplica? es decir, si yo hago un RB.AddForce(transform.forward * Input.GetAxis("Vertical")) la fuerza se va sumando y si clampeo .velocity, ya estaré limitando la velocidad del RB a la hora de verse afectado por factores externos Gracias Share this post Link to post Share on other sites
Igor 337 Report post Posted August 20, 2020 (edited) hola puedes probar algo asi Vector3 moveForce = (transform.forward * Input.GetAxisRaw("Vertical")) + (transform.right * Input.GetAxisRaw("Horizontal")); rb.AddForce(moveForce - rb.Velocity); asi si tu mueves con fuerza 10 hacia la derecha pero la velocity ya es 10 hacia la derecha, al restarse se anulan y estas añadiendo fuerza 0 hacia la derecha. igual tienes que multiplicar "moveForce" por algun valor para que la velocidad sea la que quieres porque igual se mueve muy despacio, o muy rapido. quizas la aceleracion quede muy suave... puedes hacelo con un valor Exponencial de velocity para que sea mas "fuerte" Vector3 moveForce = (transform.forward * Input.GetAxisRaw("Vertical")) + (transform.right * Input.GetAxisRaw("Horizontal")); Vector3 veloci = rb.velocity.normalized; veloci = new Vector3(veloci.x*veloci.x, veloci.y*veloci.y, veloci.z*veloci.z) * rb.velocity.magnitude; rb.AddForce(moveForce - veloci); ... claro que esto tambien frenaria tu fuerza de la explosion... entonces, en vez de lo que te he puesto, simplemente tendrias que comprobar si tu velocity es mas larga (magnitude) que tu "moveForce" y en ese caso NO añadir tu moveForce Edited August 20, 2020 by Igor Share this post Link to post Share on other sites
nomoregames 35 Report post Posted August 20, 2020 Ok! cuando pueda pruebo Como siempre, gracias Share this post Link to post Share on other sites
Igor 337 Report post Posted August 20, 2020 no se si te servira bien. la verdad no suelo usar mucho el rigidbody. tambien puedes hacer el movimiento "manualmente", con el transform, y dejar el rigidbody para las fuerzas externas, expllsiones, colisiones, etc.. Share this post Link to post Share on other sites
nomoregames 35 Report post Posted August 20, 2020 ahora lo probare Pero lo malo del transform es que no puedo saber la velocidad... podría aplicar la formula Velocidad = Distancia / Tiempo = V=D/T. "copypaste" y de echo seria lo mas interesante... pero no se como aplicarla Share this post Link to post Share on other sites
Igor 337 Report post Posted August 20, 2020 si quieres que se mueva 7 unidades al segundo seria asi: float speed = 7; transform.position += direccionDeMovimiento * speed * Time.deltaTime; y asi se movera 7 unidades cada segundo hacia la direccion indicada recuerda que "direccionDeMovimiento" tiene que estar normalizado (medir 1) para eso puede hacer direccionDeMovimiento.Normalize(); 1 Share this post Link to post Share on other sites
lightbug 837 Report post Posted August 20, 2020 (edited) On 8/20/2020 at 5:53 AM, nomoregames said: Que se vea afectada la velocidad de el rigidbody (y luego se pueda mostrar mediante .velocity) Hola, solamente para agregar algo al hilo. Si querés lograr eso vas a tener que trabajar siempre sobre la velocidad actual de alguna manera, nunca escribirla directamente (a menos que esto sea lo que busques). Por escribirla directamente me refiero a que la velocidad sea igual a algo que la tenga en cuenta. // No va a funcionar // El rb puede sufrir modificaciones (debido a la simulación), pero en el FIxedUpdate siguiente estás pisando el valor. // ----------------- // velocidad de 5 m/s rb.velocity = Vector3.right * 5f; // Va a funcionar // el rb va a modificar una velocidad en base a la actual. La velocidad del RB va a estar afectada por la simulación. // ----------------- // aceleración de 5 m/(s*s) (ta en otra escala, lo sé) rb.velocity += Vector3.right * 5f * dt; Más formas de mover un rb con velocity: // Acelerando, podés emplear el mismo drag del RB para lograr una aceleración y velocidad final deseada. rb.velocity += aceleración * dt; // Acelerando, esta vez podés usar un drag dinámico (en tu propio código) y poner el drag del rb a 0. rb.velocity += aceleración * dt * (1 - drag); // Usando SmoothDamp rb.velocity = Vector3.SmoothDamp( rb.velocity , targetVelocity , ref currentAcceleration , smoothTime ); // Usando MoveTowards rb.velocity = Vector3.MoveTowards( rb.velocity , targetVelocity , acceleration ); // Usando Lerp rb.velocity = Vector3.Lerp( rb.velocity , targetVelocity , t ); ─────────────────────────────────────────────────────────────────────────── On 8/20/2020 at 6:11 AM, Igor said: estas cambiando directamente la velocity del rigidBody, osea que si una fuerza afecta al rigidBody y cbia su velocity.... tu luego haces que el rigidBody la ignore porque sobreescribes su velocity. en vez de sobreescribir la velocity deverias usar AdForce que te valdria tanto como para moverlo como para añadirle la fuerza de una explosion. En el momento de llamar a la fuerza, la velocidad no se modifica, lo que esta llamada hace es avisar al motor de físicias la modifique (le agregue velocidad) en la simulación (con MovePosition/Rotation pasa lo mismo). El tema está en que él no está reflejando dicho cambio en el cuadro siguiente. Pero sí, te entiendo. ──────────────────────────────────────────────────────────────────────────────── On 8/20/2020 at 8:50 AM, Igor said: no se si te servira bien. la verdad no suelo usar mucho el rigidbody. tambien puedes hacer el movimiento "manualmente", con el transform, y dejar el rigidbody para las fuerzas externas, expllsiones, colisiones, etc.. On 8/20/2020 at 10:06 AM, nomoregames said: ahora lo probare Pero lo malo del transform es que no puedo saber la velocidad... podría aplicar la formula Velocidad = Distancia / Tiempo = V=D/T. "copypaste" y de echo seria lo mas interesante... pero no se como aplicarla Si se mueve y colisiona, o necesita valerse de queries para hacerlo (raycast, sphere cast, etc) ... bye bye transform! bueno no bye bye del todo, todavía es muy importante, pero nada de modificar transforms como sustituto de velocity, force, position, o similar. En estos casos el transform hace de elemento visual (como debería ser), jugar a "dos puntas" con el rb y el transform va a traer posiblemente malos resultados y dolor de cabeza (dependiendo de los casos). En estos casos conviene usar RB para todo, y valerse de la interpolación (para que lo visual se actualice correctamente). Se suele también usar el transform al final de la simulación (LateFixedUpdate) para acomodar (si fuera necesario) la posición "deseada" del jugador (rb.position) y su elemento visual (transform.position). Que dicho sea de paso, una vez que te metés con las físicas estos dos componentes (Rb y T) viven en su mundo y hacen cosas diferentes. Los dos se suelen amigar luego de la simulación (Con un Sync). Saludos. Edited August 21, 2020 by lightbug 1 Share this post Link to post Share on other sites