Jump to content
Sign in to follow this  
nomoregames

RB susceptible a explosiones

Recommended Posts

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

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

  • Thanks 1

Share this post


Link to post
Share on other sites

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

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 by Igor

Share this post


Link to post
Share on other sites

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

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

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();

  • Like 1

Share this post


Link to post
Share on other sites
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 by lightbug
  • Like 1

Share this post


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

×
×
  • Create New...