[RESOLU][DB-AL] Déplacement rapide latéral rigidbody (type esquive)

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Krafter
Messages : 65
Inscription : 11 Fév 2017 17:03

[RESOLU][DB-AL] Déplacement rapide latéral rigidbody (type esquive)

Message par Krafter » 20 Mai 2018 21:52

Salut à tous!

Après un petit passage à vide et un détour sur UE4 (brrrrrr...) me revoilà sur Unity :)
En ce moment j'ai un petit projet 3D (de gros débutant) avec des joueurs qui se déplaceraient assez vite tout droit (style jeu de conduite j'imagine).

Mon soucis étant le suivant : le joueur est contrôlé par un rigidbody. Je voudrais que pendant qu'il avance, il puisse faire une esquive latérale grâce aux touches "Q" et "D". Donc quand il appuie, faire un déplacement très rapide à gauche ou à droite, tout en avancant et en regardant vers l'avant. Je ne savais pas bien quoi utiliser entre les MovePosition ou les forces, pour l'instant j'ai fini par utiliser ça lorsque la touche est appuyée :

Code : Tout sélectionner

rb.AddRelativeForce(Vector3.right * 40, ForceMode.Impulse);

Ce qui semble fonctionner. Maintenant je souhaiterai que le déplacement qui est très rapide s'estompe après x secondes. J'essaie d'utiliser une coroutine mais ne trouve rien qui me satisfait vraiment. En effet si l'accélération peut être très brutale, je voudrais une décélération très rapide mais un peu smooth (pour l'instant j'ajoute une force inverse après un laps de temps, et c'est très moche et saccadé ^^) :

Code : Tout sélectionner

rb.AddRelativeForce(-Vector3.right * 40, ForceMode.Impulse);


De plus j'ai vu des choses avec le drag, mais moi je souhaiterai que mon joueur puisse continuer d'avancer vers l'avant pendant son esquive latérale (ajouter un drag latéral je sais pas si cest possible mais ça devrait se rapprocher de ce que je recherche ^^). Je n'ai pas trouver comment arrêter en douceur cette force juste latérale? (j'ai essayé des choses avec rb.velocity.x mais je ne suis arrivé à rien je ne sais pas si la solution se trouve par là, ou si utiliser une force dans un premier temps est une erreur?). J'avais tenté ça aussi :

Code : Tout sélectionner

float sidewaysdragmultiplier = 1; //how fast do you want your object to slow down
        Vector3 velocity = transform.InverseTransformDirection(rb.velocity);
        rb.AddForce(transform.right * -velocity.x * sidewaysdragmultiplier);
Voilà j'espère ne pas avoir été trop confus dans mes explications, si quelqu'un à déjà fait un jeu de course / d'esquive peut-être connaitra-t-il une solution? :)

Merci!
Dernière édition par Krafter le 25 Mai 2018 18:36, édité 1 fois.

Override
Messages : 142
Inscription : 04 Nov 2016 20:08

Re: [DB-AL] Déplacement rapide latéral rigidbody (type esquive)

Message par Override » 22 Mai 2018 17:11

Peut être que tu peut utiliser du lerping, en gros tu définit la position de fin et tu lerp la position du joueur vers la position de fin, en fonction du temps et d'une courbe, démonstration par le code ^^

Code : Tout sélectionner

Vector3 startPoint = transform.position;
Vector3 endPoint = startPoint + Vector3.right * 5;

float percent = 0;
float speed = 2; // en durée ça donne 1 / speed secondes
float power; // plus ce chiffre est grand, plus l'accélération / décélération se ressent, en gros à 1, le déplacement est linéaire

while (percent < 1) {
	percent += Time.deltaTime * speed;
	transform.position = Vector3.Lerp (startPoint, endPoint, Mathf.Pow (1 - percent, power);
	yield return null;
}
Voilà bon écoute je sais même pas si ça marche mais si ça t'aide tant mieux :lol:
:merci:

Krafter
Messages : 65
Inscription : 11 Fév 2017 17:03

Re: [DB-AL] Déplacement rapide latéral rigidbody (type esquive)

Message par Krafter » 25 Mai 2018 18:35

Bonjour Override merci de ta réponse :)

Alors je dis peut-être des bêtises mais il me semble que pour bouger le joueur il faut éviter d'utilise movePosition non? Niveau performance de ce que j'ai compris (j'ai vu ça dans des tutos me corriger si c'est pas vrai ^^").
Du coup j'ai fini par utiliser une coroutine ou j'attends x secondes avant de repasser une variable à true, sachant que l'accélération ne peut se faire que lorsque la variable est true et qu'elle enclenche un changement en false ^^.

Je sais pas trop pourquoi mais ça fait un arrêt pas trop brutal ^^ je mets résolu du coup ;)

Override
Messages : 142
Inscription : 04 Nov 2016 20:08

Re: [RESOLU][DB-AL] Déplacement rapide latéral rigidbody (type esquive)

Message par Override » 25 Mai 2018 23:57

Hé bien sûrement, j'ai pas eu beaucoup à utiliser la physique d'unity donc je pourrais pas m'y avancer

Mais ducoup si ton système marche c'est tant mieux :super:
:merci:

Répondre

Revenir vers « (C#) CSharp »