Jump to content
UnitySpain
AlbertoRLH

MovePosition/Rotation con AddForce

Recommended Posts

Hola chic@s!,

Tengo un problema con un controlador Rigidbody: el player lo muevo con MovePosition y MoveRotation, y aplico la fuerza del disparo con AddForce. El problema reside en que cuando estoy moviendo el controlador y disparo a la vez, el AddForce no me tiene en cuenta el MovePosition y MoveRotation. He probado AddRelativeForce, AddForceAtPosition, todos los tipos de ForceMode, etc.

¿Alguna solución? Os dejo el código (estan en diferentes scripts). Gracias :1_grinning:!


     

   Vector3 vectorMovimientoVertical;

        vectorMovimientoVertical = transform.forward * mV * velMov * Time.deltaTime;

        controlRB.MovePosition(transform.position + vectorMovimientoVertical);

        Quaternion quaternionHorizontal;

        quaternionHorizontal = Quaternion.Euler (new Vector3 (0, mH * velRot * Time.deltaTime, 0));

        controlRB.MoveRotation(transform.rotation * quaternionHorizontal);



        Rigidbody disparo;

        disparo = Instantiate (Proyectil,  transformInicioProyectil.position, transformInicioProyectil.rotation);

        disparo.AddForce (transformInicioProyectil.forward * potenciaProyectil, ForceMode.Impulse);

 

Edited by pioj
Por favor, usa el <> o el "quote" para pegar código.

Share this post


Link to post
Share on other sites

Hola, 

Sí, el transformInicioProyectil es hijo del player. Ahora que lo pienso, resulta un poco raro, pero ¿como podría solucionarlo o ver que ese es el problema? Es decir, si añado el transform del mismo player no saldría el proyectil porque nacería dentro del propio collider del player (lo he probado). ¿Alguna solución? Muchas gracias.

Share this post


Link to post
Share on other sites

Buenas, crea un emptyObject dentro del player y lo colocas exactamente donde quieras que salga el disparo, como por ejemplo la punta de la pistola y usas ese transform como lugar de respawn del proyectil. 

Mirate el turorial que hay en Unity de un shooter, revisalo y mira en que difiere tu proyecto:

https://unity3d.com/es/learn/tutorials/s/survival-shooter-tutorial

 

Saludos

Share this post


Link to post
Share on other sites

Buenas tardes,

En primer lugar dar las gracias por contestar. Yo tengo hecho exactamente lo mismo que me dice (subo una captura):  "crea un emptyObject dentro del player y lo colocas exactamente donde quieras que salga el disparo, como por ejemplo la punta de la pistola y usas ese transform como lugar de respawn del proyectil". Pero al parecer que hay algo que no tengo en cuenta, porque cuando estoy moviendo el controlador y disparo a la vez, el AddForce no me tiene en cuenta el MovePosition y MoveRotation, como indicaba al principio del post.

El proyecto de Survival Shooter no me sirve porque hace uso de rayos, y yo hago uso de físicas para instanciar los proyectiles.  

Espero que alguien haya tenido el mismo problema o tenga una solución. Gracias!!

Captura de pantalla 2019-05-07 a las 12.37.21.png

Share this post


Link to post
Share on other sites

perdon por la ignorancia pero que significa que el AddForce no "tiene en cuenta" el MovePosition y MoveRotation? osea que vos te movés con el tanque, disparás y el misil hace cualquiera? o sale disparado de cualquier posición?

Esto puede ser así? (nunca lo usé así):

Rigidbody disparo;
disparo = Instantiate (Proyectil,  transformInicioProyectil.position, transformInicioProyectil.rotation);

 

Osea el razonamiento está bien, lo único que sirve del transform son los datos (pos y rot), vos tendrías que instanciar el prefab, óbtener su RB y darle la fuerza (asegurate que el RB sea dinámico).

 

Share this post


Link to post
Share on other sites

Hola lightbug,

No tienes que disculparte, quizá yo me este explicando mal. Voy ha intentar explicártelo con dos capturas:

- En la captura 1 el player esta parado, realiza un disparo y este recorre la distancia que se aplica con AddForce.

- En la captura 2 el player se esta desplazando, y realiza un disparo recorriendo una distancia menor a la indicada con AddForce.

Lo que yo he pensado es que la potencia del disparo no tiene en cuenta el movimiento del player. Según tu me comentas, y como escribí al principio del post, estoy instanciando bien el proyectil.

Estoy volviéndome un poco majara para resolver esto :62_dizzy_face:. Si sabéis algo, ponerlo chic@s. Gracias!! 

1.png

2.png

Share this post


Link to post
Share on other sites

Pues creo que eso es normal que pase, una vez le añades la fuerza al proyectil ya va independiente del jugador, en la realidad cuando un tanque dispara y el tanque se mueve el proyectil ya va libre.

¿Porque quieres que una vez disparado sigue el movimiento del tanque?

Share this post


Link to post
Share on other sites
6 hours ago, AlbertoRLH said:

Lo que yo he pensado es que la potencia del disparo no tiene en cuenta el movimiento del player.

Ah eso dalo por hecho, el movePosition toca directamente la posición del objeto, pero es ajeno (estoy casi seguro) de la parte de simulación (Fuerzas/velocidades), si querés que siga vas a tener que aplicar el ultimo movimiento realizado por el tanque al vector de fuerza/velocidad del misil, por ejemplo:

// este es el "deltaPosition"
Vector3 vectorMovimientoVertical = transform.forward * mV * velMov * Time.deltaTime;
controlRB.MovePosition(transform.position + vectorMovimientoVertical);

Quaternion quaternionHorizontal;
quaternionHorizontal = Quaternion.Euler (new Vector3 (0, mH * velRot * Time.deltaTime, 0));

controlRB.MoveRotation(transform.rotation * quaternionHorizontal);



Rigidbody disparo;
disparo = Instantiate (Proyectil,  transformInicioProyectil.position, transformInicioProyectil.rotation);

// "factor" es algun valor que te guste y quede bien
Vector3 misilForce = ransformInicioProyectil.forward * potenciaProyectil + factor * vectorMovimientoVertical;


disparo.AddForce ( misilForce , ForceMode.Impulse );

 

Edited by lightbug

Share this post


Link to post
Share on other sites

Buenos días chicos,

Perdonar el retraso, pero me ha sido imposible contestar hasta ahora.

En primer lugar dar las gracias a lightbug, porque su código funciona bien para calcular el problema de la simulación de fuerzas en el disparo. Tengo que decir que el float "factor" debes ajustarlo bien porque si vas hacia delante el disparo puede ir bien calculado, pero si te pasas en el factor, cuando vas hacia atrás, el disparo se calculará mal. Ahí dejo el apunte.

En respuesta a zelleGames, quiero que el disparo se atenga al movimiento del player, por tema de jugabilidad. Como bien pone Unity en su manual, no siempre los controladores tienen que ser realistas en los videojuegos. Un ejemplo sería cuando en Doom, el jugador va a 90 millas la hora y se detiene en seco. Si utilizara físicas reales tendría que avanzar unos metros por esa velocidad, pero al jugador lo que necesita es pararse en seco.

Muchas gracias chicos!! Un saludo cordial.

Share this post


Link to post
Share on other sites
19 hours ago, AlbertoRLH said:

En respuesta a zelleGames, quiero que el disparo se atenga al movimiento del player, por tema de jugabilidad. Como bien pone Unity en su manual, no siempre los controladores tienen que ser realistas en los videojuegos. Un ejemplo sería cuando en Doom, el jugador va a 90 millas la hora y se detiene en seco. Si utilizara físicas reales tendría que avanzar unos metros por esa velocidad, pero al jugador lo que necesita es pararse en seco.

Esta claro que si los juegos fuesen todos realistas perderían todo su encanto. Imaginad un sonic corriendo a 10 km/h, jaja.

Me alegro que hayas conseguido solucionar el problema!

Share this post


Link to post
Share on other sites

×
×
  • Create New...