Comment puis-je implémenter une fonction «avance rapide» dans mon jeu?


15

Comment puis-je implémenter la fonction d'avance rapide pour mon jeu de tower defense comme dans http://fieldrunners.com/ et d'autres jeux TD?

J'utilise Unity 3D. Y aurait-il quelque chose pour gérer moins d'images par seconde ou une sorte de mouvement rapide réglé manuellement des ennemis et de la vitesse de tir de la tour, et cetera?


avez-vous essayé d'augmenter la fréquence de mise à jour ?? vous devrez peut-être sauter des images ..
concept3d

Réponses:


7

si votre jeu n'a pas de simulations compliquées ou de calcul coûteux qui nécessitent de les séparer dans des chronologies de mise à jour indépendantes, vous pouvez utiliser une approche simple pour baser le code dans vos Update()fonctions sur la valeur Time.time d'Unity, et dans votre code définir la valeur de Time .timeScale pour être ce que vous voulez. 0 == en pause, 1 = normal, nos testeurs adorent régler timeScale> 1 pour accélérer les choses.

http://unity3d.com/support/documentation/ScriptReference/Time-timeScale.html


18

Approche: taux de simulation plus élevé

Votre timing pour votre interface utilisateur doit être découplé de votre boucle de jeu réelle, tout comme votre rendu. Disons par exemple que votre monde tourne à 4x. Disons qu'à votre vitesse de base (1x), votre jeu exécute 30 mises à jour par seconde.

Vous auriez alors quelque chose comme ceci, en mode d'avance rapide:

  • World logic exécute 4 mises à jour pour chaque mise à jour de l'interface utilisateur et du moteur de rendu. Cela signifie qu'il doit exécuter 120 mises à jour par seconde. Ainsi, votre modèle mondial (données) est mis à jour à ce rythme.
  • Le rendu et la logique de l'interface utilisateur continuent à interroger ou à faire quoi que ce soit à 30 mises à jour par seconde.

En d'autres termes, le jeu dans son ensemble ne fonctionne pas plus rapidement. La partie simulation est.

Vous pouvez en déduire deux choses:

  1. Vous devez garder votre logique de jeu suffisamment simple pour pouvoir l' exécuter facilement quatre fois plus vite sur votre plate-forme cible, OU vous devez introduire des méthodes pour extrapoler plus rapidement divers aspects du gameplay - cela peut cependant résulter dans un modèle qui est différent de ce qu'il aurait été si vous aviez simplement utilisé une simulation plus rapide. Le compromis serait donc le coût de traitement pour la précision. Voir approche 2, ci-dessous.

  2. C'est la séparation des préoccupations qui vous permet d'accélérer facilement votre simulation mondiale, cette séparation étant le modèle, la vue et le contrôleur ( MVC ). Si vos données mondiales (M), votre logique de rendu (V) et votre logique de jeu (C) sont toutes mélangées, vous ne pourrez vraiment pas le faire, du moins pas sans une migraine massive.

Approche: extrapolation basée sur des deltas temporels

Comme mentionné ci-dessus, vous devrez calculer le mouvement en fonction de la distance parcourue par un objet dans un temps donné. Cela suppose que la physique de votre jeu soit intrinsèquement plus réaliste dans sa simulation, ce qui peut ne pas être le cas. Il s'agit d'un sujet plus vaste et considérablement plus complexe. Vous devrez poser plus de questions si vous voulez savoir. Essentiellement, vous ferez du calcul pour bien faire les choses. Vous devrez faire face à l'interpénétration dans les collisions et à une foule d'autres problèmes que je n'aborderai pas ici.

De conclure

Cela vous donne un aperçu général. Votre choix de langue est le vôtre, sans doute vous savez-vous comment le faire dans Unity ou vous ne le savez pas. Le timing dans n'importe quelle langue vous oblige à comprendre les tenants et aboutissants en détail, je vous suggère de commencer par les articles de Gaffer et de consulter les documents de l'API Unity.


Si vous allez utiliser l' approche à taux de simulation plus élevé et que vous souhaitez prendre en charge le ralentissement , vous devez probablement avoir un taux de simulation de base extrêmement lent , puis l'exécuter par défaut à environ 100 étapes de simulation / trame.
bobobobo

9

En règle générale, la mise à jour de la logique du jeu doit être découplée de la mise à jour des graphismes du jeu - c'est-à-dire que la simulation de votre gameplay, de l'IA, du mouvement de l'unité, et cetera ne doit pas être liée à la vitesse à laquelle le jeu est rendu . Habituellement, la boucle de jeu principale calcule le temps écoulé depuis la dernière mise à jour du jeu et envoie ce pas de temps delta aux routines de mise à jour de chaque objet logique de jeu individuel.

Dans un tel scénario, il devient simple d'implémenter une mise à l'échelle temporelle (y compris une avance rapide) dans votre jeu. Prémultipliez simplement le pas de temps de la logique du jeu par une valeur scalaire qui contrôle la quantité à "accélérer" ou ralentir le temps. Par défaut, cette valeur serait une, et par exemple, une fois que l'utilisateur a appuyé sur la touche "avance rapide", vous la définissez à 1,5, et toute la simulation semble aller 50% plus vite. Vous resteriez toujours au même rythme, cependant.

Je ne connais pas très bien Unity et je peux donc me tromper dans la suggestion suivante, mais Unity a un composant de gestion du temps qui peut être utile pour l'implémenter. En fait, il possède déjà une propriété d'échelle de temps. La description du composant implique que la classe a été conçue pour des objets physiques, mais elle peut également s'appliquer à votre scénario.


1
Il est certainement applicable à son scénario. Tout ce qu'il aurait à faire, c'est de régler Time.timeScale sur un multiplicateur et tout ira plus vite. C'est un changement à tous les niveaux, donc s'il y a des choses comme les interactions de menu et telles elles iront aussi plus vite, cependant.
Tetrad

thnx à nouveau Tetrad :)
Syed
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.