Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Temas recientes

MovePosition/Rotation con AddForce

Iniciado por AlbertoRLH, Mayo 05, 2019, 12:29:24 PM

Tema anterior - Siguiente tema
Mayo 05, 2019, 12:29:24 PM Ultima modificación: Mayo 06, 2019, 09:59:31 AM por pioj
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 !
 
     
 

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

 
 

Buenas,
 
 
 
Entiendo que transformInicioProyectil es hijo del player, ¿no?

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.

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

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!!
 

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).
 
 

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 . Si sabéis algo, ponerlo chic@s. Gracias!! 
 


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?

Mayo 08, 2019, 01:54:50 AM #8 Ultima modificación: Mayo 08, 2019, 01:56:03 AM por lightbug
Cita de: AlbertoRLH date=1557249278Lo 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 );

 
 

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.

Cita de: AlbertoRLH date=1557400904En 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!

Etiquetas: