[MY-AL] Problème de déplacement

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
Archimage77
Messages : 7
Inscription : 05 Mai 2014 19:37

[MY-AL] Problème de déplacement

Message par Archimage77 » 02 Oct 2017 00:42

Bonjour, je viens vers vous car j'ai un soucis d'algorithmie. Je pense que je suis pas loin de la solution mais je n'y arrive pas.
Le but est de faire bougé un personnage (en vrai c'est plus compliqué mais je simplifie), jusque la pas de soucis. Le problème est que dans mon jeu j'ai besoin d’accéléré le temps.
J'ai aussi besoin de soulagé mon CPU car en faite l'action d'avancer me coute cher (sur plateforme mobile) et donc je fais des pauses dans mes déplacements. Voici mon premier code simplifié

Code : Tout sélectionner

void FixedUpdate()
{
	run();
}

private void run()
{
	_timeRun += Time.deltaTime;
	if (_timeRun >= _delayRun)
	{
		float deltaMove = _runSpeed * Time.deltaTime;
		move(deltaMove); // ma fonction qui coute cher
		_timeRun = _timeRun - _delayRun; // on rattrape le décalage
	}
}

private void move(float delta)
{
	//......
}
J'ai donc essayé d'implémenté l’accélération du temps, en faite la pause est plus longue mais le déplacement est plus grand ce qui devrai revenir au même ?

Code : Tout sélectionner

void FixedUpdate()
{
	run();
}

private void run()
{
	_timeRun += Time.deltaTime;
	if (_timeRun >= _delayRun* _ratioSpeed)
	{
		float deltaMove = _runSpeed * Time.deltaTime * _ratioSpeed;
		move(deltaMove); // ma fonction qui coute cher
		_timeRun = _timeRun - _delayRun; // on rattrape le décalage
	}
}

private void move(float delta)
{
	//......
}
Le soucis est que quand je fais mes tests, en vérité les personnages n'arrive pas au même moment (en mesurant le temps de déplacement divisé par le ratio), j'ai donc probablement loupé quelque chose...

auriez vous une idée ?
Si ce n'est pas claire hésitez pas à me le dire.
Merci par avance.
Dernière édition par Archimage77 le 02 Oct 2017 15:29, édité 1 fois.

Wadison
Messages : 19
Inscription : 23 Sep 2017 22:31

Re: [Algo/C#] Problème de déplacement

Message par Wadison » 02 Oct 2017 12:36

Hello


Je calculerai mon propre deltaTime quelque chose dans le genre:

Code : Tout sélectionner

        _DeltaRun += Time.deltaTime;
	if (_DeltaRun >= _delayRun)
	{
		float deltaMove = _runSpeed * _DeltaRun * _ratioSpeed;
		move(deltaMove); // ma fonction qui coute cher
		_DeltaRun =0;
	}
Ceci fonctionne uniquement si les déplacements sont rectilignes.
l'objet n'arriverai pas exactement au même endroit sinon.


A tester
++

Archimage77
Messages : 7
Inscription : 05 Mai 2014 19:37

Re: [MY-AL] Problème de déplacement

Message par Archimage77 » 02 Oct 2017 15:31

Merci beaucoup pour ta réponse, en effet sa à l'air d'être pas mal d’après mes tests. Oui mes déplacement son tous rectiligne.

Je me pose toujours la question, à ce que je dois mettre ce genre d'algorithme dans un FixedUpdate ou dans un Update ?

Merci en tout cas.

(désolé pour le titre du post, j'ai rectifié)

Wadison
Messages : 19
Inscription : 23 Sep 2017 22:31

Re: [MY-AL] Problème de déplacement

Message par Wadison » 02 Oct 2017 18:22

J'ai bien fait de chercher la réponse moi-même j'utilise que Update/LateUpdate.

Mais a priori non, car tu n'utilise pas la physique pour déplacer ton objet.
https://docs.unity3d.com/ScriptReferenc ... pdate.html

Je suis newbie sous Unity3d, je n'ai pas les tenant et les aboutissants, si quelqu'un peu expliquer les bug que ca provoque?! je suis preneur.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5573
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: [MY-AL] Problème de déplacement

Message par boubouk50 » 03 Oct 2017 11:51

La différence entre FixedUpdate () et Update () est le temps de mise à jour.
Un Update () a un temps variable en fonction de l'affichage qui équivaut à deltaTime.
Un FixedUpdate () a un temps défini, toutes les X milliseconds.
Le but est d'avoir un temps fixe pour gérer la physique.

https://unity3d.com/fr/learn/tutorials/ ... ixedupdate
"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

Wadison
Messages : 19
Inscription : 23 Sep 2017 22:31

Re: [MY-AL] Problème de déplacement

Message par Wadison » 03 Oct 2017 19:42

Bonjour,
Le nom est clair pourtant! m'enfin, merci de l'eclaircissement.

C'est pratique, mais je suis étonnée d'un tel système.
Unity3D doit vraisemblablement provoquer un lag en cas de bourre pour garantir le "tick" fixe.
Il y a moyen de régler le tick pour plus ou moins de précision?


A regarder le Physic manager tout semble plus compliqué?! je n'ai pas trouvé ma réponse clairement.
https://docs.unity3d.com/Manual/class-P ... nager.html

Répondre

Revenir vers « (C#) CSharp »