Quelle est la différence entre Update et FixedUpdate dans Unity, et devrais-je m'en préoccuper?

10

On m'a dit d'utiliser Update()pour les graphiques et FixedUpdate()pour la physique, mais parfois mes entrées ne sont pas enregistrées lorsque j'utilise FixedUpdate(). Cela fonctionne bien si j'utilise Update()pour tout.

Dois-je m'embêter FixedUpdate()ou est-ce que je fais quelque chose de mal?

Tokamocha
la source

Réponses:

10

FixedUpdatepeut s'exécuter plus rapidement ou plus lentement qu'en Updatefonction de vos paramètres. Cela dépendra de la charge (vitesse d' Updateexécution) et de la vitesse que vous avez définie FixedUpdate(trouvée dans Edition-> Paramètres du projet-> Heure). Idéalement, puisqu'il Updateest exécuté une fois par image, c'est là que vous souhaitez capturer l'entrée. Si vous devez agir sur les entrées de la FixedUpdateméthode (comme contrôler les corps physiques), définissez des indicateurs Updatepuis gérez-les dans FixedUpdate:

bool leftMouseDown = false;

void Update()
{
    if(Input.GetMouseButtonDown(0))
        leftMouseDown = true;
}

void FixedUpdate()
{
    if(leftMouseDown )
    {
        //update physics bodies with input
        leftMouseDown = false;
    }
}

C'est toujours une bonne idée de contrôler la physique à partir de la FixedUpdateméthode, car il est peu probable que la physique doive être mise à jour aussi souvent, et la physique sur une mise à jour fixe est beaucoup plus facile à prévoir ( déterminisme ) que la physique sur une mise à jour variable.

MichaelHouse
la source
qu'en est-il si au lieu d'une condition booléenne (es.GetMouseButtonDown), nous devons lire la valeur d'un axe (Input.GetAxis ("Horizontal"))? Si la mise à jour est exécutée plus de fois que FixedUpdate, quel est votre conseil dans ce cas? Devrions-nous éventuellement envisager de calculer la valeur moyenne de l'axe survenue lors de plusieurs mises à jour avant de la consommer dans Update? (+1 btw)
Heisenbug
Comment savoir à quelle vitesse mon FixedUpdate est rapide?
Tokamocha
1
@Tokamocha Le taux de mise à jour fixe est défini dans Édition-> Paramètres du projet-> Heure.
MichaelHouse
@Heisenbug Personnellement, je voudrais simplement utiliser la dernière valeur et voir à quel point cela fonctionne. Si j'obtiens des résultats inattendus, je pourrais calculer une moyenne mobile de la valeur de l'axe jusqu'à ce qu'elle soit traitée par FixedUpdate. C'est une de ces choses qui nécessite des tests de jeu pour vraiment comprendre ce qui "se sent" bien.
MichaelHouse
1
J'ai trouvé dans des tests récents que, contrairement à ce qu'impliquent les documents, de nouveaux indicateurs d'entrée sont déjà disponibles dans FixedUpdate (sur PC au moins). Donc, définir un indicateur dans Update et ensuite agir dessus dans la prochaine FixedUpdate après cela (c'est-à-dire la prochaine image) comme indiqué ici peut en fait ajouter une image de latence au jeu, par rapport à la gestion directe de l'entrée dans FixedUpdate. Cela nécessite cependant un certain soin pour éviter la double gestion des entrées sur les trames avec plusieurs FixedUpdates, ou les entrées manquantes sur les trames sans FixedUpdate.
DMGregory
7

Vous devez comprendre ce que chacun fait. Update()est appelé aussi souvent que possible (pas sûr, peut-être qu'il peut être plafonné), de toute façon - chaque image. FixedUpdate()est appelé à chaque instant constant (donc "fixe").

L'entrée entre Update(), aussi simple que cela (parce que, comme vous l'avez remarqué, FixedUpdate()il ne peut pas attraper l'événement d'entrée). La logique du jeu peut cependant entrer dans l'un ou l'autre. La physique doit être déterministe et c'est pourquoi elle devrait l'être FixedUpdate(). D'autres choses n'ont pas à le faire. En fonction de l'utilisation, vous devez décider quelle fonction est appropriée.

Cependant, il vaut la peine de dire que certaines applications ont toutes les mises à jour de la logique de jeu FixedUpdate()(même en dehors de Unity) - cela s'appelle "boucle de jeu à étape fixe". Le fait d'avoir tout le code de mise à jour dans une fonction d'étape fixe vous donne un déterminisme et rend votre application plus susceptible de se comporter de la même manière à chaque fois (et sur chaque appareil). Permet également certaines fonctionnalités sophistiquées, comme les rediffusions.

NPS
la source
Donc, si je mets tout dans FixedUpdate (), mon jeu enregistrera toujours toutes les entrées, non?
Tokamocha
1
Non, vous pouvez y mettre toute la mise à jour de la logique du jeu mais pas la vérification des entrées.
NPS
2
cette réponse est pleine d'informations manquées. Tout d'abord, FixedUpdate est appelé 1 / fixedDeltaTime fois par seconde , pas tous les n: th fixedDeltaTime. Deuxièmement, la logique du jeu devrait toujours aller dans FixedUpdate car cela facilite la raison. La mise à jour est uniquement à des fins de rendu (je sais que presque personne dans la communauté Unity ne suit cela, mais c'est vraiment comme cela que cela devrait être fait). Troisièmement, FixedUpdate et sa relation avec le moteur physique n'ont rien à voir avec le déterminisme.
Thr