Arrêt d'une accélération (sans utiliser de force).

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Répondre
Stalki
Messages : 9
Inscription : 27 Mai 2015 21:15

Arrêt d'une accélération (sans utiliser de force).

Message par Stalki » 30 Nov 2016 17:33

Bonjour, bonsoir,

Je développe un petit jeu où mon personnage accélère petit à petit. Cela fonctionne très bien.
Cependant, j'aimerai qu'arrivé à un certain timer, l'accélération s'arrête, et que le personnage continue à avancer à une vitesse constante.

Voici le code que j'ai inséré dans la fonction Update() :

Code : Tout sélectionner

 if (speed < 4f) {
                float intervalle = Time.timeSinceLevelLoad - lastTime;
                speed += constantSpeed * intervalle;
                lastTime = Time.timeSinceLevelLoad;

 }
 else {
                speed = 4f;
 }

posX = speed * Time.timeSinceLevelLoad + (1 / 2) * constantSpeed * (Time.timeSinceLevelLoad * Time.timeSinceLevelLoad);

GetComponent<Transform>().position = new Vector3(posX, this.transform.position.y, this.transform.position.z);

J'ai compris pourquoi cela ne fonctionnait pas correctement, mais je n'arrive pas à corriger mon problème.

En gros, dans ce cas, le dernier écart entre la position du personnage à chaque frame avant d'arriver à une vitesse de 4 est de 0.08.
Quand le personnage arrive à une vitesse de 4, l'écart de sa position à chaque frame passe à 0.06, ce qui ralentit finalement le personnage même si après il continue à une vitesse constante.

La formule que j'utilise pour déterminer posX est un peu compliqué ici. Un ami me la modifié pour essayé de réglé le problème, mais avant je faisait simplement : posX = Time.timeSinceLevelLoad * speed. Et ca marchait également.


La raison de mon problème est la suivante :

Temps * Vitesse = PosX.
Soit une vitesse de 3 initiale :

1 x 3 = 3
2 x 4 = 8 écart de 5
3 x 5 = 15 écart de 7
4 x 6 = 24 écart de 9

ON STABILISE LA VITESSE à 6

5 x 6 = 30 écart de 6
6 x 6 = 36 écart de 6
7 x 6 = 42 écart de 6


Pour résoudre mon problème, il faudrait qu'après stabilisation de la vitesse, l'écart soit ici de 9...

J'espère que quelqu'un pourra m'aider, si vous avez besoin d'autres informations pour m'aider demandez !! Ca fait longtemps que je suis dessus je n'y arrive vraiment pas....

Merci !

Stalki.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Arrêt d'une accélération (sans utiliser de force).

Message par boubouk50 » 30 Nov 2016 18:03

- Y a t'il une raison de ne pas utiliser un fixedUpdate ou un Time.deltaTime?
Stalki a écrit :5 x 6 = 30 écart de 6
6 x 6 = 36 écart de 6
7 x 6 = 42 écart de 6
C'est le principe de la table de multiplication:
6x6 = 5x6 + 6 -> donc pour avoir un écart de 9, il faut stabiliser la vitesse à 9... ou bien multiplier 6 par 1.5 pour qu'il fasse 9... mais je crois que c'est l'approche en elle-même qui ne va pas.

Tu pourrais travailler avec Translate () par exemple pour faire avancer le personnage au fur et à mesure plutôt que de recalculer la position depuis le départ.
Ainsi, tu ne travailles que sur l'intervalle entre deux translations qui augmente ou se stabilise.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Stalki
Messages : 9
Inscription : 27 Mai 2015 21:15

Re: Arrêt d'une accélération (sans utiliser de force).

Message par Stalki » 30 Nov 2016 18:27

Bonsoir et merci de ta réponse !

Effectivement je suis long de maîtriser Unity donc je ne dois pas utiliser les méthodes les plus optimisées !
Pour fixedUpdate, je pensais que le déplacement serait moins fluide.. (je dois me tromper du coup ! aha)
Pour deltaTime je ne l'ai jamais utilisé encore je vais me renseigner.

Ok pour Translate(), mais cela ne réglera pas mon problème d'écart, si ?

Merci en tout cas !!

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: Arrêt d'une accélération (sans utiliser de force).

Message par Moi 1971 » 30 Nov 2016 20:00

Bonsoir,
Ok pour Translate(), mais cela ne réglera pas mon problème d'écart, si ?
Bha non!
Tu construit de deux manières différentes ta variable speed.

Code : Tout sélectionner

speed += constantSpeed * intervalle;
et

Code : Tout sélectionner

speed = 4f;
Est-ce que tu as essayé juste de faire simplement ceci :

Code : Tout sélectionner

if (speed < 4f) {
                float intervalle = Time.timeSinceLevelLoad - lastTime;
                speed += constantSpeed * intervalle;
                lastTime = Time.timeSinceLevelLoad;

 }
 else {
                ///speed = 4f;
 }

Stalki
Messages : 9
Inscription : 27 Mai 2015 21:15

Re: Arrêt d'une accélération (sans utiliser de force).

Message par Stalki » 30 Nov 2016 20:07

J'ai fais exprès d'arrêter la speed à 4 justement !
Bon en fait le problème est réglé. Je viens d'apprendre qu'il suffit parfois de fouiller dans les fonctions d'Unity avant de chercher des solutions algorithmiques sorties de nulle part ! Merci à toi boubouk.

Pour ceux qui auraient éventuellement le même problème (ce qui m'étonnerait !!!), cela a fixé le mien :

Code : Tout sélectionner


                if (speed < 5)
                {
                    speed += 0.005f;
                }
                
               GetComponent<Transform>().Translate(Vector3.right * Time.deltaTime * speed);
               

Il suffisait d'utiliser la fonction Translate qui fait tout pour nous ! Merci bcp!!!! <3

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: Arrêt d'une accélération (sans utiliser de force).

Message par Moi 1971 » 30 Nov 2016 20:33

Stalki a écrit :J'ai fais exprès d'arrêter la speed à 4 justement !
Bha justement !!!!! Si tu t’arrêtes à 4 et que tu ne fais rien après pourquoi mettre une boucle else!
Et de plus ta solution de remplacement n'utilise pas de else, parce que une fois la limite atteinte, il n'y a rien à faire....
..
.
J'ai même pas envie de te dire qu'il ne faut pas mettre de GetComponent dans une boucle Update...

Stalki
Messages : 9
Inscription : 27 Mai 2015 21:15

Re: Arrêt d'une accélération (sans utiliser de force).

Message par Stalki » 30 Nov 2016 20:44

Aha oui effectivement ça ne sert à rien.. Mais à la base j'avais essayé de mettre quelques trucs dedans c'est pour ça que je l'ai gardé !

Je ne savais pas pour GetComponent dans une Update ! Peux tu m'expliquer pourquoi ? Et par quoi devrais-je le remplacer ? :-/

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: Arrêt d'une accélération (sans utiliser de force).

Message par Moi 1971 » 30 Nov 2016 21:39

Il faut regarder la doc ici
et par exemple un tuto ici

La raison, c'est que le GetComponent prend du temps et que si c'est pour aller chercher 25 fois par seconde le même composant, autant le faire une seule fois dans la boucle Start.

Stalki
Messages : 9
Inscription : 27 Mai 2015 21:15

Re: Arrêt d'une accélération (sans utiliser de force).

Message par Stalki » 30 Nov 2016 21:50

Ok super ! Merci bien !

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Arrêt d'une accélération (sans utiliser de force).

Message par boubouk50 » 01 Déc 2016 10:29

Surtout faire

Code : Tout sélectionner

GetComponent <Transform> ().Translate (Vector3.right * Time.deltaTime * speed);
est inutile, puisque tu peux faire directement

Code : Tout sélectionner

transform.Translate (Vector3.right * Time.deltaTime * speed);
Lorsque tu agis sur un objet, tu peux accéder directement à son transform et son gameObject sans passer par le GetComponent ().
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « Scripting »