Masterclass sur le développement de jeux en 3D Godot : Construire un jeu de combat de chars Game | Skillademia Academy | Skillshare

Vitesse de lecture


1.0x


  • 0.5x
  • 0.75x
  • 1 x (normale)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Masterclass sur le développement de jeux en 3D Godot : Construire un jeu de combat de chars Game

teacher avatar Skillademia Academy, Creative Skills for the Future

Regardez ce cours et des milliers d'autres

Bénéficiez d'un accès illimité à tous les cours
Suivez des cours enseignés par des leaders de l'industrie et des professionnels
Explorez divers sujets comme l'illustration, le graphisme, la photographie et bien d'autres

Regardez ce cours et des milliers d'autres

Bénéficiez d'un accès illimité à tous les cours
Suivez des cours enseignés par des leaders de l'industrie et des professionnels
Explorez divers sujets comme l'illustration, le graphisme, la photographie et bien d'autres

Leçons de ce cours

    • 1.

      Bienvenue dans la masterclass Godot 3D ! oui au

      1:02

    • 2.

      Installer Godot ot ot

      1:40

    • 3.

      Aperçu du projet : Zone Battle

      3:44

    • 4.

      Naviguer dans Godot : La fenêtre principale, l'arbre de la scène et l'inspecteur ector

      4:46

    • 5.

      Naviguer dans Godot : la fenêtre de jeu et la navigation de base dans l'espace 3D

      5:37

    • 6.

      Primitifs et espace 3D – Rotation, mise à l'échelle, traduction

      14:36

    • 7.

      Fournitures

      7:51

    • 8.

      Construire des objets complexes à partir de modèles primitifs : le réservoir ank

      26:30

    • 9.

      Réaliser le terrain de jeu

      16:03

    • 10.

      Le nœud Camera3D

      8:44

    • 11.

      Vecteurs

      12:11

    • 12.

      Le nœud CharacterBody3D

      10:44

    • 13.

      Réagir aux apports du joueur - Mouvement

      26:53

    • 14.

      Réagir aux apports des joueurs - contrôler la tourelle

      10:54

    • 15.

      Collision

      13:25

    • 16.

      Le nœud RigidBody - Démarrer une coquille l l

      53:09

    • 17.

      Environnement : l'éclairage et le soleil

      6:35

    • 18.

      Gameplay : ajouter des chars ennemis via des scènes héritées

      5:13

    • 19.

      Détruire les réservoirs

      6:46

    • 20.

      IA : machines d'état

      16:33

    • 21.

      Ajouter une machine d'état au char ennemi via ECS S

      50:35

    • 22.

      Ajouter une machine d'État au char ennemi via ECS Pt. 2

      22:19

    • 23.

      SFX : Audio 3D

      12:49

    • 24.

      Couches d'UI de base

      14:34

    • 25.

      Événements et signaux de l'interface utilisateur - Marque

      18:27

    • 26.

      Créer une mini-carte

      6:52

    • 27.

      3D UI avec nœuds Label3D

      3:42

    • 28.

      Menu Démarrer

      12:54

    • 29.

      Menu pause

      6:37

    • 30.

      Gestionnaire de jeu : états début/fin

      31:37

    • 31.

      Système d'création d'ennemis

      53:16

    • 32.

      Angles de caméra multiples

      8:33

    • 33.

      De meilleures explosions avec des effets de particules

      28:49

    • 34.

      Re-texturer vos réservoirs : matériaux revisités

      5:30

    • 35.

      Décals

      4:01

    • 36.

      Importer des modèles externes

      9:45

    • 37.

      Améliorer le niveau du terrain

      21:15

    • 38.

      Exporter votre jeu

      1:28

    • 39.

      Projet de cours : créez votre propre jeu 3D

      0:47

    • 40.

      Félicitations ! Que faire ensuite ? ?

      0:32

  • --
  • Niveau débutant
  • Niveau intermédiaire
  • Niveau avancé
  • Tous niveaux

Généré par la communauté

Le niveau est déterminé par l'opinion majoritaire des apprenants qui ont évalué ce cours. La recommandation de l'enseignant est affichée jusqu'à ce qu'au moins 5 réponses d'apprenants soient collectées.

7

apprenants

1

projet

À propos de ce cours

Godot est devenu l'un des moteurs de jeu open source les plus passionnants disponibles aujourd'hui - puissant, souple et totalement gratuit. Avec la sortie de Godot 4, le développement 3D en temps réel est plus apte que jamais, ce qui ouvre la porte à la création de jeux complets sans recourir à des outils propriétaires.

Dans ce cours, vous apprendrez le développement de jeux 3D de A à Z, en construisant un projet jouable complet appelé Zone Battle. Plutôt que de proposer des démonstrations isolées, ce cours se concentre sur des systèmes réels utilisés dans des jeux réels, du mouvement et du combat à l'interface, l'IA, l'audio et l'exportation. de

Nous commencerons par installer Godot et nous nous familiariserons avec l'éditeur, les scènes, les nœuds et la navigation 3D. À partir de là, vous créerez des actifs de jeu à l'aide de primitives, créerez des matériaux, installerez des caméras, l'éclairage et des environnements, et vous donnerez vie au tout grâce à la physique et aux commandes des joueurs.

Au fur et à mesure de la progression du projet, vous allez mettre en œuvre des systèmes de gameplay comme l'apparition d'ennemis, l'IA de chars utilisant des machines à l'état, des mécanismes de collision et de tir, du scoring, des menus, des minimaps, des effets sonores et des explosions de particules. Vous apprendrez également à structurer un jeu correctement en utilisant des gestionnaires, des scènes héritées et des composants réutilisables.

Ce cours est enseigné sur la version 4.3-stable de Godot, mais les techniques que vous apprendrez (organisation de la scène, physique, logique de l'IA, systèmes d'interface utilisateur et architecture de jeu) sont des compétences fondamentales qui s'appliquent dans différentes versions de Godot.

À la fin de ce cours, vous aurez non seulement compris Godot mais aussi construit et exporté votre propre jeu 3D complet, et acquis une base solide pour continuer à développer vos propres projets.


Ce que vous apprendrez Learn

  • Comment naviguer dans l'éditeur Godot pour des projets 3D et le mettre en œuvre
  • Concepts 3D de base : transformations, matériaux, caméras, éclairage et physique
  • Créer des objets et des environnements complexes à partir de simples primitives
  • Mouvement du joueur, contrôle de tourelle, prise de vue et systèmes de collision
  • Créer une IA ennemie à l'aide de machines à état et d'une logique de style ECS
  • Ajouter des effets sonores, une interface utilisateur, des systèmes de notation, des minimaps et des menus us
  • Travailler avec des particules, des décalques, des modèles externes et des améliorations du terrain
  • Structurer un jeu complet avec des gestionnaires, des spawners et des états u
  • Exporter votre jeu 3D terminé

Exigences

  • Un ordinateur capable d'exécuter Godot 4.x
  • Godot installé (téléchargement gratuit)
  • Aucune expérience préalable de Godot n'est requise
  • La curiosité de base en matière de programmation ou de développement de jeux est utile, mais pas obligatoire

À QUI S'ADRESSE CE COURS

  • Les débutants qui veulent apprendre le développement de jeux en 3D à partir de zéro.
  • Utilisateurs de Godot passant de la 2D à la 3D
  • Développeurs indépendants explorant Godot 4
  • Étudiants et amateurs en conception de jeux
  • Les développeurs à la recherche d'une expérience d'apprentissage complète, basée sur un projet

Rencontrez votre enseignant·e

Teacher Profile Image

Skillademia Academy

Creative Skills for the Future

Enseignant·e

NEW CLASS: Figma Beginner Masterclass: Learn UI Design Step by Step

Figma can feel intimidating when you first open it.

There are so many tools, panels, and features that many beginners don't know where to start, or what actually matters when designing an interface.

That's exactly what this class is designed to solve.

In this beginner-friendly class, we'll build a complete UI project together while learning the fundamentals of Figma step by step. You'll learn how to structure layouts, work with typography and colors, organize your designs, and create simple interactive prototypes.

The focus isn't just on learning the software, but on understanding the workflow behind modern UI design in a practical and approachable way.

If you'... Voir le profil complet

Level: Beginner

Notes attribuées au cours

Les attentes sont-elles satisfaites ?
    Dépassées !
  • 0%
  • Oui
  • 0%
  • En partie
  • 0%
  • Pas vraiment
  • 0%

Pourquoi s'inscrire à Skillshare ?

Suivez des cours Skillshare Original primés

Chaque cours comprend de courtes leçons et des travaux pratiques

Votre abonnement soutient les enseignants Skillshare

Apprenez, où que vous soyez

Suivez des cours où que vous soyez avec l'application Skillshare. Suivez-les en streaming ou téléchargez-les pour les regarder dans l'avion, dans le métro ou tout autre endroit où vous aimez apprendre.

Transcription

1. Bienvenue dans la masterclass Godot 3D ! oui au: Construire un jeu en trois D peut sembler complexe, mais avec la bonne structure, cela devient un processus que vous pouvez aborder étape par étape. Bienvenue dans le cours de développement de jeux Godot D. Je suis Steve Carstensen, et dans ce cours, nous allons créer ensemble un jeu complet en 3D en utilisant Godot Vous apprendrez à travailler dans le moteur, à comprendre le fonctionnement de trois scènes en D et à donner progressivement vie à un jeu jouable grâce à un projet réel Je vais commencer par apprendre à naviguer dans interface Godot et à travailler avec des objets tridimensionnels de base À partir de là, vous passerez à la physique, aux commandes du joueur, à la caméra, à l' éclairage, au la physique, aux commandes du joueur, à la caméra, son, à l'interface utilisateur et à l'IA, tous les systèmes de base qui permettent à un jeu en trois dimensions de fonctionner. Chaque chapitre s'appuie sur le précédent. Vous allez créer des tanks, des environnements, des ennemis et des systèmes de jeu étape par étape, apprenant non seulement quoi faire, mais aussi pourquoi les choses fonctionnent comme elles le font dans Gdo Ce cours est conçu pour les apprenants de niveau débutant à intermédiaire. Vous n'avez pas besoin d'expérience préalable avec Godot ou le développement de jeux en trois Nous allons commencer par les fondamentaux et tout construire ensemble. À la fin du cours, vous disposerez d'un jeu en trois D entièrement jouable et, plus important encore, d'une base solide que vous pourrez utiliser pour commencer à créer vos propres projets Commençons. 2. Installer Godot ot ot: Dans cette très courte leçon, nous allons télécharger et installer le moteur GDOgame , que nous allons utiliser pour le reste de ce Ouvrez donc votre navigateur et rendez-vous sur G DO engine.org Vous pouvez également l'obtenir sur Steam, et au moment de l'enregistrement de ce cours, la dernière version est la 43. Nous cliquons donc simplement dessus et nous accédons au GDOEngine et vous l'obtiendrez pour votre système d'exploitation correspondant Maintenant, nous n'allons pas utiliser la version compatible avec le réseau, alors procurez-vous simplement le moteur Gudo standard Les fichiers binaires compatibles avec le réseau vous permettront d'utiliser C SAP, mais comme nous allons utiliser script GD tout au long de ce cours, cela peut rendre les choses un peu confuses car ce sont deux langages totalement différents Cependant, le code et la fonction C Sharp font appel API et tout cela est en fait très similaire une API et tout cela est en fait très similaire . Si vous vouliez relever un défi et essayer de convertir mentalement GD Script en C Sharp dans votre tête, vous pouvez le faire, mais je ne serai pas tenu responsable de la folie qui en résulterait Alors, faisons en sorte que GdOfurt s'y rende. Et Gadot ne nécessite aucune installation. Vous pouvez simplement le télécharger et copier l'exécutable où vous le souhaitez. Vous pouvez donc le mettre sur votre bureau ou autre. Je vais m'en tenir à toutes mes autres installations de Gadot, et je vous recontacterai dans un instant 3. Aperçu du projet : Zone Battle: Au fil des leçons de ce cours, vous apprendrez à recréer ce jeu de combat de chars de style rétro, similaire au jeu de zone de combat classique publié par Atari publié par Atari Nous allons commencer par les bases de la création d' un tank, d' une arène en trois D, du déplacement du char via la saisie de l'utilisateur, puis de la création d'un système d'apparition configurable d'ennemis alimentés par l'IA à affronter OK, donc une fois ça réglé, commençons. Lorsque vous chargez Gado pour la première fois, vous verrez le chef de projet Cela vous donnera une liste de tous les projets mis à votre disposition et sur lesquels vous avez déjà travaillé. Ou si vous débutez avec une nouvelle installation, vous n'aurez rien. Je vais donc créer un nouveau projet. Vous pouvez donc soit en créer un. Vous pouvez en importer un depuis un endroit spécifique, peut-être depuis une version précédente de Gadot ou depuis un autre endroit que Gado ne surveille pas, ou vous pouvez scanner un endroit en particulier pour y trouver des projets qui existent déjà Nous allons donc créer et lorsque vous créez un nouveau projet, vous avez la possibilité de lui donner un nom de projet. Nous allons donc appeler notre Zone Battle. Et nous allons créer un dossier pour cela. Cela aura aller dans le dossier dans lequel nous lui demandons de placer notre projet , puis de créer un sous-dossier spécifiquement nommé d'après le projet afin que nous n'ayons pas à nous inquiéter d'essayer accidentellement de créer un projet et un dossier contenant déjà des éléments Je vais donc changer cela et mettre ailleurs. Il va entrer dans Larngdo Three D, et nous allons lui donner un nouveau dossier En fait, nous n'avons pas besoin de lui donner un nouveau dossier car nous allons en créer un. Nous sélectionnons donc un nouveau dossier, et ce sera Larndo Three D puis Zone Battle, qui est le nom de notre projet Donc, pour le moteur de rendu, cela dépendra de la plateforme que vous ciblez compatibilité signifie donc qu' il devrait fonctionner sur à peu près n'importe quoi. Et puis le mobile, bien sûr, c'est pour les appareils mobiles. Le rendu, les divers effets et les différentes fonctionnalités prises en charge par Three D ont tendance à être réduits sur appareils mobiles, car ils ne sont pas aussi puissants que le matériel informatique Donc, en gros, si vous ciblez des téléphones, en particulier des téléphones bas de gamme, utilisez le mobile, et il vous le dira ici. Il est donc compatible avec les ordinateurs de bureau et les mobiles. Les cartes graphiques 3D sont moins avancées, moins évolutives, etc. Nous allons utiliser Forward parce que nous allons développer sur un ordinateur de bureau. Et en passant, je ne recommanderais pas d'essayer de suivre ce cours si vous essayez d'exécuter Gadot sur un appareil Android, surtout s'il s'agit d'un téléphone Vous tirerez le meilleur parti de ce cours en travaillant sur un ordinateur de bureau. fois cela réglé, nous confions nos métadonnées de contrôle de version à Git. Nous n'allons pas vraiment faire quoi que ce soit avec Virgin Control dans ce cours. Mais si vous souhaitez télécharger vos données dans le contrôle de source ultérieurement pour sauvegarder, les données seront déjà là. Alors maintenant, nous allons simplement créer Ed Okay. Maintenant que nous avons créé et chargé notre projet, nous allons passer en revue les bases de l'interface utilisateur de Gadot Et pour cela, vous pouvez vous joindre à moi lors de la prochaine leçon, et nous verrons comment fonctionnent les différentes fenêtres, puis nous pourrons commencer notre jeu. On s'y voit ? 4. Naviguer dans Godot : La fenêtre principale, l'arbre de la scène et l'inspecteur ector: Bon retour. Maintenant que vous avez créé votre fichier de projet, nous devons nous familiariser avec l'environnement de développement Godot La fenêtre principale est celle où la majeure partie de votre développement va avoir lieu, et elle est suffisamment importante pour que nous puissions en tirer sa propre leçon. Dans la leçon qui suit, nous verrons comment naviguer dans cette fenêtre. Ensuite, il y a le système de fichiers. Le dossier de ressources du système de fichiers représente le dossier racine de votre projet. Et nous pouvons le vérifier en cliquant dessus avec le bouton droit de la souris et en sélectionnant Open File Manager. Et vous verrez que cela nous amène directement au dossier de zone Battle que nous avons créé au début de notre projet. Voici notre point de projet GadoFile qui est le fichier de projet physique, et voici le point d'icône SVG, qui apparaît Tous les fichiers, ressources, scripts, scènes, tout ce que vous faites glisser ou que vous enregistrez directement dans ce dossier, à condition que Gadot sache de quoi il s' agit et sache comment les importer , apparaîtront ici dans votre système de fichiers Vous pouvez même créer de nouveaux dossiers ici et organiser votre projet comme vous le souhaitez. Ensuite, il y a l'arbre des scènes. L'arbre des scènes est l' endroit où nous suivons la hiérarchie des nœuds qui constituent la scène sur laquelle nous travaillons actuellement. Dans GaDO, tout est représenté par des scènes, et les scènes ne sont que des ensembles de nœuds nœuds eux-mêmes sont simplement composants petits ou parfois qui font différentes choses, et tout ce que vous pourriez vouloir utiliser dans un GadoGame est représenté par un nœud quelconque Ainsi, par exemple, si nous voulions juste un objet en trois D représenté par une position dans un espace en trois D, nous pourrions créer ici un nœud racine, et cela nous donnerait un nœud trois D, et un nœud trois D est littéralement une position dans un espace en trois D, ce dont , bien sûr, nous n'avons pas encore vraiment discuté, donc cela n'aura aucun sens. Mais en plus de cela, nous pouvons ajouter d'autres nœuds en dessous en tant qu' enfants de ce nœud, car à la base de chaque scène se trouve un nœud racine, puis il y a un tas de nœuds attachés en dessous, et tous ces nœuds constitueront votre scène. Nous pouvons donc en créer tout un tas et ils sont tous considérés comme faisant partie de ce fichier. Nous allons certainement étudier une manière plus approfondie d'utiliser l'arbre de scènes dans prochaines leçons et de traiter de la hiérarchie des nœuds , etc. Mais pour l'instant, sachez simplement que tout ce qui se trouve dans votre GodObject sera représenté, stocké et affiché dans cet arbre en particulier Enfin, nous devons parler de l'inspecteur. L'inspecteur vous permettra de modifier toutes les données visibles dans n'importe lequel de vos nœuds. Ainsi, par exemple, puisqu' un nœud en trois D est une position dans un espace en trois D, nous pouvons modifier sa position, sa rotation et son échelle. Nous pouvons donc le déplacer comme ceci et ainsi de suite, et vous verrez que la valeur est mise à jour ici. Mais aussi, si nous voulions changer cela directement, nous le pourrions. Et cela vaut pour à peu près tous les types de nœuds que vous pourriez avoir. Ainsi, par exemple, si nous voulions ajouter quelque chose de différent, comme une caméra, vous pouvez voir maintenant que la caméra possède son propre ensemble de données. Mais comme une caméra est également un nœud trois D, elle disposera de toutes les données disponibles pour nœud trois D en plus de toutes ses données spécifiques à la caméra. Encore une fois, tout ce que vous pourriez vouloir modifier pour un nœud existant est disponible dans cette fenêtre. Et nous allons utiliser cette fenêtre manière intensive afin de définir les informations de nos nœuds étudier pendant que nous déboguons des éléments En parlant de débogage , en bas, nous voyons un tas d'onglets qui ne sont pas développés actuellement, mais l'un d'entre eux est le débogueur, est extrêmement utile, et nous allons certainement l'utiliser le moment venu Ici, vous avez également des éditeurs d'animation audio et de shader, ainsi que la console de sortie N'importe quelle console de sortie est utile si vous souhaitez des informations à la console pendant que le jeu est en cours d'exécution, ou si vous souhaitez rechercher des messages d'erreur ou quoi que ce soit d'autre. Alors voilà. C'est l'éditeur de Gado en bref, et toutes les fonctionnalités de l'éditeur que nous allons utiliser pour créer notre jeu, nous les étudierons certainement plus en profondeur dans les leçons ultérieures Et dans la leçon suivante, comme je l'ai promis, nous allons examiner la fenêtre de l'éditeur. Alors je t'y verrai. 5. Naviguer dans Godot : la fenêtre de jeu et la navigation de base dans l'espace 3D: Mm. Bon retour. Dans cette leçon, nous allons examiner les principes de base de la navigation dans l'espace en trois D de Godo, ainsi que certaines manières de configurer les fenêtres d'affichage et d'orienter les éléments telle sorte que vous puissiez voir ce que vous faites et comment travailler La première chose que je vais mentionner est que la plupart de ces commandes, ainsi que tous les raccourcis clavier que nous pourrions rencontrer au cours de cette aventure, sont fondamentalement les mêmes que pour Blender L'une des façons de le personnaliser est de passer dans paramètres de l' éditeur et d' accéder aux éditeurs, trois D, et à la navigation Non seulement vous verrez tous les différents paramètres, mais il existe également une option appelée Schéma de navigation dans laquelle vous pouvez le modifier de Gdolablender à Maya ou Modo, si cela à Maya ou Modo, vous convient le mieux Il existe également des raccourcis clavier que vous pouvez également modifier, mais nous n'allons pas trop nous y attarder. Ce que nous allons apprendre ici est suffisant pour vous aider à démarrer, puis vous pourrez approfondir les schémas de contrôle à votre guise, car ils peuvent être assez approfondis. La première chose que nous allons noter est donc de savoir comment manœuvrer autour de cette fenêtre Et la première chose à faire est de maintenir le bouton droit de la souris enfoncé, ce qui orientera votre caméra en fonction de sa position dans un espace tridimensionnel. Ensuite, si vous maintenez le bouton central de la souris enfoncé, il tournera autour de la caméra. Enfin, si vous devez déplacer la caméra, vous pouvez maintenir la touche Shift enfoncée et utiliser le bouton central de la souris manœuvrer votre caméra Ainsi, une combinaison de ces trois éléments vous permettra d' orienter votre appareil photo de telle sorte que vous puissiez voir ce que vous regardez. Vous avez également ce petit gadget dans le coin supérieur droit de votre écran qui vous permettra de prendre rapidement une orientation particulière Comme vous pouvez le voir, si je clique sur le X, le Z ou le Y, il le fermera immédiatement de telle sorte que cet axe pointe directement sur moi, puis les deux autres seront orientés de la même manière. Ainsi, vous pouvez également savoir en un coup d'œil quelle est votre orientation si vous ne vous souvenez pas nécessairement de la couleur des axes. L'axe Z est donc bleu, l'axe rouge est X et l'axe jaune verdâtre est Y. Donc, en regardant rapidement cela, je peux voir que Y est droit haut en bas, donc je regarde droit Et cela est renforcé par ce petit indicateur ici, qui est orthogonal en haut Cela signifie que je suis au-dessus de tout ce que je regarde, en regardant droit vers le bas parce que je regarde vers le bas, sur l'axe Y. Et puis si nous cliquons à nouveau dessus, rien ne se passera. Hum, et maintenant nous sommes au bas de l'échelle. Donc, si je devais cliquer dessus pour X, cela le ferait. Et puis si je clique dessus, qui est l'opposé de Z, cela le placera au premier plan, ce qui signifie que nous le regardons de l'arrière. Vous pouvez donc également modifier ces orientations plutôt que de jouer avec ce petit contrôle en cliquant avec le bouton gauche de la souris sur les trois boutons ou sur les trois points situés dans ce coin. Vous pouvez désormais choisir l'une de ces vues, et vous pouvez également voir les différentes combinaisons de touches associées à ces vues, si vous souhaitez y passer rapidement. Donc, si je voulais aller vers la gauche, je peux le sélectionner sur la gauche. Et si je voulais aller à l'arrière, je peux le sélectionner depuis l'arrière et ainsi de suite. Ce faisant, il passe à ce que l'on appelle une vue orthogonale, signifie essentiellement que vous regardez droit dans le champ et qu'aucun calcul de profondeur n'est pris Donc normalement, si vous passez en perspective, vous pourrez voir la vue en perspective. Et c'est essentiellement des mathématiques. Si vous n'en savez rien, vous n'avez pas vraiment à vous en inquiéter. En général, vous allez travailler en perspective neuf fois dix, car cela vous donne notion la plus réaliste de ce que vous voyez. En gros, une fois que vous aurez appris à travailler avec les trois D, vous saurez quand vous devez utiliser la vue orthogonale et vous pourrez passer à cette option Si j'essaie de vous dire dans quelles circonstances les vues orthogonales sont utilisées, vous n' y arriverez probablement pas Alors ne vous inquiétez pas pour le moment. Mets-le en perspective et tout ira bien. Et nous avons également la possibilité de fournir plusieurs fenêtres d'affichage. Donc, si je clique sur le petit bouton d'affichage ici, j'ai la possibilité de diviser ma fenêtre en deux, trois ou même quatre fenêtres. Et une fois que j'aurai mis une caméra dans le monde et que nous verrons comment elle fonctionne dans la leçon sur les caméras, je pourrai changer l'une de ces vues pour qu'elle me montre ce que voit ma caméra. De cette façon, je pourrai travailler et comprendre ce que le joueur va voir, ainsi que la façon dont mes modifications se répercuteront sur le joueur. Donc, si nous cliquons dessus, nous reviendrons à Viewport One Et oui, ça devrait nous convenir. Maintenant que nous pouvons manœuvrer dans notre monde en trois D, je vais vous montrer comment manœuvrer notre ami du cube dans l'espace en trois D, mais ce sera une leçon en soi. Je t'y verrai. 6. Primitifs et espace 3D – Rotation, mise à l'échelle, traduction: Bon retour. Nous en sommes maintenant au point où nous pouvons commencer à étudier la manipulation d'objets dans un espace tridimensionnel. Et heureusement pour nous, nous n'avons pas besoin de créer ces objets nous-mêmes. Au minimum, si nous n'utilisons pas trois modèles en D que nous avons créés ou créés ailleurs, nous pouvons définir des éléments en utilisant ce que l'on appelle des primitives afin de fournir des espaces réservés Et c'est exactement ce que nous allons faire pour le moment créer nos objets à partir d'espaces réservés Le tout premier espace réservé que nous allons apprendre à utiliser est donc que nous allons apprendre à l'instance de maillage Et techniquement, l'instance de maillage n' est pas un espace réservé, mais elle fournit des primitives d'espace réservé que nous pouvons utiliser Nous pouvons donc soit créer une nouvelle scène en trois D avec un nœud trois D à sa racine, soit passer à un autre nœud et sélectionner l'instance de maillage trois D, et c'est ce que nous allons faire. Alors, qu'avons-nous fait exactement ici ? Eh bien, nous avons créé une nouvelle scène, et à la base de cette scène se trouve un nœud 3D d'une instance de maillage. Maintenant, le nœud trois D de l'instance de maillage, en plus d'être difficile à dire, est un nœud trois D, ce qui signifie qu'il a une position et une orientation dans un espace en trois D, mais qu'il possède également des valeurs supplémentaires. Et l'une de ces valeurs est la propriété du maillage. Donc, si nous élargissons cette liste déroulante, nous voyons tous ces différents maillages que nous pouvons créer Et celui que nous voulons, c'est un nouveau maillage de boîte. Boum. Maintenant, nous avons une boîte. Si nous ne voulions pas de boîte, nous pourrions en faire une capsule ou un quad, ce qui est une façon élégante de désigner un rectangle plat. Nous avons également un prisme, qui est un triangle Donc oui, cela nous permettra de créer tout un tas de types de puits différents , il y a même un Taureau C'est chouette. J'ai un beignet Faisons des cuves à beignets. Ça va avoir l'air hilarant. Peut-être que je me ferai des ennemis en aéroglisseur vers la fin du cours Bref, revenons à notre boîte. Cela nous donne un cube et c'est une chose merveilleuse. Maintenant, si nous cliquons sur le cube lui-même, cela va ouvrir le maillage et nous permettre de changer les choses à son sujet. Et avant cela, nous devons noter que ces objets maillés, qu' il s'agisse d'un maillage cylindrique, d'un maillage simple, etc., sont ce que l' on appelle une ressource. Gadot travaille donc en fait avec deux types d'objets différents L'un est un nœud, qui sera placé dans l'arbre de votre scène, et l'autre est une ressource. Et une ressource est essentiellement une collection sophistiquée de données. Et parfois, nous avons besoin de ressources à l'intérieur de nos nœuds. Ainsi, par exemple, une instance de maillage en trois D nécessite un maillage. Qu'est-ce qu'un maillage ? Eh bien, un maillage est un ensemble de points et faces qui, lorsqu'il est rendu par le moteur de jeu Gadot, nous fait voir un cube, et ces données sont conservées dans un fichier, qui constitue nos ressources de maillage un peu plus ou un peu SVG à points d'icône est un peu plus ou un peu moins déroutant Un fichier SVG est un fichier image. Et qu'est-ce qu'un fichier image, mais juste un tas de bits qui le déterminent ? Eh bien, dans le cas d'un fichier SVG, il s'agit en fait d'un art vectoriel Mais s'il s'agissait d'un bitmap, il s'agirait d'un ensemble de données indiquant les couleurs les positions et quelques autres valeurs au sein du bitmap Nous aurions donc besoin de ce fichier bitmap pour les textures, les sprites ou quoi que ce soit d'autre Ainsi, par exemple, le sprite serait le nœud et nécessiterait une ressource bitmap C'est une façon sophistiquée de dire qu'un maillage nécessite un maillage, et qu'un maillage est une ressource, et c'est ainsi que nous procédons. Nous créerons des ressources plus tard dans le cours lorsque nous travaillerons sur nos interfaces utilisateur et d'autres éléments similaires. Mais nous avons maintenant des choses que nous pouvons changer dans le cadre de la ressource. Donc, si nous voulons changer sa taille dans les directions X et Z, par exemple, pour l' agrandir, nous le pouvons. Et encore une fois, nous avons notre petite flèche circulaire ici pour remettre les choses à la normale si nous le voulons ainsi. Et nous avons également des éléments qui peuvent indiquer la texturation et un tas d'autres éléments que nous examinerons plus tard, mais nous n'allons probablement pas les modifier dans le maillage lui-même Nous allons le changer ailleurs. Mais maintenant que nous avons un cube, nous pouvons l'orienter et le déplacer. Et la première chose que nous allons faire est étendre la propriété de transformation de la partie en trois D du nœud des données des instances de maillage dans l'expecteur et nous allons examiner la position, la rotation et l'échelle Ces trois groupes de nombres déterminent la position, la rotation et l'échelle des cubes dans l'espace mondial La position d'un objet dans l'espace du monde est indiquée sur trois axes, qui sont représentés par des lignes Comme vous pouvez le voir ici, la ligne rouge, le X, va de gauche à droite, la ligne Z, qui est bleue, va vers l'horizon, puis la ligne jaunâtre-verdâtre, l'axe Y, est vers le haut ou La modification de la valeur sur l'un de ces axes ou sur l'un de ces axes modifiera la position de l' objet dans l'espace. Donc, en ce moment, c' est ce que l'on appelle l'origine, qui est le point mort, zéro, zéro, zéro, comme vous pouvez le voir. Maintenant, si nous voulions déplacer l'objet vers le haut, nous pourrions changer son Y en, par exemple, un, et maintenant il est déplacé. Nous pouvons également modifier sa position à l'aide de ces flèches. Donc, à l'heure actuelle, ce que nous voyons, ce sont toutes les commandes disponibles pour cet objet, nous pouvons donc en faire ce que nous voulons Mais nous pouvons également limiter les commandes avec ces boutons en haut. Donc, si nous voulons uniquement déplacer notre objet, nous cliquons sur ce bouton pour le mettre en mode déplacement, qui masquera les autres commandes de rotation, ce qui signifie que nous ne pourrons pas le faire pivoter, nous pourrons simplement le déplacer le long de l'axe ici. Les flèches sont donc assez explicites , mais ce qui prête un peu à confusion, ce sont ces petits rectangles Et ces rectangles sont un moyen rapide de déplacer quelque chose le long d'un plan particulier Ainsi, par exemple, celui-ci ici, ce bleu, déplacera l'objet par rapport aux coordonnées X et Y ou essentiellement le long du plan horizontal que constituent ces deux axes. Remettons donc cela à zéro. Et si je devais commencer à les déplacer, vous verrez que mes valeurs X et Y changent ici dans l'inspecteur. Si je devais faire de même avec ce vert, il serait sur les axes X et Z et idem pour le rouge sur les axes Y et Z. Cela fournit donc un moyen rapide de déplacer l'objet dans une orientation particulière. Ainsi, par exemple, si vous vouliez simplement faire glisser un objet sur le sol sans le faire accidentellement glisser vers objet sur le sol sans le faire accidentellement le haut dans les airs, vous pouvez soit le déplacer comme ceci, soit le déplacer comme ça, selon l'angle de votre regard Et il devient un peu plus facile d'orienter l'une de ces choses si vous regardez dans une direction particulière, et maintenant je peux passer à D. modification de la position d'un objet dans un espace physique en trois D est donc connue sous translation et est représentée ici par la propriété position. De plus, et nous les examinerons un peu plus à l'avenir, un ensemble de valeurs multiples telles que X, Y et Z est connu sous le nom de vecteur. Et il y a toutes sortes de calculs que nous allons faire avec des vecteurs afin déplacer des objets, de faire des calculs physiques et toutes sortes d'autres choses amusantes. Mais nous y reviendrons dans une prochaine leçon. L'étape est la rotation, et la rotation peut être réglée avec le mode de rotation ou simplement en le remettant en mode sélection afin que vous puissiez faire tout ce que vous pouvez pour les réorienter toutes. Mais revenons au mode rotation. Et le mode rotation vous permettra de faire pivoter l'objet le long des trois axes. Donc, si je voulais faire une rotation autour de l'axe X, j' utiliserais celui-ci rouge. Ensuite, si je voulais manœuvrer pour l' orienter autour de l'axe jaune, j'utiliserais l'axe jaune , puis le bleu, bien sûr, est l'axe Z. Et vous remarquerez également une chose lorsque vous survolez ces boutons, vous verrez qu' ils affichent des touches de raccourci qui vous permettront tirer des fonctionnalités supplémentaires Ainsi, par exemple, si nous maintenions la commande enfoncée puis que nous essayions de faire pivoter cet objet, il s'accrocherait à la grille. Donc, comme vous pouvez le constater, sa rotation n'est pas fluide. Il saute d' un point à l'autre. Et cela serait un peu plus évident si nous revenions en mode déplacement, car chacune de ces intersections de la grille est une coordonnée sur la grille Donc, si je maintiens le contrôle enfoncé et que je le déplace maintenant ici, vous verrez qu'il s' enclenche au centre de ce point, soit 000 moins un, je suppose, dans la direction Z. Oui, eh bien, zéro, zéro, un, en fait, parce que le Z positif va vers vous et le Z négatif revient à l'horizon. Nous. Mais comme vous pouvez le constater, il s'agit de chiffres entiers correspondant aux différents emplacements de la grille chiffres entiers correspondant aux différents emplacements de Et vous pouvez, bien sûr, modifier ce cliquetis. Eh bien, pas là, mais vous pouvez modifier cette capture dans les paramètres de votre éditeur. Ce n'est pas ça. Très bien, revenons en arrière. Enfin, nous avons l'échelle, et l'échelle est un peu étrange car l' échelle modifie la taille d'un objet d'une manière particulière. Donc, pour le moment, ils sont tous les trois verrouillés. Donc, si je change l'un d'entre eux, cela changera également les autres, ce qui signifie qu'il sera redimensionné uniformément dans toutes les directions Si je les dissocie en cliquant sur ce bouton ici, je peux modifier chacune d'elles individuellement, qui signifie que je peux les étirer ou écraser le long d'un axe en particulier Maintenant, le problème ici est que ces valeurs modifient les valeurs définies ici. Donc, si je dis que mon cube était un par un, puis que je le redimensionne dans les directions X, Y et Z de telle sorte qu'il soit deux et deux, oh, ça n'a pas marché. Et c'est parce que j'aurais dû le faire avant de les relier à nouveau. Ce qui se passe, c'est qu'il faut le prendre un par un et le faire exploser en fonction de ce facteur pour que ce soit en fait deux par deux. Maintenant, si je devais changer cela pour que X soit deux, ce serait maintenant fonctionnellement quatre S un, deux, trois ou un, deux, trois, quatre, car cela multiplie la taille de base d'origine de l' objet par la valeur d'échelle Et cela prête à confusion car la mise à l'échelle d'objets peut perturber la physique, car les calculs physiques supposent que l'objet est d'une taille alors qu'il en a l'air d'une autre. Mais en général, vous utiliseriez à l'échelle pour réparer un objet qui n'était pas réglé à la bonne échelle lors de sa création dans Blender ou autre. manière générale, lorsque vous créez un objet, vous voulez qu'il soit à la bonne échelle dans l'espace mondial Donc, les coordonnées de l'espace mondial que nous voyons ici dans la position et ainsi de suite sont toutes exprimées en mètres, mais c'est complètement arbitraire Nous pourrions facilement les considérer comme pieds ou des mètres ou quoi que ce soit d'autre. L'ordinateur s'en fiche d'une façon ou d'une autre. Il sait simplement que cette valeur est une, et c'est tout ce qu'elle est. Mais lorsque nous créons les objets dans notre logiciel de modélisation, par exemple, vous avez besoin d'un cadre de référence. Ainsi, par exemple, un humain est ce qui mesure 1,5 mètre, plus ou moins. Je suis désolée Je viens des États-Unis, donc il y a ces valeurs de métriques insensées nous ne connaissons pas, vous savez. Mais disons simplement qu' un humain mesurait 1,6 mètre haut et qu'un jet mesurait environ 10 mètres de long. Eh bien, si vous modélisiez un humain et un jet dans un mixeur, vous devriez vous assurer que l'humain 1,6 mètre de long et que le jet mesure 10 mesure 1,6 mètre de long et que le jet mesure 10 mètres de long afin de pouvoir mettre l'humain dans le jet et que tout soit de la bonne taille. Supposons que pour une raison ou une autre, le modélisateur ait créé le jet à une échelle différente, peut-être qu'il était censé être une miniature ou quelque chose comme ça, puis vous deviez l'utiliser comme un jet grandeur nature, puis vous les avez importés ensemble, et la personne est infiniment plus grande que le jet, vous voudriez soit réduire la taille de l'humain, soit augmenter le jet, et j'espère que la physique ne se cassera pas, oui, c'est généralement pourquoi vous utilisez la mise à l'échelle. La plupart du temps, cependant, vous allez laisser la mise à l'échelle à un , puis modifier la taille de vos primitives C'est du moins ce que nous allons faire. C'est le moins déroutant du lot. Donc, respectivement, voici nos boutons de rotation, puis nous avons également nos boutons d'échelle, notre bouton d'échelle ici. Nous serions donc en mesure d'évoluer de cette façon, comme nous le faisions là-bas. Et puis, bien sûr, les rectangles fonctionnent de la même manière. C'est juste qu'au lieu de le déplacer, il va le redimensionner. Donc, oui, c'est ainsi que l'on peut manipuler l'orientation de base d'un objet en trois D dans un espace en trois D. Dans notre prochaine leçon, nous allons examiner les matériaux, puis nous allons construire un réservoir et commencer à déplacer le réservoir en utilisant ce que nous avons appris ici. Je t'y verrai donc. 7. Fournitures: Bon retour. Dans cette leçon, nous allons examiner brièvement fonctionnalités de base d'un matériau maillé Le matériau est une ressource qui définit essentiellement de nombreux aspects de l'apparence d' un objet, qu'il s'agisse de sa texture, de son éclairage, de sa transparence ou de nombreux autres éléments La pâte permet d'obtenir un tas d' effets différents qu' il faudrait normalement utiliser un shader pour créer Mais en raison de la puissance de leurs matériaux, vous n' avez pas à vous en soucier. Ajoutons donc un matériau à notre objet, et nous pouvons simplement cliquer sur le maillage pour ouvrir les propriétés du maillage. Et à peu près à mi-chemin, vous verrez le matériau descendre, et nous allons créer un nouveau matériau standard, trois D. Comme vous pouvez le constater, il existe trois types de matériaux différents. Le matériau du shader vous obligera à écrire un shader pour gérer spécifiquement la manière dont vous souhaitez que l'objet soit rendu, qui dépasse largement le cadre de ce que nous allons faire ici Passons donc à un matériau standard en trois D, et maintenant vous pouvez voir que notre bloc a légèrement changé, et cela est dû aux paramètres par défaut du matériau. Donc, si nous cliquons une fois sur le matériau, le menu déroulant des matériaux s'agrandira. Et ouah, il y a plein de choses là-dedans. Le premier et le plus important que nous devrions examiner est donc l' albédo ou l'albédo Je ne sais pas exactement comment cela se prononce. Mais l'Albedo contrôle à la fois la texture et la couleur de l'objet Notre objet n'est donc absolument pas texturé, comme vous pouvez le constater. Et si nous voulons changer de couleur, nous pouvons cliquer une fois sur la couleur. Et puis, au fur et à mesure que nous le changeons, vous pouvez voir la couleur de l'objet changer dans notre fenêtre. Nous allons le réinitialiser. Nous pouvons également ajouter une texture à l'objet. Prenons donc notre SVG à points d'icône et ajoutons-le là-bas. Et maintenant, vous pouvez voir que votre objet est texturé, même si la mise à l'échelle n' est pas particulièrement bonne car cette texture n'a pas été conçue pour cet objet en tête Nous pourrions résoudre ce problème en ouvrant l'UV et en modifiant l'échelle. Nous allons donc le faire juste pour voir comment cela fonctionne. Et je crois que oui. On dirait que c'est Whoops On dirait que ça va être deux et deux. Peut-être pas Essayez-en trois. Allons-y. UV font donc référence aux coordonnées de la texture telle qu'elle est recherchée et projetée sur l'objet. Les coordonnées UV commencent à zéro, puis elles vont jusqu' à un dans le coin le plus éloigné de la texture. Et en fonction de l'endroit sur la face de la texture que nous essayons de rendre, Godot recherchera le pixel à cet endroit, puis le projettera ici Mais encore une fois, étant donné que cette texture n'était pas correctement mappée dans Blender ou ailleurs sur cette image, nous avons dû l'ajuster ici pour qu'elle s'adapte parfaitement Nous pouvons donc le supprimer simplement en appuyant sur la flèche circulaire de notre ami, puis nous monterons ici et nous l'effacerons. En fait, remettons-y une seconde. Parce que vous pouvez également le teinter en changeant la couleur de l' albédo Ainsi, entre ces deux éléments, vous pouvez avoir un bon contrôle sur l' apparence réelle de votre objet. Donc, ce que fait Gadot, c' est prendre la texture, puis il la teinte en fonction de la couleur Donc, si vous voulez juste la couleur réelle, vous allez la laisser en blanc. Alors clarifions-le à nouveau. Et le point suivant qui nous intéresse est celui de la transparence. Donc, si vous voulez un objet semi-transparent, vous pouvez le modifier. Vous pouvez faire passer de désactivé à l'une de ces différentes valeurs. Alpha est le plus simple. Maintenant, bien sûr, cela ne va pas paraître différent car notre albédo est totalement opaque Donc, si nous revenons en arrière, que nous élargissons notre albédo, puis que nous modifions l'Alpha, qui est la transparence, vous pouvez maintenant voir que l'objet devient plus transparent et nous pouvons réellement voir Je vais le changer à nouveau. Un autre élément intéressant est le métal et sa rugosité correspondante Ces deux éléments vous permettront donc de donner à l'objet un aspect plus métallique, d'où son nom. Ensuite, la rugosité déterminera la qualité et la rugosité de l'objet Ce faisant, déterminez la quantité de lumière qui se dégage réellement de l'objet. Nous n'obtenons pas une image totalement précise des paramètres de notre cube, en partie à cause de l'éclairage de l'environnement, que nous allons certainement modifier lors d'une prochaine leçon. Mais si vous voulez voir à quoi cela est censé ressembler, toutes choses étant égales par ailleurs, vous pouvez regarder l'aperçu en haut du document, vous montrera les résultats des réglages. Donc, si nous devions changer cet albédo, disons qu'il est légèrement foncé ou gris, et si nous déplaçons bien le métal vers le bas, le métal est Nous allons baisser légèrement le spéculaire et diminuer un peu plus la rugosité et diminuer un peu plus la rugosité . Ça n'a pas l'air bien. Donc, oui, comme vous pouvez le constater, modification de ces valeurs changera l'apparence de votre objet, et cela deviendra particulièrement intéressant une fois que nous aurons intéressant une fois que nous aurons commencé à intégrer l'éclairage. Une autre méthode que nous allons éventuellement utiliser est l'émission, et l'émission permettra l'objet d'émettre de la couleur et de la lueur. Donc, si nous l'activons, puis que nous changeons la couleur d'émission pour qu'elle soit verte, maintenant l'objet brille en vert, et si nous changeons le multiplicateur d'énergie, il brille vraiment Et nous avons également un tas d'autres paramètres intéressants que nous approfondirons plus tard lorsque nous déciderons d'embellir notre jeu. nous allons donc Dans la leçon suivante, nous allons donc construire le tank contrôlé par le joueur à partir de primitives, et nous allons utiliser l'albédo, les métaux et la rugosité pour lui donner une apparence à moitié à Ensuite, dans les leçons suivantes, nous allons revoir certains de ces paramètres matériels et ajouter des ces paramètres matériels et ajouter textures, des cartes à bosses et tout ce qui est intéressant pour donner à notre jeu une apparence vraiment belle N'hésitez pas à jouer avec ces valeurs. Il n'y a pratiquement aucun moyen pour vous de les casser. Et puis, tu sais, le pire arrive au pire. Il suffit de revenir à la matière et de dire « c'est clair », puis vous n'en reviendrez à aucune matière, puis vous pourrez recommencer à zéro. Passons donc à la leçon suivante où je vais vous expliquer comment construire notre tank et l' embellir un peu, puis nous créerons le monde, et nous nous déplacerons dans le monde. On se voit là-bas. 8. Construire des objets complexes à partir de modèles primitifs : le réservoir ank: Bon retour. Ce que nous allons faire maintenant, c'est développer nos nouvelles compétences de manipulation primitive, et nous allons construire tous les composants à partir de primitives que nous allons utiliser dans notre jeu Ce n'est généralement pas ce que vous feriez pour un produit professionnel. Vous avez généralement une équipe artistique qui crée vos maillages et tout le reste pour que vous puissiez les importer . Nous y reviendrons plus tard dans le cours, important de plus beaux modèles à utiliser dans notre jeu Mais lorsqu'il s'agit de prototyper et de simplement mettre en place des éléments pour que vous puissiez les voir fonctionner ou simplement mettre en place quelque chose commencer à coder votre script de mouvement, par exemple, ce genre de choses est inestimable De plus, si vous optez pour un look low poly extrêmement rétro, vous voudrez peut-être créer vos objets comme celui-ci en premier lieu. Donc, en fin de compte, dans cette leçon, nous allons construire notre tank, puis dans notre prochaine leçon, puis dans notre prochaine leçon, nous allons construire le terrain de jeu et également examiner comment économiser des scènes individuelles pour dupliquer des objets Commençons donc par une nouvelle scène en trois D. Il suffit donc de cliquer sur une scène en trois D, et cela vous donnera un nœud trois D. Et ce nœud trois D est essentiellement un nœud vide qui est purement une position dans un espace en trois D, comme nous l'avons déjà vu, représenté par notre objet de transformation ici dans l'inspecteur. Nous allons le renommer, alors cliquez dessus une fois pour le sélectionner, puis cliquez à nouveau dessus, ou vous pouvez cliquer dessus avec le bouton droit de la souris et sélectionner renommer, et nous allons le nommer Tank Et dans les prochaines leçons, nous allons éventuellement dupliquer ce tank pour nous faire des ennemis. C'est donc une bonne idée de sauvegarder votre travail. Alors pourquoi ne pas sélectionner Enregistrer la scène, et nous la placerons à la racine de notre dossier de ressources, ce qui signifie qu'elle ira à la racine de notre projet, et nous allons simplement sélectionner Enregistrer, et cela nous donnera notre scène de tank. Maintenant, si vous voyez ce message d'erreur ici, ne paniquez pas. s'agit d'un bug et d'un Gadot qui existent depuis un certain temps à l'ère des quatre points deux, et il ne semble pas encore avoir été corrigé Encore une fois, au moment de cet enregistrement, nous sommes dans une écurie 43. Donc, encore une fois, si vous voyez cette erreur, ignorez-la. Cela n' affecte en fait rien, et cela finira par être corrigé. Allez, oh, nous allons utiliser un groupe d'instances maillées à trois D pour construire notre tank. Donc, la première chose que nous allons faire est cliquer avec le bouton droit sur Tank, et nous allons créer le nœud Adhild Et nous allons travailler de manière approfondie avec le nœud 3D de l' instance Mesh ici. Notez également qu'une fois cette fenêtre de création de nœud ouverte, vous pouvez réellement rechercher si vous connaissez le nom du nœud. Sinon, vous pouvez simplement étendre les arborescences de nœuds jusqu'à obtenir ce que vous voulez. L'essentiel de ce avec quoi nous allons travailler se trouve dans la branche node three D, pour ainsi dire. Au moins jusqu'à ce que nous travaillions dessus ou au moins jusqu'à ce que nous commencions à créer notre interface utilisateur et à travailler avec le son et d'autres choses de ce genre. Quoi qu'il en soit, pour l'instant, nous allons simplement cliquer sur le maillage en trois D, et nous allons en créer un nouveau. Maintenant que nous avons un maillage en trois D, nous pouvons ajouter une nouvelle primitive. Nous allons donc faire défiler ce dossier, et nous avons besoin d'un nouveau maillage, et voilà, notre bon ami le cube. Maintenant, ce que nous allons faire, c' est que ce cube sera le centre de notre réservoir. Je vais donc lui donner un nouveau matériau, un nouveau matériau standard en trois D, et je vais le changer en gris. Alors élargissez l'albédo, cliquez sur la couleur, faites glisser le produit un peu vers le bas jusqu'à ce que nous obtenions quelque chose de beau et gris , et c' est parti En général, lorsque vous modifiez la taille de ces primitives, vous devez presque toujours travailler directement dans l'inspecteur, car Gadot, du moins pour autant que je sache, ne dispose d'aucun outil pour étirer et écraser directement les objets dans la fenêtre Alors allons-y et disons que c'est maintenant 0,5, mais faisons en sorte que ce soit 0,25 Maintenant, ce que je fais ici est purement artistique. En fin de compte, je vais bricoler un tas de ces primitives pour qu'elles ressemblent à un tank N'hésitez pas à changer tout cela, à changer les couleurs, à changer les proportions, donner à votre tank l'apparence que vous souhaitez. Il n'y a que deux choses que vous devrez faire exactement de la même manière que je les ai faites, principalement en ce qui concerne la parentalité de la tourelle, et nous nous en occuperons une fois arrivés là Donc ça va faire 0,25 mètre de haut, et disons que ça va être Whoa, c'est trop grand. C'est également dans la mauvaise direction. Disons, 3 mètres plus ou moins, ou en voulons-nous cinq ? Oui, bonne question. Très bien, partons avec trois et voyons où le vent nous emmène Et 1 mètre de large, c'est bien. Maintenant, pour créer la moitié inférieure du réservoir, vous pourriez être tenté de simplement utiliser le contrôle D et de dupliquer votre maillage, de le faire contrôle D et de dupliquer votre maillage, glisser vers le bas, puis de commencer à le manipuler Mais tu aurais un problème. Parce que depuis que vous avez dupliqué le nœud existant, ces nœuds partagent la même ressource de maillage Cela ne dupliquera pas la ressource de maillage elle-même. Donc, si vous deviez changer cela maintenant, passons à cinq, cela les changera tous les deux parce qu'ils fonctionnent à partir du même maillage. Donc, ce que vous voulez faire ici, c'est changer. Vous allez donc accéder à la liste déroulante du maillage, et vous allez sélectionner Rendre unique. Et cela vous permettra de modifier ce maillage sans affecter le maillage existant. Et c'est ce que nous allons faire. Nous allons donc tout réinitialiser pour que ce soit à nouveau un cube, et nous allons changer la couleur du matériau parce que maintenant nous voulons qu'il soit vert. Et nous avons exactement le même problème parce que, encore une fois, il s'agit de partager le matériel. Nous voulons donc changer cela et le rendre unique également. Et maintenant, si on change la couleur de l'albédo, on devrait avoir There we go Maintenant, nous pouvons obtenir un beau vert sans que cela n' affecte quoi que ce soit d'autre. Cliquez dessus une fois pour fermer. D'accord, donc la largeur est la même, et nous allons faire le Y à un demi-mètre Et ce que vous pouvez faire ici, c'est utiliser les flèches pour changer l'orientation, et vous pouvez cliquer dessus pour des vues orthogonales afin que vous puissiez aligner les éléments aussi obtenir des vues orthogonales afin que vous puissiez aligner les éléments aussi parfaitement que vous le souhaitez Mais vous pouvez également le faire par le biais de la transformation. En saisissant directement les chiffres. Et dans l'ensemble, c'est ce que j'ai tendance à faire parce que je sais à quel point les choses que je fabrique sont importantes. Donc, dans ce cas, le Y est d' un demi-mètre de hauteur, ce qui signifie que de zéro au bas, il y aura 0,25 Donc, si je le change à 0,25, cela devrait mal l'aligner Et c'est parce que, c'est vrai. Eh bien, faites en sorte que ce soit 0,5, et ce sera également faux. Est-ce que c'est zéro ? D'accord, eh bien, ça me sert bien pour essayer de faire des maths dans ma tête. D'accord, nous allons simplement le faire glisser ici. Et si vous zoomez suffisamment, vous pouvez voir que c'est à peu près aussi proche que cela compte. Je vais également mentionner l'une des raisons pour lesquelles vous ne voudriez pas faire cela pour un jeu réel, même si dans notre cas, comme notre jeu est suffisamment low-poly, cela n'affectera pas vraiment quoi que ce soit , vous allez avoir des problèmes d'optimisation. Ainsi, par exemple, une fois que nous aurons terminé notre réservoir, nous ne verrons jamais cette face de ce cube car elle sera cachée par la moitié inférieure du réservoir. De même, nous ne verrons jamais le haut de ce cube vert car il sera également masqué par ce bloc gris. Et même si nous ne les verrons jamais. Gadot va toujours essayer de les rendre. Donc, ce qui va se passer, c'est que Godot va produire Godot va produire un tas de choses que nous ne verrons jamais vraiment, ce qui n' entraînera pas de baisse de performance dans notre cas, car notre jeu est tellement low-poly que cela n'a pas d'importance Mais vous devriez finalement créer ces maillages dans un programme externe tel que Blender de telle sorte que ces visages invisibles ne fassent tout simplement pas partie du modèle Mais encore une fois, nous ne faisons que prototypage, donc c' est parfaitement bien. Nous allons donc juste reculer un peu pour lui donner un aspect plutôt cool. Ensuite, nous allons dupliquer ce maillage et le reculer un peu plus loin. Et ce que nous allons faire ici c'est transformer le maillage en prisme, et nous allons lui donner son propre matériau, encore une fois, un nouveau matériau standard Nous voulons cependant qu'il ait la même couleur que les autres matériaux. Nous allons donc étendre cela. Nous allons aller à Albedo. Et puis quand on clique sur la couleur, on a maintenant une petite pipette Donc, si nous cliquons sur le compte-gouttes et que nous allons ici, nous pouvons obtenir exactement la même couleur, ce qui signifie que maintenant ces deux éléments correspondent L'un des réglages pratiques du prisme est donc celui-ci de gauche à droite, qui vous permet d'incliner le haut du triangle Donc, si nous le mettons à zéro, ce sera un triangle parfaitement droit. Et maintenant, nous voulons faire tourner ce type pour qu'il ressemble à ça Et assurons-nous que la transformation est correcte. C'est donc un peu bizarre. Nous voulons donc que ce soit 180 points égaux, et c'est parti. Et maintenant, nous allons avoir besoin que ce soit à la même hauteur que celui-ci ici. La hauteur est donc égale à la moitié dans la direction Y. Nous allons donc le remplacer par une moitié dans la direction Y. Et nous voulons qu'il ne soit pas aussi large dans la direction X. Faisons donc en sorte que ce soit 0,5. Et nous pouvons l'apporter, mais ce est toujours pas parce que c'est trop gros. C'est que l' autre est trop loin. Donc, si nous le déplaçons là, puis que nous cliquons dessus et que nous le déplaçons ici, cela semble plutôt bon, même si nous devons les augmenter un peu en termes de transformation Je n'ai toujours pas encore compris ce que cette position Y est censée être. Zéro, 3,75 peut-être. Ça a l'air plutôt bien. Et puis ce maillage doit être légèrement surmonté. Devrait être 0,5, moins 0,5. Allons-y. Ça a l'air plutôt bien. Mais j' aimerais savoir, d'accord, ce matériau semble en fait trop sombre. Nous voulons donc qu'il en soit de même. Nous allons donc ouvrir ceci et l'albédo. D'accord, il y a cet hexagone, puis on regarde celui-ci On y va, l'albédo. Oui, ce sont des numéros différents. Nous allons donc copier celui-ci. Attendre ? Non S'agit-il du même numéro ? Copiez celui-ci. Va ici Non, ils ne sont pas de la même couleur. Je ne sais pas ce que j'étais. Je ne sais pas ce qui s'est passé là-bas. C'est probablement à cause de l'éclairage, en fait. OK, allons-y. C'est parfait. Maintenant, nous allons prendre celui-ci ici et nous allons le dupliquer, puis nous allons le faire tourner et l'utiliser pour l'autre partie ici. Donc, encore une fois, nous allons élargir le maillage. Nous allons étendre la transformation. Nous transformons, nous allons changer le Y doit être 180 maintenant. Alors maintenant, nous l'avons alterné. C'est ce que nous voulons, et celui-ci va faire 2,5 heures ? Non, eh bien, j'ai fait la même erreur qu'avant. Je dois le rendre unique. Allons-y. Et c'était quoi ce T2, c'est trop. 1,5. Ça a l'air plutôt bien. Déplacez ça. 0,75. Cool. Bien, c'est le fond de notre réservoir, et il a l'air plutôt beau Nous allons maintenant dupliquer les trois. Nous en sélectionnons donc un en cliquant dessus avec le bouton gauche, puis nous décalons le clic gauche pour les obtenir tous les trois. Ensuite, nous pouvons les dupliquer. Ensuite, nous pouvons les faire pivoter le long de l'axe X. Allons donc à 180 degrés, et maintenant nous les déplaçons vers le haut. Quelle était la valeur négative de celui-ci ? Nous pouvons donc le copier. Et une fois que nous les avons sélectionnés tous les trois, nous pouvons réellement modifier toutes leurs positions en même temps. Et nous devons inverser le signal à cet égard. Boum. OK, alors appuyons sur Contrôles, assurez-vous de sauvegarder notre travail au cas où notre ordinateur exploserait, parce que nous ne voulons pas avoir à tout recommencer Et maintenant, nous allons fabriquer la tourelle. Mais avant de le faire, il serait judicieux de les regrouper sous le nom de corps. Nous allons donc ajouter un autre nœud enfant au tank, et celui-ci sera simplement un nœud trois D. Nous allons l'appeler body. Et nous allons déménager. Nous allons tous les sélectionner, et nous allons les déplacer. Nous allons les traîner ici pour les réimprimer sous le corps. Cela signifie que maintenant, si nous devons manipuler le corps entier de quelque manière que ce soit par la suite, nous pouvons le faire. Mais nous préférons faire quelque chose de similaire pour la tourelle Créons donc un autre nœud en trois D, appelons-le tourelle Et cette fois, nous allons ajouter une autre instance de maillage en trois D, et celle-ci sera un tube trail, un maillage au nom étrange Mais c'est une sorte de cylindre, mais vous pouvez modifier le nombre de côtés du cylindre. Donc, si nous en arrivons, disons, à six, nous avons maintenant un hexagone. Si nous en arrivons à 12, nous avons un dodécaèdre, je crois qu'on Nous allons donc le ramener à six, puis nous reprendrons la couleur, vous savez, nous n'avons pas vraiment à le faire. Je vais donc vous montrer comment copier l'intégralité du matériel en un instant. Nous allons donc prendre ceci. Nous allons changer le rayon à 0,125, ce qui est trop petit. Disons 0,25. C'est mieux Ensuite, nous changerons la hauteur, qui est techniquement la même Donc, si nous changeons le nombre de sections, oui. Il y en a donc un et nous pouvons le vérifier, et je vais vous le montrer dans un instant. Passons donc à la hausse. Et si nous allons voir, d'accord, ce n'est pas visible. C'est sous le Non, pas sous les trois points. Où était ce truc ? OK, c' était ici et en dessous. Ces trois points. Si nous allons ici et que nous passons de l'affichage normal à l'affichage filaire, boum Maintenant, nous pouvons les voir et je vais recentrer le sujet. Vous pouvez voir les polygones, les triangles qui constituent votre primitive Donc, dans ce cas, nous avons deux sections, supérieure et la moitié inférieure, et chaque section comporte plusieurs anneaux. Donc, si je les réduis à cela, nous n'avons plus que deux sections, plutôt deux anneaux. C'est donc une façon de réduire le nombre de sections de votre objet. Et pour une raison ou une autre, il ne me permettra pas de faire une section. Il en faut deux, quoi qu'il en soit. Et nous pouvons réellement changer la forme de cette chose en utilisant les courbes, mais nous n'allons pas le faire. La longueur de la section est donc bonne. Et en fait, non, réduisons-le. À 1,25 cela devrait l'aplatir. Oui, on y est. OK, donc on prend ça. Voici donc la tourelle. Et d'accord, je vais le remettre en mode normal. Boum. Nous avons donc le nœud racine d' origine de la tourelle, mais nous sommes ensuite passés à l'instance de maillage là-haut Nous voulons donc modifier la transformation des instances du maillage pour qu'elle soit nulle, afin qu'elles soient centrées, sorte qu'elles soient centrées exactement là où la tourelle est censée se trouver Maintenant, nous allons le déplacer vers l' arrière et le déplacer vers le bas de manière à ce qu'il soit le plus près possible du corps , car nous ne voulons pas que la lumière passe par le Nous nous intéressons à l'un de ces segments du corps, pas à celui-ci. Nous passons à l'un de ces segments du corps. Nous pouvons maintenant copier le matériau et aller ici , puis coller le matériau. Et maintenant, nous n'avons plus à nous soucier de nous amuser avec le compte-gouttes et de nous assurer d'obtenir les bonnes couleurs Alors collez, boum, voilà. Et maintenant, nous allons en fabriquer un autre pour le baril. Donc, cette fois, nous allons utiliser un cylindre, et nous allons le faire pivoter. Et nous pouvons également le faire pivoter comme ça. Donc, si on fait ça, on va faire comme ça. Maintenant, idéalement, cette rotation va changer lorsque nous jouerons au jeu. Nous allons faire en sorte de pouvoir lever et abaisser le canon. Mais pour l'instant, nous voulons qu'il fasse beau, même à 90 degrés. Ouvrez le maillage. Collez à nouveau le matériau. Nous allons changer le Whoa. D'accord, donc les hauteurs. Faisons en sorte que ce soit 1,5. Et nous allons changer le rayon supérieur et inférieur. Comme vous pouvez le voir, si je change le rayon supérieur, cela le transforme en quelque sorte en cône. D'accord, alors faisons-le 0,120 0,1. Oui, 0,1. Ça a l'air plutôt bien. Maintenant, il nous suffit de le traîner ici jusqu'à ce qu'il soit, une fois de plus, aussi chair que possible avec la tourelle Et si ça rentre un peu à l'intérieur, c'est bon. Il n'est pas nécessaire que ce soit parfait. C'est juste que nous voulons l'obtenir le meilleur possible. D'accord. Ça a l'air plutôt génial. Je ne sais pas J'ai toujours l'impression que c'est trop gros. Faisons en sorte que ce soit 0,05. Allons-y. J'aime bien ça. Et maintenant, ajoutons une muselière. Et le museau sera essentiellement le même que celui-ci, donc nous pouvons le dupliquer Et nous allons rendre le maillage nouveau unique afin de pouvoir le modifier. Nous allons modifier la transformation. Euh, nous allons lui donner une rotation de 90. Qu'est-ce qui vient de se passer ? Hmm. Intéressant Je ne sais pas où c'est parti. D'accord, la position est zéro, zéro. D'accord, tu sais quoi ? Je vais simplement le supprimer et le refaire. D'accord, on va le faire à l'ancienne. Nous allons simplement ajouter une autre instance de maillage trois D. Nous lui donnerons une piste tubulaire. Encore une fois, nous allons coller le bon matériau. Nous allons changer le rayon en, disons, 2,5 pour le moment. Nous allons le modifier dans un instant. Rubriques. Nous allons à nouveau les réduire. Diminution radiale jusqu'à six. Puis transformez 90. Oh, je vois ce que j'ai fait la dernière fois. Très bien, je vois mon problème. Au lieu de changer la rotation, j'ai changé de position, donc je l'ai mise à 90, ce qui n'était pas visible par la caméra. D'accord. Il est clair que j'ai besoin d'une autre tasse de café avant d' essayer d'enseigner aujourd'hui. Alors, déplaçons ça ici. Maintenant, comme vous pouvez le constater, c'est évidemment beaucoup trop gros, même si cela peut être cool pour certaines personnes. Mais je vais le déplacer là , puis modifier à nouveau le rayon. Faisons donc le rayon zéro, un. Ça a l'air bien mieux. OK, maintenant nous avons un tank, et c'est un beau tank. Et si nous avons fait la tourelle de cette façon, c'est parce que nous voulons un point central pour la tourelle puisse manœuvrer Donc, comme la tourelle est centrée ici, normalement, regardons le canon ici Normalement, si je devais faire pivoter ce barillet, eh bien, faisons-le pivoter, vous pouvez voir qu'il tourne autour du point central du maillage, et il n'y a aucun moyen de changer le point d'ancrage du maillage lui-même de telle sorte que Gadot le considère comme le centre du maillage Il sera toujours là. C'est pourquoi nous utilisons un nœud en trois D comme point d'ancrage de l' objet entier, car maintenant, si je fais pivoter le nœud, le tankar pivote exactement comme il Maintenant que j'y pense, nous allons devoir faire quelque chose de similaire pour pouvoir faire pivoter la tourelle elle-même. Alors faisons-le maintenant. Nous allons ajouter un autre enfant, qui est un nœud en trois D, et celui-ci sera rotation des tourelles ou plutôt le point d'ancrage du canon Ensuite, nous prenons les deux pièces du canon, et nous les faisons glisser jusqu' point d'ancrage du canon Et maintenant, si je le fais pivoter, le canon peut pivoter de haut en bas. Cependant, puisque nous l'avons fait et que le canon est au centre, nous voulons en fait le déplacer un peu vers le bas. D'accord, nous allons changer cela. Et bien sûr, les barils ne sont pas correctement décalés maintenant, nous allons donc nous en occuper. Nous allons l'ajuster un peu comme ça. Maintenant, ces deux-là sont là. Et encore une fois, vous pouvez sélectionner les deux éléments en même temps afin de pouvoir les déplacer ensemble. Maintenant, nous l'avons là. Et maintenant, si nous faisons pivoter le canon, il tourne bien, même si nous devrions le déplacer légèrement vers l'intérieur pour ne pas voir ce joint. Donc voilà. Et nous finirons par vouloir bloquer la rotation du barillet qu'il ne passe pas par le fond du réservoir, mais qu'il soit là. D'accord. Contrôlez à nouveau S. Nous avons un tank. Il n'y a qu'un autre problème, c'est que nous voulons que la base, l'origine, la position du point d'ancrage du réservoir soit au sol. C'est pourquoi nous avons créé parties de notre corps reliées à un nœud de tank, car il ne nous reste plus qu' à les déplacer vers le haut Oh, faisons-le dans cette position. Nous les déplaçons vers le haut. Maintenant , le décalage du réservoir se trouve à la base, et c'est exactement là que nous voulons qu'il soit. D'accord, c'était beaucoup. Si vous voulez continuer à vous entraîner à manœuvrer dans l'espace à trois D de Gado et à manipuler des primitives de maillage, n'hésitez pas à changer de tank ou à y ajouter d'autres pièces Sinon, je vous verrai dans la prochaine leçon où nous allons construire le terrain de jeu. On se voit là-bas. 9. Réaliser le terrain de jeu: Bon retour. Dans cette leçon, nous allons construire le terrain de jeu de manière à ce que les tanks et leurs ennemis puissent se déplacer et nous allons créer une nouvelle scène, afin de pouvoir passer à la scène et à une nouvelle scène Et encore une fois, ce sera une scène en trois D, donc un nœud en trois D. Et nous allons renommer celle-ci, et nous allons l'appeler arène terrain de jeu ou champ de bataille ou comme vous voulez Ensuite, nous ajouterons une instance de maillage trois D. Et encore une fois, nous lui donnerons un maillage de boîte. Cependant, dans ce cas, vous pouvez également utiliser un maillage plan. Cependant, d'après mon expérience, j'ai parfois constaté que les avions n'enregistraient pas correctement les collisions. Parfois, la physique de Gado devient un peu farfelue. Nous optons donc pour un maillage de boîte, et nous allons le changer dans les directions X et Y en 100. Eh bien, pas dans la direction Y, mais plutôt dans la direction Z. Et on peut l'amincir un peu, le porter à 0,5. Ça n'a pas vraiment d'importance. Et puis encore une fois, un nouveau matériau, et celui-ci va être brunâtre. Allons-y. Nous avons un terrain de jeu. Maintenant, donnons un peu de couleur à notre terrain de jeu en ajoutant des arbres , des collines et des rochers. Nous allons donc ajouter une nouvelle instance de maillage. En fait, non. Nous allons ajouter un nouveau nœud en trois D, que nous appellerons arbre. OK, allez. Cliquez avec le bouton droit. Allons-y. Et cet arbre sera, encore une fois, une paire d'instances de maillage. Donc, la première instance de Mesh Instant Mesh n'est pas un mot facile à dire. L'instance de maillage va être un cylindre. Et ce cylindre sera brun foncé pour être le tronc de l'arbre. Et nous y arriverons. Eh bien, le rayon est bon et nous allons le porter à 3 mètres. Je vais le faire glisser ici de manière à ce qu'il soit au ras du sol. Et nous ajouterons également une sphère sur le dessus. Donc, une autre instance de maillage, celle-ci sera un maillage sphérique, et le matériau sera vert Maintenant, bien sûr, cette sphère est bien trop petite, nous allons donc réduire le matériau, puis nous allons passer au rayon, et nous en ferons, disons, deux, et la hauteur sera également de deux. Et à ce stade, vous pouvez les fabriquer comme vous le souhaitez. Donc, si je devais en faire cinq, ça ressemblerait à ça, ce qui est plutôt cool. À l'origine, je les ai fabriqués parfaitement sphériques , ce qui fonctionne également, même si maintenant que j'y pense, je les aime un peu mieux. C'est ce que nous allons faire. Et nous allons encore une fois nous en assurer. Bien, maintenant nous avons un arbre Maintenant, nous voulons les arbres. Nous voulons pouvoir utiliser l' arbre comme un préfabriqué afin de pouvoir copier-coller et placer autant d'arbres que nous le Mais pour ce faire, nous avons besoin d'un moyen de faire couramment référence à chaque arbre, car disons que nous copions, nous venons de faire le contrôle D, et que nous copions et collons un tas de ces arbres. Et puis, pour une raison ou une autre, nous avons décidé que nous voulions que le tronc de l'arbre soit bleu, par exemple. Eh bien, il faudrait revenir en arrière et changer tous ces arbres manuellement. Et si nous mettions 100 arbres dans notre terrain de jeu, cela représenterait beaucoup de travail Nous allons donc simplement cliquer avec le bouton droit de la souris et sélectionner Enregistrer la branche sous le nom de SN. Et puis c'est déjà fait. Le nom du fichier par défaut est automatiquement le nom du nœud Donc, tout ira bien ici. Nous allons simplement appuyer sur l'arbre et, encore une fois, ignorer cette erreur d'analyse Cela ne disparaît tout simplement jamais. Et maintenant, nous avons un arbre. Donc, si nous le voulions, nous pouvons maintenant faire glisser plus d'arbres dans notre scène, et nous en avons deux. Je vais donc le faire plusieurs fois. Et tu peux créer une véritable forêt si tu veux, mais je vais juste en mettre trois ici Et nous allons faire la même chose et construire une colline. Et ce ne sera pas la plus belle colline du monde à cause des limites de nos mailles, mais nous allons créer un prisme, et nous allons le faire Et nous allons le faire brunir. Faites-le un peu plus brun que sur le terrain de jeu. Et nous devrions le renommer Hill. Maintenant que nous l'avons, nous pouvons fermer le matériau et modifier la transformation parce que nous voulons le faire pivoter. Ensuite, nous égaliserons cela à moins 120. Et nous allons égaliser ce chiffre à moins 120. qui n'est pas tout à fait correct, mais ce n'est pas vraiment le cas. Négatif 115, on dirait. Intéressant Quoi qu'il en soit, nous avons maintenant une colline, qui n'est toujours pas assez grande. Faisons en sorte qu'il y en ait sept au total. Et ce n'est qu'un goût purement personnel ici. Il n'y a pas de oui ou de non étonnant. C'est pourquoi cela doit être de cette taille. Je le fais juste parce que c' est un peu ce que je veux que ce soit. Vous pouvez facilement les modifier vous-même. De plus, étant donné que les collines ressemblent littéralement à des triangles, elles n'ont pas besoin d'être très détaillées pour les besoins de notre prototype ici, mais vous pouvez facilement ajouter instances de maillage aux collines et leur donner un aspect plus rocheux. Mais on va juste le mettre ici. Et encore une fois, nous allons cliquer avec le bouton droit de la souris sur Enregistrer tel que vu. Maintenant que nous avons une colline, nous allons en ajouter une autre. Et on peut facilement fabriquer une pierre en faisant de même. J'ai donc cliqué avec le bouton droit de la souris et dupliquer et nous appellerons cela un rocher. Et nous allons enregistrer cette branche en tant que scène. Bien, un message d'erreur s'est affiché. Enregistrez la branche de la scène. Quel était le message d'erreur ? Le message d'erreur était qu'il était possible de sauvegarder la branche d'une scène déjà instanciée. Pour créer une variante d'une scène, vous pouvez créer une scène héritée en fonction de la scène instanciée. Nous ne voulons donc pas le faire. Donc je suppose que nous allons simplement fabriquer la pierre manuellement. Nous examinerons les scènes instanciées dans une prochaine leçon. Donc, pour l'instant, nous allons simplement retourner à Arena. Troisième instance de Child Node D. Rock. Et faisons en sorte que les pierres soient légèrement différentes. Nous fabriquerons les roches sous la forme d'une sphère, mais elles seront petites et elles seront à moitié enfouies dans le sol. L'albédo est gris. Et faisons en sorte que le rayon soit 0,75. Et nous allons également conserver le rock en tant que scène rock à part entière. Et nous appuierons sur la touche D pour dupliquer les pierres plusieurs fois et nous en déplacerons certaines. Maintenant, nous avons notre aréna et les collines sont un peu accidentées C'est donc une bonne chose que nous en ayons fait une scène afin que je puisse vous montrer comment l'ajuster. Voyons donc si le double-clic ne fonctionne pas. Très bien, passons ici. Donc, ce que nous pouvons faire, c'est que si nous double-cliquons sur cette petite icône qui dit Open Editor, nous pouvons ouvrir la scène Hill dans l'éditeur. Mais ce faisant, nous pouvons modifier la scène, puis toutes les autres scènes seront mises à jour pour en tenir compte. Jetons donc un coup d'œil ici. Nous avons notre transformation, ce qui est étrange. Continuez à en perdre la trace. OK, alors mettons le rouge en avant. Allons-y. OK, eh bien, au lieu de tout gâcher, le moyen le plus simple de le réparer est de simplement le déplacer un peu vers le bas pour que le bas soit coupé par le terrain Alors maintenant, si nous sauvegardons ceci et que nous revenons à Oh, nous n'avons jamais sauvé notre arène. Nous ferions mieux de faire cette scène, de sauver Arena. Un Hmm. D'accord. Non Nous l'avons toujours, est-ce exact ? OK, oui, c'est juste l'ombre, non. Juste là. OK, maintenant les collines sont bien alignées avec l'arène. Encore une fois, vous remarquerez que nous avons modifié la position Y de la colline directement dans la scène de la colline elle-même, puis que les deux collines ont été automatiquement mises à jour lorsque nous l'avons enregistrée et que nous sommes revenus à notre niveau principal. D'accord. Oh, c'est notre niveau aussi incroyable qu'il en a l'air. Et si vous souhaitez continuer à vous entraîner à créer des scènes et intégrer des préfabriqués dans le niveau, pourquoi ne pas l' embellir Une bonne chose à faire serait probablement de fermer cette frontière bordée de collines afin que le char ne tombe pas du bout du monde lorsque nous appliquerons la théorie des collisions en physique . Dans notre prochaine leçon, nous allons ajouter une caméra, puis nous allons passer aux bonnes choses. Je t'y verrai donc. 10. Le nœud Camera3D: Dans cette leçon, nous allons prendre toutes les scènes que nous avons initialement créées, et non seulement nous allons les assembler pour former une scène principale, mais nous allons également examiner le nœud de caméra et la façon dont il est essentiel pour donner vie à vos jeux en 3D. Nous avons donc nos chars. Nous avons nos pierres. Nous avons tout ce que nous avons construit dans la leçon précédente. Maintenant, si nous essayions de lancer notre jeu, nous n'obtiendrions rien de particulièrement impressionnant. Alors faisons-le. Le premier problème que nous avons est que nous n'avons pas défini ce que Godot appelle la scène principale Donc, comme je l'ai déjà mentionné, dans Gadot, tout est une scène, et Godot doit savoir quelle est la scène racine par défaut qu' elle va charger et exécuter lorsque nous démarrons le jeu Alors pour l'instant, faisons-en simplement l'arène. Donc, si vous essayez de lancer le jeu sans avoir défini de scène par défaut, Godot vous donnera ce dialogue qui dit : Aucune scène principale n'a été définie Sélectionnez-en un. Et si nous disons sélectionner courant puisque l'arène est notre scène actuelle, c'est la scène que Gadot va charger au début du jeu. Et on n'obtient rien. Et si nous n'obtenons rien, c'est parce que nous jouons dans un environnement 3D, et Godot ne peut pas rendre un environnement 3D sans caméra Comme vous l'avez peut-être deviné, une caméra dans Godot est un nœud Et nous voulons connecter la caméra à notre lecteur. Revenons donc à notre scène de tank, et nous allons cliquer avec le bouton droit sur Ajouter un nœud enfant. Et ce que nous voulons, c'est la caméra 3 D. Maintenant, remarquez que dans de nombreux cas, il existe également deux versions D des mêmes nœuds sur lesquels nous travaillons. Et c'est pour les environnements plats basés sur des sprites en deux D. Donc, si vous créiez un jeu à défilement latéral basé sur des bitmaps ou un RPG japonais à l'ancienne, vous utiliseriez Camera two D ou two D nodes Mais comme nous travaillons entièrement en trois D dans ce cours, nous ne voulons les nœuds que pour les trois D, au moins jusqu'à ce que nous arrivions à la partie interface utilisateur. Nous allons donc sélectionner Camera three D, et nous l'ajouterons. Et maintenant, nous avons une caméra attachée à notre réservoir. Et vous pouvez voir maintenant que nous avons un appareil photo En fait, laissez-moi le supprimer pour que vous puissiez voir la différence. C'était un peu subtil. Maintenant que la caméra n'est plus là, on ne voit rien ici. Et maintenant, si nous ajoutons à nouveau une caméra, nous avons désormais la possibilité de prévisualiser notre caméra dans la fenêtre avant. Donc, si nous cliquons plutôt sur cette fenêtre ou sur la fenêtre principale. Donc, si nous cliquons dessus, nous pouvons maintenant voir ce que nous avons. Et, bien sûr, cela semble nul parce que nous n'avons pas correctement aligné notre caméra. Alors faisons-le. Nous allons décocher cette option Mais en fait, plutôt que de décocher cette case, revenons à la vue, et maintenant nous allons passer à deux ports d'affichage Et comme vous pouvez le constater, notre fenêtre de vue supérieure correspond ce que vous pouvez voir dans la caméra, et notre fenêtre d'affichage inférieure est la même vue en trois dimensions que celle que nous avions auparavant Nous pouvons donc utiliser cette vue du bas pour orienter notre caméra et nous pouvons voir à jour en temps réel ce que voit réellement notre caméra. Faisons donc glisser notre caméra haut, car une caméra n'est qu'un nœud en trois D, comme les autres nœuds avec lesquels nous avons travaillé. Nous pouvons donc le manipuler de la même manière. Faisons-le donc pivoter vers l'avant, et je vais l' ajuster légèrement pour qu' il soit égal à moins 90. Et je vais le faire légèrement reculer. Nous allons le déplacer légèrement vers le haut, puis nous l'inclinerons légèrement vers le bas pour voir notre tank dans toute sa splendeur. Et bien sûr, l'appareil photo possède différents groupes de paramètres avec lesquels nous jouerons dans les prochaines leçons. Le plus important d'entre eux est le réglage de l'environnement. Mais vous pouvez également modifier le champ de vision de la caméra, et cela permet de couper des plans de près ou de loin, ce que vous n'avez pas vraiment envie de faire la plupart du temps Vous remarquerez que si vous le réglez trop près, le réservoir finit par disparaître car c' le réservoir finit par est l'endroit où la caméra commence le rendu et où la caméra termine le rendu que détermine le plan de découpage proche et lointain commence le rendu et où la caméra termine le rendu et Et c'est un volume en trois dimensions en soi. Donc, tout ce qui se trouve dans ce volume sera rendu. Réinitialisons-les donc à nouveau. Il s'agit également d'un paramètre extrêmement important, et nous déterminerons quelle caméra est réellement rendue. Il est donc possible que vous ayez vu cela dans d'autres jeux en 3D avoir plusieurs caméras, plusieurs vues de caméra. Et l'un des moyens d' y parvenir est de simplement forcer manuellement la caméra dans une orientation différente. Mais une méthode plus courante consiste simplement à avoir plusieurs caméras et à ne visualiser que l'image vue par l' une d'entre elles à la fois. Donc, si nous avions deux caméras, et que nous pourrions me le permettre, j' ajouterais une deuxième caméra, et nous verrons cela en temps réel. Donc dupliquez. Et la deuxième caméra, déplaçons-la. Eh bien, allons-y, et nous allons faire un aperçu, et bien sûr, nous ne voyons rien d'intéressant. Donc, si nous revenons ici, c' est la caméra actuelle. Et ensuite, si nous allons ici, nous pouvons le remplacer par l'appareil photo actuel. Maintenant, cela ne changera rien ici, car nous prévisualisons automatiquement notre caméra principale Cela ne se met donc pas à jour correctement. C'est peut-être un bug, je fais peut-être quelque chose de mal. Je n'ai aucun moyen de le savoir. Mais si nous allons maintenant lancer notre scène, nous n' obtiendrons plus rien parce que je ne l'ai pas modifiée. C'est donc une bonne occasion de vous expliquer comment changer de scène (votre scène par défaut) dans Gado. Ainsi, si nous allons dans les paramètres du projet, et si nous allons exécuter, vous pouvez voir la propriété de la scène principale Nous pouvons donc changer cela, et nous l'avons actuellement réglé sur Ana, qui ne contient aucune caméra. Et si nous le changeons en tank, qui possède la caméra, maintenant, si nous lançons le jeu, nous verrons notre tank dans toute sa splendeur non éclairée, et nous verrons la vue depuis notre caméra initiale parce que c'est la première caméra, donc c'est la caméra par défaut car aucune de nos caméras n'est réglée sur courant Si nous réglons la deuxième caméra sur courant, puis que nous relançons la scène, nous devrions voir la vue depuis la deuxième caméra. Et voilà. Donc, bien sûr, cela ne nous aucun bien, car tout ce que nous voyons, c'est le tank. Et c'est parce que le tank n' est pas actuellement dans l'arène. Retournons donc à l'arène. Maintenant, nous pourrions traîner le tank directement dans l'arène, et il n'y a vraiment rien de mal à cela, mais j'aime garder mes structures séparées et hiérarchiques, ce qui est un mot difficile à prononcer. Nous allons donc créer une nouvelle scène, et encore une fois, il s'agira d'un nœud 3D, que nous appellerons jeu. Et comme vous pouvez l'imaginer, le jeu inclura l'arène, et tout ce que nous avions à faire était de l'ajouter parce que nous l'avions déjà créée, puis nous allons simplement y ajouter un tank. Maintenant, si nous sauvegardons notre jeu sous forme de scène, et que la première chose à faire est de nettoyer un peu les choses chose à faire est de nettoyer et de retirer cette caméra mal orientée. Maintenant que nous l'avons fait, Gadot va revenir par défaut à cet appareil photo, mais nous allons quand même le régler sur actuel juste pour que les choses restent cohérentes Et maintenant, si nous revenons à notre projet et que nous changeons la scène actuelle de tank ou la scène par défaut du jeu en cours à tank, non, si nous revenons en arrière et que nous changeons la scène par défaut de tank en jeu, puis que nous la fermons. Maintenant, si nous lançons notre jeu, nous devrions voir tout ce que nous nous attendons à voir. Et c'est ce que nous faisons. Maintenant, bien entendu, nous n'avons pas introduit d'éclairage ou quoi que ce soit de ce genre dans l'environnement. Donc, bien sûr, il fait complètement noir. Nous n'avons pas de skybox, rien de tout ça. Mais soyez assurés que nous allons améliorer notre jeu très, très prochainement Mais avant cela, nous devons en apprendre un peu plus sur les vecteurs et sur façon d'organiser certains de ces éléments afin de pouvoir réellement nous déplacer dans ce monde de jeu. À ce moment-là, nous devrons voir ce que nous faisons. examinerons donc les environnements et l'éclairage. Je t'y verrai. 11. Vecteurs: Bon retour. Dans cette leçon, nous allons examiner le concept mathématique connu sous le nom de vecteur. Et la raison pour laquelle nous allons le faire est que les vecteurs sont utilisés constamment, abondamment et partout dans les jeux vidéo, particulier lorsqu'il s'agit d'environnements en trois dimensions. Et comme nous travaillons uniquement en trois D, que nous allons effectuer de nombreux travaux de physique et déplacer des objets dans un espace en trois D, c'est un bon concept à connaître. J'ai donc configuré un nœud à deux D ici, et la raison pour laquelle je l'ai fait est qu' il est légèrement plus facile d' illustrer des concepts vectoriels en deux D qu'en trois D, mais les mathématiques et les concepts sont exactement les mêmes. Donc, si vous comprenez l'un, vous comprenez l'autre. Nous avons déjà travaillé un peu avec des vecteurs, comme vous pouvez l'imaginer, sous la propriété de transformation de nos nœuds, et revenons à notre tank, et nous pourrons le voir un peu plus correctement. Nous avons la position, la rotation et les valeurs d'échelle, et ce sont tous des vecteurs. Un vecteur est un concept mathématique défini par une direction et une amplitude. Et la magnitude est simplement une façon sophistiquée de dire la longueur de ce vecteur. Donc, si nous revenons à deux D et que nous revenons à ce nœud vide que j'ai créé, je pourrai vous le montrer. Maintenant, ce que j'ai fait avec la grille ici c'est que j'ai activé la grille elle-même en appuyant bien. En fait, je n'ai rien appuyé pour le faire. Mais si vous appuyez sur ce bouton ici pour effectuer une capture de grille, puis si vous passez sous les trois points sélectionnez Configurer Snap et assurez que le pixel Snap est activé, tout ce que vous faites sur la grille, comme je l' ai déjà montré lorsque nous en faisions trois D. Et ce que j'ai fait, c'est configurer le snap à un pixel pour le pas de grille afin que nous puissions voir les coordonnées dans une large mesure plus facile. Je vais donc ajouter ici un nœud enfant appelé cast two D. Et remarquez qu'il existe également un nœud enfant cast trois D, mais comme je l'ai dit, de retirer une dimension de l'équation facilite un peu la conceptualisation Mais encore une fois, le calcul est exactement le même. La seule différence entre le deux D et le jet trois D est que le jet deux D n'a pas de composante Z car en deux dimensions, nous ne travaillons qu'en X et Y, mais en trois dimensions, nous travaillons en X, Y et Z. Heureusement pour nous, un rayon ou un faisceau est un vecteur Comme vous pouvez le voir ici, il s'agit d'une flèche. Maintenant, si vous deviez lancer une dans votre jeu, vous ne verrez pas cette flèche dans votre jeu. Ceci est uniquement destiné à l'affichage de l' éditeur et à des fins de débogage afin que vous puissiez réellement voir où pointe votre vecteur Et c'est un peu bizarre parce qu'il existe une valeur appelée position cible, qui contourne ce que nous essayons de montrer. Mais d'une manière générale, nous traitons tous les vecteurs comme s' ils commençaient à zéro, même si, évidemment, pour une diffusion de rayons, vous pouvez lui demander de commencer où vous le souhaitez. Mais mathématiquement parlant, peu importe qu'un rayon ou un vecteur commence à zéro ou commence à 34 16 ou à n'importe quel autre endroit où nous décidons de le placer Toutes les mathématiques sont les mêmes et supposent que vecteurs commencent à l'origine de l'espace local dans lequel ils proviennent. Et c'est une autre chose dont nous devrions parler un peu, l'espace local par rapport à l'espace mondial. Comme vous pouvez l'imaginer, trois espaces en D et deux espaces en D sont également divisés ou au moins les positions sont définies en coordonnées. Et nous avons toujours utilisé les coordonnées, par exemple, en indiquant à notre char qu'il se trouve à la position 000. Il s'agit d'un ensemble de coordonnées dans l'espace local. présent, l'espace local correspond à l'objet sur lequel vous travaillez, ou plutôt il s'agit d'un espace autonome. Ensuite, cet espace peut être défini par rapport à un espace plus grand, qui neuf fois sur dix est l'espace global. Ainsi, par exemple, dans ce cas, si nous supposons que le nœud de jeu que nous avons créé dans la leçon précédente est l'espace mondial, et si son origine, 000, est le point mort de tout ce que notre jeu utilise, puis nous disons que notre tank, l'intégralité de notre tank, se situe à 7,34 par rapport à l' origine de l'espace mondial Eh bien, comme le char a son propre espace local, le corps du char est situé à 00 ou, en fait, je ne pense pas que ce soit le cas. Nous allons vérifier la transformation. Non, le corps du tank est situé à 0,626 dans l'espace local, que vous devez ensuite ajouter à la position globale du tank pour obtenir la position globale réelle de cet objet Tout est donc hiérarchique. Vous pouvez effectuer une hiérarchisation vers le bas et disposer de plusieurs espaces locaux. Ainsi, par exemple, la tourelle Tanks possède son propre espace local car plusieurs objets se trouvent en dessous Ainsi, l'origine des chars ou celle des tourelles sont de zéro, zéro, le canon est en fait sa position en référence à la position des chars et ainsi de suite Tout cela est vraiment compliqué, en fait. Mais tout cela est en fait une façon extrêmement sophistiquée de dire que ce 00 peut en fait être un ensemble de coordonnées différent dans l'espace mondial, mais qu'en ce qui concerne les calculs vectoriels, rien de tout cela n'a d'importance. Les vecteurs auront donc une amplitude, et cette amplitude correspond à la longueur de cette droite. Modifions-le donc de telle sorte que le point final soit là. Ainsi, pour un faisceau, qui est un vecteur, le point final du vecteur est indiqué par le paramètre de position cible. Et dans ce cas, nous en avons 56 sur 24. C'est donc cette coordonnée ici. Il fait 56 X et 24 Y. Maintenant, l'amplitude du vecteur est la longueur de cette droite, calculée mathématiquement par le théorème de Pythagore, qui n'est pas facile à prononcer, car elle forme ici un qui n'est pas facile à prononcer, car elle Heureusement, nous n'avons pas vraiment à nous en soucier car Gadot nous fournit des classes vectorielles pour le script GD qui calculeront tout ce que vous pourriez vouloir calculer pour un Vous pouvez calculer son amplitude. Vous pouvez calculer des éléments tels que les produits à points. Vous pouvez les ajouter et les soustraire, ce que nous verrons dans un instant Mais c'est une bonne idée de connaître ces concepts au moins à un niveau de base afin que vous puissiez vous dire  : « Oh, pour le faire avec un vecteur, je dois faire ces deux choses en particulier, et nous examinerons quelques-unes de ces choses dans un instant. Mais pour le moment, nous parlons juste un peu de vocabulaire. Les coordonnées sont donc le point du vecteur par rapport à l' origine du vecteur, puis l'amplitude du vecteur est la longueur de cette ligne. Maintenant, évidemment, la magnitude que nous pouvons utiliser pour faire toutes sortes de choses intéressantes, par exemple, si nous voulions trouver la distance entre deux objets dans notre monde de jeu, si nous supposions que l' un des objets était à l'origine du vecteur, puis que l'emplacement du deuxième objet dans l'espace mondial était le point final du vecteur. Si nous calculions l'amplitude du vecteur, nous connaîtrions la distance en mètres des objets entre eux. Et nous y reviendrons un peu lorsque nous parlerons du ciblage et du tir de balles dans une leçon ultérieure Ajoutons donc un second faisceau. Et nous allons déplacer le premier ici. Et en fait, nous allons les réduire un peu. Quoi qu'il en soit, nous allons passer à celui-ci et à celui-ci. Maintenant, les vecteurs, avant de passer à autre chose, un vecteur d'une amplitude de un est appelé vecteur normalisé Et nous utilisons beaucoup de vecteurs normalisés pour la lecture des entrées et également partout où nous ne voulons pas que le vecteur soit, et également partout où nous ne voulons pas que le vecteur soit, faute de meilleur terme, entaché par la longueur du Et nous y reviendrons lorsque nous parlerons davantage de contributions. Mais comme les vecteurs sont des structures mathématiques, nous pouvons les additionner et les soustraire les uns des autres Je vais donc prendre ce vecteur ici et je vais l'ajouter à ce vecteur ici. Visuellement parlant, cela signifie que j'aurais dû le laisser là où il est. Quoi qu'il en soit, visuellement parlant, lorsque vous ajoutez deux vecteurs, voici ce que vous obtenez. Vous allez prendre le premier vecteur, et en y ajoutant le second, vous le placerez essentiellement à l'extrémité du vecteur. Et ce nouveau point final est l'équivalent d'un troisième vecteur. Oups. Essayons encore une fois. Nous allons donc le remettre à zéro. Et en fait, permettez-moi de modifier celui-ci pour qu'il soit un peu plus clair. Donc, si nous ajoutons ce vecteur à ce vecteur, nous obtiendrons ce vecteur de manière fonctionnelle car vous ajoutez les coordonnées des deux extrémités Donc celui-ci est 24 32, puis si on y ajoute 016, on obtient cette troisième valeur qui est 24 32 Et c'est important parce que lorsque nous allons voir cela dans environ deux leçons, lorsque nous commençons à déplacer notre char, la façon dont nous allons déplacer notre char est que la vélocité du char ou sa vitesse est représentée par un vecteur, et nous allons modifier cette vitesse en ajoutant de la vitesse à ce vecteur. En tant que deuxième vecteur. Et ce sera un peu plus clair lorsque nous l' examinerons mathématiquement Mais il en serait ainsi dans l'espace visuel. Maintenant, l'autre chose que nous allons examiner rapidement est de savoir comment soustraire des vecteurs. Donc, si nous devions prendre ce troisième vecteur ici et le soustraire du premier vecteur, nous obtiendrions l' équivalent du deuxième vecteur Et je vais tout changer. qui signifierait que c'est un moyen rapide et maladroit de comprendre comment deux objets peuvent se faire face. Donc, si nous voulions déterminer le vecteur, nous voulions déterminer la direction laquelle un objet à cette position devrait regarder pour dans laquelle un objet à cette position devrait regarder pour voir quelque chose à cette position, il faudrait soustraire les deux vecteurs qui représentaient leurs positions Les mathématiques vectorielles sont donc un sujet très long et complexe. Mais pour l'instant, tout ce que nous devons vraiment savoir, c'est que les vecteurs sont représentés par un point dans un espace à trois D ou dans un espace à deux D. Et en les ajoutant ou en les soustrayant ou en calculant la longueur du vecteur, vous pouvez obtenir diverses propriétés ou effectuer diverses actions dans le monde du jeu Et comme je l'ai dit, dans une leçon ou deux, lorsque nous commencerons à déplacer des choses, vous verrez comment cela fonctionne dans le code. 12. Le nœud CharacterBody3D: Bon retour. Dans cette leçon, nous allons enfin commencer à étudier les éléments qui constituent notre jeu actuel, et nous allons commencer à coder. Mais avant cela, nous allons être un peu désordonnés , car si vous vous souvenez, lorsque vous lancez votre jeu, il fait nuit. Nous allons maintenant parler de l'éclairage et de l'environnement dans une prochaine leçon. Mais pour le moment, nous allons trouver un moyen très rapide et peu pratique d' intégrer dans notre jeu l'éclairage que nous avons par défaut dans cette scène. Et cela se fait dans le respect de l'environnement. Les trois points situés à côté de ces boutons feront donc apparaître le soleil d'aperçu et l'environnement de prévisualisation. Et comme son apparence nous plaît déjà, il suffit de cliquer sur Ajouter un soleil à SN. Et que Gadot copiera tous les paramètres affichés par le soleil actuel dans cette fenêtre d'aperçu dans un nœud de lumière directionnelle et l'ajoutera à l'arène Et maintenant, si nous commençons notre jeu, il est éclairé, mais pas aussi éclairé qu' il pourrait l'être, car il est évident que nous n'avons aucune lumière de fond provenant de l'environnement. Mais encore une fois, nous y reviendrons plus tard. Pour le moment, nous avons juste besoin de voir ce que nous faisons. Alors, revenons à notre tank. Gadot vous permettra de joindre des scripts, qui sont des mini-programmes, à n'importe quel nœud de votre jeu Et c'est grâce à l'interaction de ces scripts que l'on obtient un jeu. Nous allons donc ajouter que nous allons cliquer sur le niveau racine de notre tank, et nous allons cliquer sur ce bouton ici, qui permet de joindre un script nouveau ou existant. Nous allons conserver le langage sous forme de script GD, et il hérite du nœud 3 D. Nous allons en fait changer cela dans un instant Oui, faisons-le maintenant. OK. Notre tank est donc actuellement un nœud 3D, et jusqu'à présent, cela s'est bien passé, mais nous voulons vraiment changer cela. Nous allons donc cliquer avec le bouton droit de la souris et changer de type. Et nous allons le changer, nous n'allons pas le faire. Nous allons le remplacer par un corps de personnage trois D. Maintenant, qu'est-ce qu'un corps de personnage trois D ? Un corps de caractère trois D est un corps physique trois D, qui est la base de tous les nœuds basés sur la physique de Gadot Et nous voulons de la physique parce que nous voulons faire des choses comme pouvoir déplacer nos personnages, les faire entrer en collision les uns avec les autres et faire de la physique Maintenant, puisque notre tank va être contrôlé par nos scripts et par les commandes que le joueur utilise. Nous ne voulons pas que le tank soit uniquement affecté par la physique. Nous allons donc utiliser le nœud en trois D du corps du personnage, un nœud qui n'interagira avec les systèmes physiques que de la manière le script que nous y attachons. Et cela n'a pas beaucoup de sens pour le moment, mais restez avec moi et tout sera clair dans quelques instants Nous changeons donc le type du tank un corps de personnage deux D ou un corps de personnage en trois D, et nous avons immédiatement un problème. Gadot va nous avertir que cet objet n'a aucune forme, il ne peut donc pas entrer en collision avec d'autres objets, interagir avec d'autres Et pour le moment, ça ne nous intéresse pas. Nous allons donc simplement laisser Gadot continuer à nous avertir et à nous plaindre, et nous allons simplement l' ignorer pour le moment, et nous nous occuperons de cela plus tard Encore une fois, nous allons essayer d' associer un script à Gado et nous pouvons maintenant voir qu'il hérite du troisième corps du personnage D. Cela est dû GD est un langage de script orienté objet, qui signifie que vous pouvez indiquer objets de votre jeu, comme votre tank, qu'il hérite du comportement Donc, ce que nous faisons ici, c'est dire à Gadot que notre tank est un personnage en trois D, mais qu'il va y avoir quelques éléments supplémentaires que nous allons ajouter Nous voulons donc tous les comportements, tout le code et tout ce que le corps de personnage trois D est fourni par défaut, puis nous allons ajouter des fonctionnalités supplémentaires en plus de cela. Et il va nous demander où voulons-nous placer notre script ? Et j'aime garder les choses organisées, alors je vais en fait lui dire d'utiliser un autre dossier. J'aime mettre tous mes scripts dans leur propre dossier. Nous avons donc ouvert, puis créé un nouveau dossier appelé scripts, et maintenant nous allons mettre notre script tank dans ce dossier de scripts. Vous pouvez également faire de même avec les scènes. D'habitude, j'ai un dossier pour les scripts et un autre pour les scènes. Mais oui, pour le moment, c'est parfait. En fait, il n'y aura pas trop de scènes supplémentaires dans ce jeu, donc ce niveau d' organisation ne sera pas nécessaire. Mais peut-être que je changerai les choses une fois que nous aurons commencé à ajouter des effets sonores, des textures, etc. Gadot est suffisamment intelligent pour à jour votre arborescence de scènes et tous les manuellement si déplacez des objets vers différents dossiers pouvoir mettre à jour votre arborescence de scènes et tous les liens pertinents sans que vous ayez à les mettre à jour votre arborescence de scènes et liens pertinents vous déplacez des objets vers différents dossiers. Vous pouvez donc déplacer vos affaires autant que vous le souhaitez, sans qu'elles ne se cassent. OK. Maintenant que nous avons créé ce script, nous avons un script vide. Et tout en haut, nous avons le mot clé extends character body three D, et c'est ainsi que Gudo sait que notre script de tank, qui est maintenant attaché à notre personnage de tank, va hériter du corps de personnage trois D. Nous pouvons, si nous le voulons, lui donner son propre nom de classe afin que dans le jeu, nous sachions qu'il s'agit d'une classe de type tank et que nous puissions l'appeler ainsi Alors oui, allons-y. Maintenant, le modèle de script par défaut est désactivé. Normalement, vous recevrez quelques commentaires supplémentaires et certaines fonctions par défaut définies pour vous, mais nous allons quand même les redéfinir sous peu. À l'avenir, vous pourrez soit activer le modèle, soit le désactiver dans les deux cas. Mais oui, c'est comme ça que nous commençons, puis nous appuierons simplement sur Controls pour nous assurer de ne rien perdre. Avant de passer à la leçon suivante et commencer à parler du contrôle de notre tank via la saisie de l'utilisateur, examinons les bases de la façon dont nous allons interagir avec un corps de personnage en trois D. Le corps de personnage en trois D a donc une fonction connue sous le nom de processus physique. Et comme elle existe, saisie ou la saisie automatique de Gado tentera de la créer pour nous, afin que nous puissions l'autoriser, et ainsi, nous n'aurons pas à nous soucier souvenir de sa signature fonctionnelle Et en tant que variable, cela prend le temps qui s'est écoulé entre les appels au processus physique. Cela est exprimé sous forme de valeur flottante, donc ce sera probablement 0,012 ou quelque chose comme ça, W, bien sûr, un étant une seconde complète Le processus physique est appelé au rythme de 60 fois par seconde, c'est sur cela que fonctionne le moteur physique utilisé par Gadot Heureusement, nous n' avons pas à redimensionner nos variations de vitesse dans le cadre du processus physique sur le corps de personnage 3 D de Delta car tous les calculs effectués sous le capot en tiennent déjà compte Mais pour les autres types d'objets physiques, nous le ferons, et nous nous en occuperons le moment venu. Quoi qu'il en soit, il n'est pas nécessaire définir une variable appelée vélocité, car un est déjà intégré au corps du caractère trois D. Donc si nous l'épelons simplement correctement, nous pouvons attribuer un nouveau vecteur trois à cette valeur. Et nous le faisons en utilisant le mot-clé vector three constructor Et comme vous pouvez le constater, encore une fois, Gadot essaie de nous dire que c'est ainsi que vous définissez cette variable, et ce sont les valeurs que vous devez y mettre Nous voulons donc en fait ce troisième car nous allons fournir le X, le Y et le Z nous-mêmes. Donc, si nous devions le faire, nous fournirions une vitesse nulle, ce qui, bien sûr, signifie que notre tank ne bougera pas, mais nous n'allons pas le faire. Nous voulons que notre tank se déplace dans une direction X. Dans ce cas, il va se déplacer exactement le long de l'axe X parce que c'est dans cette direction qu'il fait actuellement face. Nous allons donc changer cette valeur en, disons, dix, juste pour le plaisir Et maintenant, le corps en trois D du personnage une méthode appelée move and slide, et move and slide prend la vélocité, et il effectue tout un tas de calculs différents dessus, puis finalement déplace le tank. Et puisque nous forçons la vitesse à cette valeur constante à chaque processus physique, elle ne ralentira jamais ou quoi que ce soit d'autre. Et si nous appuyons sur le bouton Play, vous pouvez voir maintenant que notre tank avance, et il continuera à avancer jusqu'à la profondeur de chaleur de l'univers. Et encore une fois, remarquez qu' il ne tombe pas, et c'est parce que nous ne lui avons pas attribué de vecteur descendant pour simuler la gravité. Encore une fois, le Y, la vitesse ascendante et descendante, et la vitesse Z, qui correspond à l'entrée et à la sortie, resteront constamment à zéro, et le char avancera jusqu'à une vitesse de dix. Maintenant, que signifie réellement dix ? Hum, je ne suis pas sûr à 100 %. Les valeurs fournies pour les calculs de vitesse, pour autant que je sache, ne sont pas exprimées en mètres par seconde, en pieds par seconde ou quoi que ce soit d'autre, ou en unités par seconde, elles sont arbitraires. Donc, l'une des choses que vous devez faire pour affiner votre processus physique est de commencer par une valeur, puis de continuer à commencer par une valeur, puis jouer avec ces valeurs jusqu'à ce qu'elles ressemblent réellement à ce que vous voulez, malheureusement. Je vais faire quelques recherches à ce sujet, et s'il s' avère que c'est faux, mettrai à jour dans une prochaine leçon. Mais pour l'instant, passons à la leçon suivante, et nous verrons comment capturer commandes du clavier afin changer cela et de faire bouger le tank comme nous le souhaitons. Je t'y verrai. 13. Réagir aux apports du joueur - Mouvement: Bon retour. Dans cette leçon, nous allons apprendre à interroger commandes du clavier de l'utilisateur afin de manœuvrer notre tank dans un espace en trois D. Ainsi, tous les mouvements ou toutes les lectures d'entrées dans Gdo se font par le biais de ce que l'on appelle des actions Et nous pouvons consulter les actions définies pour un projet dans les paramètres du projet et dans la carte d'entrée. Maintenant, les vôtres vont ressembler à ceci par défaut car GADO possède un tas d'actions intégrées, mais pour une raison ou une autre, il refuse de vous les montrer tant que vous n'avez pas cliqué sur ce bouton Et ici, vous pouvez en voir tout un tas. Donc, ceux qui nous intéressent le plus sont ceux de l'interface utilisateur, à savoir l'interface utilisateur gauche , l'interface utilisateur droite, l' interface utilisateur haut et l'interface utilisateur bas. Et vous pouvez voir ici qu'ils sont mappés à un tas de configurations de contrôle différentes interface utilisateur gauche est donc mappée à la flèche gauche du clavier, ainsi qu'à un bouton Joypad ou à un accès au JoyPad en particulier Donc, peu importe le dispositif de contrôle que vous utilisez. Si vous branchez un joystick et que vous appuyez sur le bouton correspondant, vous serez reparti Ou si tu appuies sur la flèche gauche du clavier, tu vas me faire partir. Ou si vous le mappez à un bouton de la souris, ce que vous pouvez faire manuellement, il le fera également. Mais nous n'allons rien faire de tout ça. Cependant, vous pouvez créer le vôtre. Ainsi, par exemple, si vous vouliez reporter l' affichage de la carte à la touche, vous pouvez créer une nouvelle action appelée carte, puis la mapper au MK, et ce serait parfait. La première chose que nous allons faire est donc de fournir une référence au tank du joueur dans l'objet du jeu. Et il semblerait que je l'ai déjà renommé ici, mais voici à quoi il ressemblait à l'origine. C'était donc tank, puis nous allons le renommer en player Tank Et si nous l'avons renommé, c'est parce que nous finirons par avoir tout un tas de chars pour représenter les ennemis, etc., et nous ne voulons pas avoir à savoir lequel est lequel Ce sera donc le joueur. Et l'une des autres raisons pour lesquelles nous lui donnons un nom est pouvoir le manipuler directement avec les commandes, ce que manipuler directement avec nous verrons dans une minute. Si nous accédons au script du jeu et que nous utilisons le mot-clé export, nous pouvons faire apparaître dans l' inspecteur ici n'importe quelle variable définie sous le mot-clé export . Ainsi, par exemple, si je définis simplement une variable appelée X, vous ne la verrez pas. Mais si je devais exporter cette variable, et si je devais orthographier correctement export et utiliser la bonne annotation, oh, oui, elle fournit qu'elle nécessite un type, alors c'est parti. Maintenant, si je devais le faire, la variable X apparaît dans l'inspecteur et je peux modifier ses valeurs ici, comme nous le ferions pour la transformation ou tout autre élément que nous avons utilisé jusqu'à présent. Dans ce cas, nous allons créer un joueur appelé joueur, et nous allons fixer sa valeur à tank. Ce faisant, nous avons forcé Gadot à reconnaître ou à limiter tout ce que nous impliquons ici Donc, par exemple, si je voulais faire venir Ana ici, Godot ne me le permettrait pas Mais si je devais déplacer le joueur Tank, qui est, bien sûr, un tank, oh Gagnez, faites glisser. Allons-y. Maintenant, cela nous est assigné. Ainsi, lorsque nous quittons, lorsque nous manipulons la variable player dans notre script, il appelle les méthodes de ce script en particulier, qui est, bien sûr, un tank. Et si le nom de la classe est disponible, c'est parce que nous l'avons défini ici. Alors, sauvegardons notre jeu. Scénario. De plus, il semblerait que j'ai commencé à enregistrer après avoir joint le script à l'objet du jeu. Donc, si vous suivez le jeu chez vous, la toute première chose à faire est joindre un script à votre classe de jeu, comme nous l'avons fait pour un tank avec notre script de tank à l'objet tank de la leçon précédente. Maintenant que cela est disponible, nous allons confier au jeu la responsabilité de collecter les données et non le tank. Et si nous allons le faire , c'est parce que nous aurons d' autres chars plus tard pour représenter les ennemis, et nous ne voulons pas avoir à séparer le code qui indique les commandes du char du joueur de celui des chars ennemis et tout le reste. Il est donc préférable d'avoir un tank générique, puis de laisser le jeu manipuler directement le tank du joueur , puis de laisser l'interface utilisateur manipuler directement les chars ennemis afin qu'ils aient une interface commune. Désormais, tous les nœuds de Gado ont une méthode prédéfinie appelée saisie par clé non gérée, et c'est ce que nous allons utiliser Cette méthode est appelée chaque fois que l'utilisateur appuie sur une touche. Chaque fois que l'utilisateur relâche une clé, chaque fois qu'il maintient une touche enfoncée, que ce soit un événement clé lié à Gadot, cette méthode est appelée Et la raison pour laquelle nous utilisons cette méthode plutôt que de surveiller directement les entrées clés de l' utilisateur dans, par exemple, la méthode de traitement ou autre, est que ces méthodes ne sont appelées que lorsque le statut des clés change, nous n'avons donc pas à extraire, à répondre et à interroger constamment répondre et à interroger constamment L'une des règles fondamentales de la programmation informatique est donc de ne pas faire plus de travail que nécessaire. Soyez aussi paresseux que possible. Nous ne voulons donc pas que Gadot dise constamment : « Est-ce que la clé est en panne ? Est-ce que la clé est enfoncée ? La clé est-elle en panne ? Nous voulons juste que la clé soit du genre « Hé, je suis déprimé » et que Go Gadot réagisse C'est donc ce que nous allons faire ici. Dans cette méthode, nous allons donc définir deux variables. Nous allons définir une valeur appelée valeur de rotation, et ce sera un flottant, et nous allons définir une valeur appelée valeur de déplacement. Et ce sera aussi un char. Et ces valeurs seront soit nulles, soit moins un, soit un, selon l' état de notre entrée. Et comme vous pouvez l'imaginer, nous allons manipuler le réservoir en fonction de ces valeurs. Donc, ce que nous voulons faire, par exemple, c'est que si la souris gauche ou la flèche gauche est maintenue enfoncée, nous voulons que le réservoir tourne vers la gauche, ce qui serait dans le sens négatif. Et si nous maintenons la touche flèche droite enfoncée, le réservoir tournera dans le sens positif. Et si aucune touche n'est enfoncée, le réservoir ne tournera pas du tout. Et nous le faisons en utilisant le Singleton d'entrée, qui est chargé gérer tout ce qui est saisi dans GIDO Et nous allons utiliser une fonction appelée axe G. Et Gaxis prend deux paramètres. Il faut une action négative et une action positive. Et vous pouvez voir la définition de la fonction ici dans l'indication sous mon entrée Donnons-moi donc la gauche et la droite. Maintenant, qu'est-ce que toutes ces absurdités à propos d'actions positives et négatives ? Eh bien, il est possible qu'une valeur d'entrée ait une plage de valeurs, car il est possible , par exemple, si vous utilisez un contrôleur d' appuyer légèrement vers la gauche ou complètement vers la gauche. Et Gadot représente cela avec une valeur d'environ zéro à un pour indiquer à quel point le joystick est enfoncé vers la gauche Et nous voulons combiner cela avec la valeur dans l'autre sens, ce qui n'est pas vraiment possible. Ou peut-être que c'est en quelque sorte le cas. Je veux dire, les choses deviennent drôles quand on a affaire à l'analogique. Mais ce que nous faisons, c'est que, puisque nous utilisons le clavier, la force de saisie de la commande gauche sera soit nulle, ce qui signifie que la touche n'est pas enfoncée, soit une, ce qui signifie que la touche est enfoncée. Cependant, nous voulons différencier lequel est négatif et lequel est positif. Et comme j'ai déjà dit que nous voulions que la gauche soit représentée par un négatif, dans ce cas particulier, la fonction input get access va demander si l' action de gauche se produit ou non. Si c'est le cas et que c'est l'action négative, alors elle renverra une action négative. Et puisque nous sommes l'action positive, si elle est maintenue enfoncée, nous allons en obtenir une. Ce bit de code va donc renvoyer moins un, zéro ou un, selon la façon dont ces boutons sont maintenus enfoncés. Et si vous maintenez les deux enfoncées en même temps, elles s'annulent et le résultat est nul, ce que nous voulons également. Nous allons donc faire la même chose pour la valeur de déplacement, bien que dans ce cas, ce soit l'interface utilisateur vers bas et I vers le haut, ce qui semble un peu en arrière, mais Gadot représente l'avant et arrière avec la coordonnée Z et la coordonnée Z, et je vais vous le montrer ici La coordonnée Z est donc orientée dans cette direction. C'est vers vous, et c' est la direction positive. La baisse de Z est donc positive. La hausse de Z est négative. Donc, normalement, nous pensons que le haut est positif, mais c'est en fait rétrograde. C'est pourquoi nous l' inversons dans le script ici. Et Gadot se plaint parce qu'il est clair que je ne sais pas faire la différence entre un plus et un égal Maintenant que nous avons ces valeurs, nous pouvons vérifier que nous obtenons ce que nous voulons en les imprimant . Alors faisons-le. Alors maintenant, si je commence mon jeu. Eh bien, le tank bouge parce que nous n'avons supprimé aucun code de nos leçons précédentes. Alors ignorons cela pour le moment. Ça ne mènera nulle part. Mais vous verrez si j'appuie et relâchez le bouton vers le haut pour que la force d'entrée augmente. Et vers le bas. Et maintenant, si je fais à droite et à gauche, nous obtenons nos zéros et nos points négatifs exactement comme nous le voulons. Supprimons donc ce code du processus physique, et nous mettrons le mot clé pass ici pour indiquer qu' il s'agit d'une fonction vide, et nous allons devoir définir certaines valeurs et variables afin de faire fonctionner notre tank. Donc, la première chose que nous allons devoir faire est de définir quelques valeurs pour déterminer la vitesse à laquelle notre tank va se déplacer et tourner. Nous allons donc exporter une variable appelée vitesse de rotation. Et une chose à noter est que, techniquement, Gadot utilise Snake Case pour ses conventions de capitalisation Mais je suis programmeur pour Sea Sharp et Java depuis 15 ans, j'ai donc tendance à utiliser Camel Case Je vais probablement passer de l'un à l'autre de manière incohérente tout au long de ce cours, alors ne suivez pas mon exemple. Choisissez-en un et tenez-vous-en à lui. Quoi qu'il en soit, Turnspeed sera un flotteur et la vitesse de déplacement sera aussi un flotteur Et je vais également vous montrer une petite astuce d'annotation qui, si vous connaissez les anciennes versions de Gadot, a été ajoutée vers l'ère 4.2. Je ne sais pas exactement où. Mais si vous souhaitez ajouter une infobulle, passons à notre réservoir ici. Vous pouvez voir que nous avons indiqué la vitesse de rotation et la vitesse de déplacement, et si vous passez la souris dessus, et si vous passez la souris dessus, vous recevez une infobulle indiquant Aucune description disponible ». Et ça te rend triste. Donc, si vous souhaitez ajouter une infobulle, utilisez simplement une double balise de hachage Une seule balise de hachage est un commentaire, ce qui signifie que Godo l'ignorera Mais s'il s'agit d'un double hashtag, c'est une infobulle. Faisons donc tourner la vitesse en degrés. La vitesse de rotation du tank est plutôt exprimée en degrés. Et comme la couleur est légèrement différente, vous pouvez voir qu' il s'agit d'une annotation. Maintenant, si nous allons ici, si nous avons des conseils sur les outils, c'est merveilleux. Depuis que je l'ai découvert, j'en suis amoureuse. J'annote tout maintenant. Donc, comme promis, j'ai fait quelques recherches et j'ai découvert que même si Godot appelle les trois unités de la grille D mètres et agit comme s'il s'agissait de la même unité de mesure que dans Blender, qui utilise également des unités, Godot s'en fout Ce n'est qu'une unité. Vous pouvez les considérer comme des pouces, des mètres, unités de liberté, quel que soit le nom que vous voulez, et les calculs fonctionneront tous de la même manière. Donc oui. Nous allons juste le considérer arbitrairement comme des compteurs. Je ne pense pas que cela soit vraiment important. Et nous allons fournir quelques valeurs par défaut ici. Notre vitesse de rotation en degrés est donc de 20, disons simplement degrés. Et si nous définissons cela de cette façon, c'est parce que la rotation peut être gérée dans GaDO à la fois en degrés et en radians. interne, dans le moteur, tout se fait en radians, mais il accepte les degrés comme valeurs d'entrée dans de nombreux cas, et vous pouvez passer de l' une et vous pouvez passer de à l'autre assez facilement Personnellement, et souvent, lorsque vous faites de la lorsque vous faites modélisation en trois D et d' autres choses de ce genre, c' est plus facile de penser en degrés parce que quand vous parlez d'angle, qu'en pensent la plupart des gens ? Ils pensent à un angle de 45 degrés, un angle de 90 degrés, à un angle droit, peu importe. Tout cela est exprimé en degrés, mais tout le reste est en radians. C'est donc généralement une bonne idée d' indiquer la valeur que vous attendez lorsque vous créez une variable comme celle-ci. Donc oui, vitesse de rotation en degrés. Et la vitesse de déplacement est exprimée en unités par seconde, nous n'avons donc pas vraiment besoin de définir quoi que ce soit ici. C'est égal à dix. Encore une fois, dix unités par seconde. Maintenant, nous allons avoir besoin d'une paire de méthodes pour mettre à jour ces valeurs, et nous allons également avoir besoin des valeurs elles-mêmes car ce ne sont que des constantes. Cela signifie simplement que lorsque le réservoir tourne, il tourne à 20 degrés par seconde, mais nous avons besoin de quelque chose pour contrôler la vitesse de rotation actuelle du réservoir. Et nous verrons pourquoi dans un instant. Définissons donc simplement une variable appelée vitesse de rotation. Et c'est un flotteur, puis nous en aurons un autre appelé vitesse de déplacement. Et ces valeurs sont celles qui vont être modifiées par l'entrée, comme nous le verrons dans un instant. Mais la première chose à faire est de définir quelques fonctions supplémentaires, et l'une d' entre elles s' appellera régler la vitesse de rotation. Et il faudra une valeur d' entrée, qui est un float. Et pour l'instant, nous allons simplement le configurer pour qu'il ne fasse rien. C'est ce qu'on appelle supprimer une fonction. Nous pouvons les définir sans fournir d'informations afin de mettre en place le cadre. Et nous allons avoir réglé la vitesse de déplacement. Maintenant que nous avons ces valeurs, nous pouvons retourner au jeu, et au lieu de simplement les imprimer, nous pouvons prendre le tank du joueur et définir sa vitesse de rotation en fonction de sa valeur de tour. Et nous pouvons définir la vitesse de déplacement du joueur en fonction sa valeur de mouvement. Alors, qu'est-ce que tout cela signifie ? Cela signifie que lorsque l'état des touches change, c'est-à-dire lorsque l'utilisateur appuie ou relâche une touche, ces informations sont calculées, comme nous l'avons mentionné précédemment, comme nous l'avons mentionné précédemment, puis ces valeurs modifient les vitesses de rotation et de déplacement existantes. Donc, si le réservoir ne bouge pas du tout, sa vitesse de rotation sera nulle. qui se reflétera dans le fait que la valeur du tour transmise est nulle. Et si le réservoir tourne vers la gauche, eh bien, la vitesse de rotation sera la vitesse de rotation existante modifiée par la direction. Il serait donc négatif 20 pour la gauche et positif 20 pour la droite. Nous voulons donc régler la variable de vitesse de rotation égale à la vitesse de rotation du réservoir en degrés multipliée par la valeur d'entrée. Encore une fois, puisque si nous avions appuyé sur la touche gauche, la valeur d'entrée serait égale à moins un. Cela signifie que la vitesse de rotation serait 20 fois moins un, soit moins 20, ce qui signifie que le réservoir tournerait à moins 20 degrés, ce qui le ferait pivoter vers la gauche et pareil pour la droite. Et nous allons faire de même pour la vitesse de déplacement. Donc, la vitesse de déplacement va être égale Eh bien, euh, vitesse de déplacement va être égale à la vitesse de déplacement, et c'est là que j'ai créé deux variables dont le nom est ambigu, donc vous ne devriez pas le faire Appelons cela la vitesse d'avancement. Maintenant, appelons cela la vitesse de déplacement, et celle-ci est la vitesse d'avancement. La vitesse d'avancement est donc égale à la vitesse de déplacement multipliée par la valeur d'entrée. Maintenant que nous avons ces valeurs, nous pouvons modifier les valeurs existantes des réservoirs avec ces nouvelles valeurs dans le processus physique. Donc, comme je l'ai déjà mentionné, le processus physique est appelé 60 fois par seconde, et c' est là que vous effectuez toutes les manipulations, par exemple, de la vitesse, de la rotation ou de tout autre élément susceptible d'affecter les valeurs physiques des réservoirs. Dans notre cas, il s' agirait donc de la vitesse du réservoir et, bien sûr, de sa rotation. Donc, la première chose que nous allons faire est de régler la rotation du réservoir égale à sa rotation actuelle plus la vitesse de rotation. Alors, comment s'y prendre ? Eh bien, il y a deux façons. Il existe une variable dans le nœud trois D appelée rotation, mais il en existe également une appelée degrés de rotation. Comme je l'ai dit, comme j'aime travailler en degrés et que les degrés de rotation sont une variable pratique spécialement conçue pour cela, je vais définir des degrés de rotation égaux à un nouveau vecteur trois et nous allons commencer par trois zéros Cela signifie donc qu' il n'y a absolument aucune rotation. Mais ce que nous voulons faire, c'est faire pivoter le réservoir le long l'axe y, car l'axe Y est celui qui est droit de haut en bas. Et si nous faisions pivoter le réservoir le long de cet axe, le réservoir tournerait sur place. Donc, comme vous pouvez le voir ici, puisqu' il s'agit de la ligne vert clair et que c'est la rotation en vert clair, si je devais la déplacer, le tank se déplacerait ainsi. Et c'est ce que nous voulons faire dans le code. Nous revenons donc ici aux degrés de rotation, et nous voulons changer la composante Y. La composante Y est donc désormais égale à la vitesse de rotation multipliée par Delta. Et c'est parce que nous voulons l'adapter au temps qui s' temps est écoulé entre les images, comme c'est le cas de Delta. Sinon, la vitesse de rotation, qui est de 20 ou 20, serait appelée 60 fois par seconde, ce qui signifie que tous les 60 secondes, la rotation serait actualisée de la rotation serait actualisée ce qui signifie que tous les 60 secondes, la rotation serait actualisée de 20 degrés dans les deux sens, et nous ne voulons pas d'un tank qui tourne comme une toupie Cela devrait donc réellement fonctionner. Lancez notre jeu et voyons voir. Maintenant, si j'appuie sur la gauche, il ne se passe absolument rien. Et si j'appuie sur la droite, il ne se passe absolument rien. Eh bien, c'est cassé. Bien, voyons quel est le problème Le problème est probablement que nous ne faisons pas de mouvement et de glissement. Je ne pense pas que ce soit le cas, mais vérifions-le. Non, ce n'est pas le cas. OK, je vois quel est le problème. Le problème est que je règle inconditionnellement la rotation sur une valeur, alors que nous voulons qu' elle soit égale à la valeur actuelle plus la nouvelle valeur Parce que cela nous donnera un 20 ou moins 20. Et si nous changeons la rotation juste à 20, nous n'obtiendrons pas une rotation cohérente. Nous sommes le tank qui va se bloquer à 20 ou à moins 20, et ce sera la fin de tout. Ce que nous voulons, c'est qu'il change progressivement au fil du temps. Donc, si la rotation était nulle, nous l'ajoutons pour qu'elle soit inférieure à 20 secondes. Et puis au tour suivant, il fait moins 40 sur une seconde et ainsi de suite. Cela devrait donc régler le problème. Et nous l'avons fait à l'envers, et c'est parce que nous devons inverser les valeurs ici Parfait Maintenant, nous avons un réservoir rotatif, et nous faisons presque la même chose pour le mouvement. Donc, ce que nous devons faire, c'est définir trois D intégrés au corps du personnage, variable de vélocité, ce que je ne peux apparemment pas épeler vélocité. Et la vélocité sera égale à quelque chose. Il existe maintenant plusieurs manières de déterminer comment déplacer un nœud en fonction de sa face. Le plus simple est de prendre un vecteur orienté vers l'avant, le multiplier par la valeur du mouvement, puis de le régler sur la vélocité. Et bien que cela soit parfaitement acceptable, la plupart du temps, Gadot vous recommande ne pas le faire pour toute une série de raisons mathématiques Cela devient aussi un peu compliqué parce que vous devez tenir compte de l'orientation du char du fait que Gadot considère Forward comme étant dans la direction Z et de toutes sortes d' autres bêtises qui vous poussent probablement à me regarder vous demander : « De quoi parle ce type en ce moment ? La méthode la plus simple consiste à utiliser un outil interne ou un objet interne appelé base de transformation. Ainsi, chaque nœud de Gadot possède une variable interne appelée transform, et transform est exactement ce à quoi elle ressemble C'est essentiellement cet objet ici, qui détermine la position, la rotation et l' échelle de l'objet et probablement quelques autres éléments que j' oublie dans l'espace en trois D. Et Gadot gère tous ces calculs grâce à son moteur physique intégré. Et l'une des variables internes de la transformation qu'elle nous donne est ce qu'on appelle la base. La base est le résultat de tous ces calculs avant toute modification supplémentaire que vous pourriez apporter. Je vais donc vous montrer comment cela fonctionne. Oups. Control K. Nous allons les commenter et revenir au jeu, et nous allons juste changer un peu les choses. Lecteur d'impression Dot Transform Dot BASIS. Maintenant, je vais juste appuyer sur une touche et le jeu s'arrêtera. Et c'est la base. La base est un vecteur de vecteurs. Et cela vous donne l'orientation de votre objet dans toute une série de contextes différents. Le plus utile pour nous est le contexte X car ce vecteur détermine l'orientation X et Z de notre réservoir une fois la rotation appliquée. Et pour faire avancer le char, nous voulons le déplacer dans le plan X Z. serait donc une combinaison de cette direction et de la direction bleue vers l'avant et vers arrière dans la direction vers laquelle le réservoir fait face. Donc, si nous revenons à notre script et que nous pouvons nous en débarrasser, la vélocité du char sera égale à la base des chars, la composante X de la base des chars, multipliée par la vitesse de déplacement. Et cela fera évoluer vecteur X en fonction de la vitesse de déplacement, qui est exactement ce dont nous avons besoin pour la vitesse. Maintenant, si j'appelle Move and Slide, cela devrait permettre au tank d' avancer dans la direction dans laquelle il se trouve. Alors croisons les doigts. Et, euh, non. C'est parce que la vitesse de déplacement est constante. Nous voulons vraiment avancer rapidement. C'est pourquoi vous devez nommer vos variables manière judicieuse et responsable OK, allons-y. Maintenant, si j' avance, le tank avance. Si je repousse, il recule. Si je fais pivoter le réservoir et que je le déplace maintenant vers l'avant , c'est parti. Visons l'arbre, et nous le traverserons directement. Et c'est parce que nous n'avons activé aucune sorte de collision. Et la seule raison pour laquelle il semble y avoir une collision est que , comme nous n'appliquons aucune vitesse dans la direction Y, le réservoir n'est en aucun cas affecté par la gravité, il ne tombera donc pas. Mais maintenant, nous avons un tank en mouvement, et nous pouvons passer à la leçon suivante. Je t'y verrai donc. 14. Réagir aux apports des joueurs - contrôler la tourelle: Bon retour. Dans cette leçon, qui va être infiniment plus facile que la précédente, nous allons tirer parti de ce que nous avons appris dans la leçon précédente afin de manipuler la tourelle du char La première chose à faire est donc de fournir quelques variables supplémentaires à notre réservoir. Plus précisément, nous avons besoin d'une vitesse de rotation de la tourelle. Et nous avons également besoin d'une vitesse angulaire de tourelle. Parce que la tourelle pourra à fois pivoter et monter et descendre Par conséquent, nous aurons également besoin d' une vitesse de déplacement de la tourelle Et enfin, une tourelle. Nous y voilà. Nous allons avoir besoin d'un angle maximal pour la tourelle afin qu'elle ne puisse pas tourner de tous côtés Angle maximal de flottement de la tourelle en degrés. Et appelons ça 15. Et nous allons avoir besoin de fonctions similaires pour manipuler la tourelle de la même manière que nous l' avons fait pour tourner et déplacer Faisons donc des rotations. Tourelles Non. Cela va nécessiter une valeur d'entrée. Et une tourelle d'angle. Je ne peux pas taper, sauver ma vie, n'est-ce pas ? Maintenant que nous les avons, nous pouvons modifier la rotation et la vitesse d'angle exactement de la même manière que nous l'avons fait pour le tournage et la rotation. Et pour simplifier les choses, l'angle de la tourelle, la vitesse de montée et de baisse seront exactement les mêmes que la vitesse déplacement de la tourelle, la vitesse de rotation Si, en tant qu'exercice, vous souhaitez le modifier pour qu' il utilise une valeur différente, ce serait un bon exercice à faire pendant votre temps libre. D'accord. Donc, avant de pouvoir manipuler ces valeurs via les commandes et de les ajouter à notre processus physique, ce que nous allons faire, nous avons besoin de références à la partie tourelle du char Donc, si nous revenons à notre valeur en trois D ici, notre vue en trois D ici, dans notre leçon précédente, nous avons en fait créé un nœud pour représenter le char, qui contient les instances maillées du char, puis nous avons également créé un point d'ancrage du canon, puis nous avons également créé un point d'ancrage du canon, qui relie le canon à la tourelle Maintenant, nous devons obtenir références à ces valeurs depuis l'intérieur du réservoir. Et il y a plusieurs façons de le faire dans Gadot. Mais de nos jours, en quatre points deux et quatre points trois, le moyen le plus simple de le faire est d'utiliser des références d'objets. Nous allons donc exporter quelques valeurs supplémentaires. Et comme il s' agit dans les deux cas du nœud trois D, nous pouvons fixer le type au nœud trois D. Nous allons donc exporter la tourelle et la charnière de la tourelle Maintenant qu'ils existent, nous pouvons passer au char, et nous pouvons faire glisser la tourelle ici et la charnière de la tourelle, qui est le point d' ancrage du canon Ensuite, nous allons les regrouper un peu. Les degrés de rotation de la tourelle seront donc modifiés exactement de la même manière que les chars en créant un vecteur de rotation et en utilisant la vitesse de rotation de la tourelle multipliée par un vecteur de rotation et en utilisant la vitesse de rotation la vitesse de rotation de la tourelle Delta tourelle Et nous allons faire la même chose pour la charnière, mais pas tout à fait Les degrés de rotation actuels de la charnière seront donc modifiés par un vecteur trois, mais nous allons le faire pivoter selon un angle différent Nous allons le faire pivoter le long de l'axe Z pour qu'il se déplace vers le haut et vers le bas, car l'axe Z entre et sort. Et ensuite, si nous le faisions pivoter avec le bleu, qui représente le Z, il monterait et descendrait. Cela signifie donc que les propriétés X et Y du vecteur seront nulles, mais que le delta de la vitesse de rotation de la tourelle , ou plutôt la composante Z sera la vitesse de rotation de la tourelle Et nous allons faire encore une chose. Nous devons ajuster les degrés de rotation à notre plage d'angle maximale, et nous le faisons avec la méthode de serrage F car nous allons travailler avec des flotteurs Donc, degrés de rotation de la charnière Turrent . Et nous voulons la propriété Z parce que c'est la rotation vers le haut vers le bas. degré de rotation de la charnière Z est égal à la valeur de retour de la pince F. Et ce que nous voulons faire, c'est que la pince F prend trois paramètres La première est la valeur que nous sommes en train de fixer. Le second est le minimum de la plage à laquelle nous fixons, et le troisième est la portée maximale de ce à quoi nous fixons. Ce seront donc respectivement des degrés d'angle maximum négatifs et des degrés d'angle maximum négatifs. Donc maintenant, si nous essayons de faire pivoter ras de notre tourelle ou de l'abaisser en dehors de cette plage, cette méthode va la maintenir dans cette plage, et nous n'allons pas faire tourner la tourelle dans le sens vertical, ce qui est exactement ce que Maintenant que tout cela est fait, nous devons modifier notre méthode de jeu ou notre méthode saisie de touches non manipulée afin que tout cela fonctionne Alors, comment vas-tu t'y prendre ? Eh bien, ce que nous allons faire, c'est partir principe que si le joueur appuie sur sa touche de contrôle, il manipule la tourelle, et si ce n'est pas le cas, il manipule son il manipule Nous devons donc vérifier notre Singleton d'entrée, et nous allons utiliser la méthode une touche physique. Ensuite, nous allons rechercher la touche de contrôle, et elle est là. Maintenant, si vous appuyez sur la touche Ctrl, nous voulons utiliser le changement des valeurs de déplacement de la tourelle Sinon, nous voulons l'utiliser pour le réservoir. Nous avons donc défini le joueur, joueur fait pivoter la tourelle avec la valeur du tour et tourelle angulaire du joueur avec la valeur du déplacement Cependant, cela fonctionnera, mais il y aura un bogue. Et l'un des avantages d' acquérir plus d'expérience en programmation est que vous serez capable de détecter les bogues vous serez capable de détecter les bogues avant de les rencontrer pendant les tests. Supposons donc que nous appuyions sur la touche de contrôle, nous appuyions sur la touche flèche droite, que nous fassions pivoter la tourelle, puis que nous relâchions la touche de commande Eh bien, cela va passer de cette section à cette section, ce qui signifie que la vitesse de rotation de la tourelle ne sera pas mise à jour avec la valeur actuelle du tour Donc, au lieu de passer zéro ici pour empêcher la tourelle de tourner, elle va descendre directement ici Nous devons donc arrêter explicitement le mouvement et la rotation du char lorsque nous manipulons la tourelle Et nous le faisons en passant explicitement zéro à la vitesse du virage. Et si nous manipulons le char, nous voulons forcer les valeurs des tourelles à zéro Et cela devrait fonctionner. Alors maintenant, si je déplace mon tank normalement , c'est génial. Maintenant, si je garde le contrôle enfoncé , quelque chose ne va pas. Mais nous sommes proches. Vous pouvez donc voir que si je maintiens la commande enfoncée et que le réservoir tourne et tourne à la fois, il semblerait que j' utilise accidentellement les mêmes valeurs quelque part. Vitesse de rotation T, vitesse d'angle de la tourelle. Euh hein. Et c'est ici. Au lieu d'utiliser la vitesse angulaire de la tourelle pour incliner la tourelle, j'utilise la vitesse de rotation Maintenant, cela devrait fonctionner. Et voilà. Et comme vous pouvez le constater, si j' essaie d'incliner la tourelle une valeur supérieure à la plage d'angles que nous avons définie, cela ne fonctionne pas Et vous pouvez même et, bien sûr, maintenant, si je déplace un char et que je touche le sol si je touche le contrôle, le char arrête de bouger et la tourelle continue OK. Comme vous l'avez peut-être remarqué, nous pouvons actuellement traverser les arbres, les rochers et les collines, et c'est dommage. Donc, dans notre prochaine leçon, nous allons apprendre comment configurer la collision, et après cela, les choses vont devenir intéressantes. Nous pouvons commencer à faire des ravages et à détruire des objets. Je vous verrai donc dans la prochaine leçon. 15. Collision: Bon retour. Cette leçon va être infiniment plus simple que les deux précédentes et encore plus simple que la précédente Donc, si toutes ces bêtises liées aux mathématiques vectorielles et à la rotation vous tournaient la tête , ce sera un peu une pause Nous allons donc examiner la collision, et nous allons corriger ce petit avertissement jaune. Donc, depuis que nous avons transformé notre tank en un corps de personnage en trois D, cela ne cesse de se plaindre depuis que nous avons transformé notre tank du fait qu'il n'a aucune forme. Nous allons donc lui en donner un. Passons donc à notre vue en trois D. Et j'ai cliqué sur le Z, et bien, tout d'abord, je me suis assuré que c' était le cas et que ce n'était pas ça Je me suis assuré qu'il s'agissait d'une vue bâbord à deux vues et j'ai cliqué sur le Z et sur le Y pour que nous ayons cette belle vue de haut en bas et orientée vers l'avant pour Donc, comme je l'ai déjà mentionné, notre tank est un tank de type tank, qui est un corps de personnage trois D. C'est un objet physique, et un objet physique a besoin formes de collision pour fonctionner. Et comme nous n'avons jamais ajouté nœud en forme de collision à ce truc, nous avons cette petite icône jaune qui se moque de nous depuis tout ce temps Nous allons donc ajouter un nœud enfant, et nous allons ajouter une forme de collision en forme de trois D. Boom. Maintenant, la forme de collision en trois D nécessite une forme très similaire aux primitives de maillage que nous avons utilisées. Nous allons donc opter pour une forme de boîte et nous avons maintenant tout un tas de widgets qui nous permettront d'indiquer la taille et l' orientation de la Xbox. Donc, la première chose que nous allons faire est faire traîner les choses un peu vers le haut. Ensuite, nous allons et pour une raison ou une autre, ça craque. Ce doit être un bug et Gadot. Parfois, il s' enclenche sur les clichés des grilles, même si vous ne le souhaitez pas Voyons donc si je peux y aller. Je ne sais pas pourquoi c'était enfermé là-dedans auparavant. Quoi qu'il en soit, vous pouvez utiliser ces petits cercles roses pour modifier la taille et la position de votre boîte. Donc, ce que nous voulons faire, c'est nous assurer que la boîte couvre l'intégralité de notre réservoir dans les deux sens. Nous voulons donc qu'il recouvre le réservoir dans cette direction. Et en regardant vers le bas, nous voulons nous assurer qu'il est suffisamment long pour couvrir également le réservoir dans cette direction. Maintenant que nous avons une boîte entourant le réservoir, lorsque nous essayons de le faire bouger en utilisant la méthode Move and Slide. Regardons ça encore une fois. Comme notre processus physique se déplace et glisse, Godot va tenter de faire collision notre boîte en forme de collision Et comme vous pouvez le constater, le petit avertissement est en train de disparaître. Il va essayer de faire entrer en collision cette boîte en forme de collision avec toutes les autres boîtes en forme de collision que nous avons dans notre niveau de jeu. Et pour le moment, nous n'en avons aucune. Faisons donc en sorte que nos arbres, rochers et nos collines puissent entrer en collision. Donc, notre arbre, revenons à notre arbre, et notre arbre est un nœud en trois D, alors donnons-lui une forme de collision. Et si nous essayons de le faire, nous recevons à la fois une erreur et un avertissement. L'avertissement, bien sûr, parce que nous n'avons pas de forme. Mais l'erreur est que notre arbre n'est pas du bon type de nœud pour utiliser réellement une forme de collision. Il existe donc trois types de corps physiques qui utilisent la collision. Nous avons déjà un corps de personnage trois D, qui est notre tank, mais nous devons également changer de type. Un corps statique en trois D et un corps statique en trois D sont objets physiques qui ne bougent pas. Et non seulement il ne bouge pas, mais il ne bougera jamais, ce qui signifie que Gadot n'essaiera pas de lui appliquer de la gravité ou quoi que ce soit d'autre, mais il peut entrer en collision Maintenant que nous avons une forme de collision, changeons la forme de collision en cylindre. Et maintenant, nous pouvons modifier la taille de notre cylindre et le déplacer vers le haut. Et encore une fois, ça craque pour une raison ou une autre. Il s'agit d'un bug odieux. Allons-y. Je ne sais pas pourquoi il continue de le faire. Cela ne me plaît pas du tout. Mais encore une fois, nous pouvons utiliser les poignées pour indiquer la taille du cylindre. Alors maintenant, notre arbre est complètement recouvert par une collision Oups, par une forme de collision Et fonctionne vraiment. Donc, oui, vous pouvez voir qu' il est entouré par ce cylindre. Et nous allons faire les autres également. Mais maintenant, sans aucun code supplémentaire, si je tombe sur l'arbre, boum, je ne peux pas le parcourir. Ajoutons donc des formes de collision à nos rochers et à nos collines, puis nous pourrons passer à la leçon suivante. Donc, encore une fois, il va falloir changer de colline. Nous pouvons donc transformer la colline en nœud enfant. Nous allons donc devoir accéder à un corps statique parce que c'est un maillage, ce qui signifie que nous allons perdre toutes ces informations. Nous allons donc devoir faire preuve de délicatesse. Nous allons ajouter un nœud enfant, et ce sera un corps statique en trois D. Ensuite, nous allons cliquer dessus avec le bouton droit de la souris et nous allons dire make scene root, et maintenant ils sont inversés Le corps statique en trois D est énorme, ce que nous ne voulons pas. Nous allons changer cela dans un instant. Mais maintenant, la colline a été divisée en trois corps statiques D. Revenons donc à la transformation, et les transformations seront bonnes Pour une raison ou une autre, ce truc est énorme. Je ne sais pas pourquoi, mais nous allons lui donner une forme de collision. Et allons-y avec un coup de gueule. Repartons avec une double vue. Et encore une fois, ce n'est pas correct. Ça y est. Double vue, boum. Nous l'avons en bas et en haut. Et je suppose, ah, oui, que c'est parce que ces positions sont incorrectes, alors changeons cela Nous allons le remettre à zéro. Et maintenant, nous l'avons ici, comme ça. Nous voulons donc que les rotations restent les mêmes, mais nous voulons qu'elles soient localement à 00 Et maintenant, le corps statique en trois D n'est même pas aussi grand qu' il ne l'était auparavant, et c'est ce que nous voulons. Nous allons donc et nous allons déplacer ceci afin que nous puissions le voir. Et comme sa base est carrée, nous allons ajouter une boîte comme nous l'avons fait avec le tank. Ensuite, nous allons simplement étirer ce gars et le faire pivoter de manière à ce qu'il soit incliné selon le même type d' orientation angulaire que la colline elle-même Et c'est parfait. Et nous ferons de même pour une pierre. Encore une fois, nous allons devoir ajouter un nœud enfant. Corps statique en trois D, faites du snoot. Nous allons nous réorienter Eh bien, celui-ci était en fait correct. Et nous allons donner au corps statique sa propre forme de collision. Et nous allons également en faire un cylindre. Mm. Parce que malgré leur petite taille, nous ne voulons pas nous occuper des interactions physiques liées au fait de rouler sur des roches Nous voulons simplement que le joueur ne puisse pas se déplacer le long d'eux ou les survoler. Ça nous évite bien des maux de tête. OK. Et la toute dernière chose que nous allons faire est de configurer les masques anti-collision. Alors, qu'est-ce qu'un masque anticollision ? Un masque de collision est un ensemble de drapeaux qui indiquent à Gadot ce qu'il doit entrer en collision et ce qu'il ne doit pas entrer Ainsi, sous notre tank, nous pouvons voir qu'il y a un onglet de collision sous le corps du personnage, trois D. Et si nous l'agrandissons, nous avons tout un tas de couches et tout un tas de masques. La couche est la couche de collision à laquelle appartient l'objet. Renommons donc certains d'entre eux. Modifiez donc les noms des couches. La première couche sera joueuse. La deuxième couche sera constituée d'obstacles. Et dans la troisième couche, même si nous n'en avons pas encore, nous serons ennemis. Maintenant, nous pouvons dire que le joueur se trouve sur la première couche de collision, qui est le joueur, et qu'il entre en collision Et si nous décochons cette option, elle ne tentera pas de se heurter à elle-même, car c'est à la fois stupide et impossible. Mais si nous cliquons sur deux ou trois, cela signifie que le joueur entrera en collision avec tout ce qui est réglé sur les couches de collision entre les obstacles ou les ennemis sur les couches de collision entre les Donc, si nous revenons à l'arbre si nous étendons la collision et que nous la définissons comme obstacles, puis que nous laissons le masque sur l'un d'entre eux, il va entrer en collision avec le joueur Et maintenant, nous allons faire de même pour les collines et les placer également sur la couche d'obstacles. Ils vont entrer en collision avec le joueur et de même avec le rocher Et fonctionnellement parlant, cela n'a rien changé. Oup. Alors, euh, qu' est-ce qui ne va pas ? C'est étrange. Ai-je déplacé le réservoir d'une manière que je n' aurais pas dû déplacer ? Eh bien, l'une des collines a changé. Oh, je vois le problème. J'ai déplacé l'une des collines, et maintenant elle se trouve directement au-dessus du réservoir. Déplaçons donc celui-ci. Retournons à l'arène, et nous trouverons la colline qui trouvait directement au centre, et nous allons simplement la déplacer ici. Ensuite, nous avons une deuxième colline ici, qui a une orientation étrange . Changez ça. Cela devrait être mieux. OK, maintenant recommençons le jeu. OK, c'est beaucoup mieux. Maintenant, si je cours droit vers ce rocher, je le heurterai et je m'arrêterai. Boum, et c'est parti. Et maintenant, nous allons faire de même pour l'une des collines. Passez directement devant cet arbre. Et boum, nous avons atteint la colline. Et comme vous pouvez le constater, puisque je touche la colline en biais, je glisse le long de celle-ci, et c' est ce que font Move and Slide. Si vous ne voulez pas glisser le long de l'objet avec lequel vous entrez en collision et simplement arrêter vos chars, il existe une méthode appelée «   déplacement et collision Et je vais vous le montrer très brièvement. Nous n' allons pas vraiment l'utiliser, mais nous avons Move and Collide, et Move and Collide nécessite en fait beaucoup plus de paramètres que Move and Slide Au strict minimum, cela prend notre vitesse. Mais. Mais il ne se place pas sous le capot comme le fait un toboggan mobile. Nous devons donc modifier notre vitesse via notre Delta. Maintenant, si j'y retourne et que j' essaie de percuter une colline, mon tank ne se déplacera pas le long de la colline. Ça va juste s'arrêter. Boum, et c'est parti. Maintenant, il peut toujours pivoter, mais maintenant, si j'avance, le char ne glissera pas le long de la colline. Donc, selon le type de jeu que vous voulez jouer, c'est une préférence personnelle. Vous pouvez glisser ou ne pas glisser. Nous allons revenir à la glisse simplement parce que c'est un peu plus facile. Maintenant que nous pouvons entrer en collision, nous allons commencer à tirer des obus et à faire exploser des objets Je vous verrai donc lors de la prochaine leçon. 16. Le nœud RigidBody - Démarrer une coquille l l: Bon retour. Dans cette leçon, nous allons devenir violents, et nous allons implémenter les commandes et les calculs en trois D très complexes qui nous permettront de tirer des obus sur nos adversaires. Mais avant cela, nous devons procéder à une certaine réorganisation. Ainsi, une fois que vous commencez à utiliser les mathématiques en trois D, l'orientation de vos modèles est importante. C'est très important. Et le fait que notre tank orienté le long de l'axe X va commencer à nous poser des problèmes, car Gadot suppose en fait que l'axe Z positif est vers l'avant Donc, au strict minimum, vous devrez faire pivoter tous vos calculs d'angle de 90 degrés, et c'est insensé. Ce n'est pas ce que nous faisons. Nous allons donc prendre tous les sous-composants de notre réservoir parce que le réservoir lui-même ne sera pas pivoté de façon amusante, mais nous allons prendre tous ces objets, et nous allons les faire pivoter de 90 degrés sur l'axe Z. Et c'est totalement faux. Nous allons réessayer. Allons au corps ici. Et il fait 90 degrés le long de l'axe Y, pas de l'axe Z. Et j'ai café devant moi aujourd'hui, donc je n'ai aucune excuse. D'accord. Bien sûr, c'est correct, mais comme la tourelle était décalée, doit être réglée manuellement Je vais donc simplement le faire glisser de manière à ce qu'il soit à zéro X et donc parfaitement centré. Et je l'ai mal fait. Il fait en fait 90 degrés dans la direction opposée. Nous y voilà. Maintenant, bien sûr, la caméra est éteinte, il va donc falloir la repositionner complètement, et ce n'est pas grave Nous allons simplement utiliser notre petit bonhomme vert pour le manœuvrer dans les bonnes positions X Z. Nous veillerons à ce qu' il soit placé directement sur le X, puis nous le ferons simplement pivoter pour qu'il fasse face au réservoir comme il se doit Nous allons égaliser cela à moins 180. Nous allons le prévisualiser. Ça a l'air bien. Oh. En fait, cette tourelle est un peu trop en avant. Eh bien, ramenons-le. Ouaip. Bon, maintenant tout va bien et tout est bien orienté. Nous allons nous assurer que c'est bien. Notre boîte de collision est légèrement ouverte. De plus, je pense que nous l'avons fait un peu trop grand. Nous allons simplement réduire ce chiffre, si cela compte beaucoup, et nous sommes bons dans cette direction. OK, une autre chose que je vais mentionner , c'est qu'après cette leçon ou pendant cette leçon, l'inspecteur de notre tank va commencer à s'encombrer parce que nous allons ajouter, genre, quatre autres variables lesquelles nous voulons pouvoir jouer Heureusement, il existe un moyen de régler ce problème. Nous pouvons utiliser quelques notations d'exportation supplémentaires afin d'organiser nos informations ici Maintenant, le premier qui est extrêmement utile s'appelle Export Group. Et pour cela, il faut une étiquette. Ainsi, une fois que vous aurez fait cela, tout ce qui est exportable après cette balise sera placé dans le groupe Vous pouvez donc le réduire et le rouvrir Et si vous voulez effacer le groupe, il vous suffit d'en mettre un autre ici et de retirer l'étiquette, puis tout redeviendra là où il devrait être. Maintenant, bien sûr, Gadot aime placer les groupes au bas de l'échelle Donc, même si nous n'avons aucun groupe, aucun groupe, tout ce qui n'est pas un groupe va aller en haut, et tout ce qui n'est pas en groupe va aller en bas. Une autre catégorie, un peu moins utile un point de vue visuel, s' appelle la catégorie Export, et cela crée un tout nouvel en-tête gris ici. Et c'est peut-être ce que tu veux. On ne sait jamais. Alors voilà. Nous allons rassembler les éléments nécessaires à la tourelle dans son propre groupe. Et nous avons la vitesse de virage, la vitesse de déplacement, c'est bien. Angle arrière de la tourelle, bla, bla. Tout cela est, en fait, lié à la tourelle, donc nous sommes bons Et nous allons laisser les choses comme ça pour le moment. Et avant de continuer, nous devons apporter une modification à notre code existant en raison de la rotation du modèle de réservoirs. C'est-à-dire que nous devons changer le fait que nous calculons notre vitesse en utilisant la base de transformation comme base Nous utilisons actuellement la propriété X, mais nous devons la remplacer par Z. Et une fois cela fait, notre char devrait manœuvrer de la même manière qu'avant H Très bien, nous allons bien. Maintenant, créons et ajoutons le shell. Donc, bien sûr, la première chose à faire est de créer le modèle de coque lui-même, ou plutôt la scène de coque. Nous allons donc faire une nouvelle scène, et ce sera une scène en trois D. Mais au lieu d'utiliser un nœud, nous allons cliquer avec le bouton droit de la souris, changer de type, et nous allons le remplacer par un corps rigide trois D. Maintenant, qu'est-ce qu'un corps rigide trois D ? Un corps rigide en trois D, comme le corps du personnage trois D et le corps statique trois D que nous avons utilisés jusqu'à présent. C'est un objet physique. n'est que dans ce cas qu'il s'agit d'un objet physique qui peut réellement supporter des forces telles que la gravité , la poussée, etc. Et nous allons le faire affecter par la gravité et également par la vitesse initiale de notre canon afin de pouvoir tirer et entrer en collision avec d'autres cibles Nous allons donc le renommer et l' appeler shell Et nous allons revenir à trois D, et nous allons à nouveau ajouter une instance de maillage trois D. Et celui-ci sera un tube trail mesh. Et si nous allons utiliser un treillis tubulaire, c'est parce que nous pouvons le manipuler de manière faire ressembler à une coque sans rien faire d'autre. Nous allons donc cliquer avec le bouton gauche de la souris sur le maillage pour l'ouvrir. Mais la première chose que nous devons faire , comme nous le faisions auparavant, c'est de le faire pivoter de manière à ce qu'il soit orienté vers l'avant. Nous allons donc redescendre pour transformer et nous allons le faire pivoter le long de l'axe X pour qu' il soit maintenant orienté vers l'avant. Et comme nous le pouvons, nous allons augmenter le nombre de pas radiaux à dix, ce qui signifie qu'il sera légèrement plus rond Nous pourrions même l' augmenter encore si nous le voulions Mais plus le nombre de polygones d'un objet est élevé, rendu est lent Nous allons donc simplement le ramener de huit points. Cela n'aura pas vraiment d' importance à long terme. Donc, pour ce qui est du bas, nous allons le modifier de manière à ce que nous fassions face latéralement afin de pouvoir voir ce que nous faisons Et en fait, pour ce qui est du haut , faisons-le du haut vers le bas. OK, maintenant nous pouvons voir ce qui se passe. Nous allons donc changer les sections à deux, et nous allons changer le rayon et la longueur de la section. Maintenant, nous voulons qu'il puisse rentrer dans le réservoir. Et en fait, économisons notre travail et réparons le réservoir pendant que j'y pense. Et qu'est-ce que je veux dire par réparer le réservoir ? Eh bien, la première chose que nous allons devoir faire est d' indiquer où l'obus va tirer depuis le tank. Vous pouvez soit ajouter un nœud trois D, mais il y a quelque chose qui est légèrement plus utile pour nous, et cela s'appelle un marqueur trois D. Et un marqueur trois D, comme vous pouvez le voir, est un enfant du nœud trois D, il s'agit donc essentiellement d'un nœud trois D. Cependant, le marqueur trois D est essentiellement un point de référence. C'est un peu difficile à voir d'ici, laissez-moi voir si je peux l'étendre un peu. Oui, ce n'est pas facile à voir. Mais un marqueur trois D est fondamentalement l'équivalent d'un point trois D. Et même si c'est un peu difficile à voir dans ces fenêtres, cause des Gizmos, laissez-moi voir si je peux . Nous y voilà. OK. Donc, si je ne sélectionne pas, c'est un peu plus facile à voir Donc, ici, vous pouvez voir qu'il s'agit essentiellement d'un ensemble de réticules qui indique où se trouve le point dans un espace en trois D. Et cela n' apparaît pas dans le jeu. s'agit simplement d'une référence qui vous permet de savoir où il se trouve sans avoir à le sélectionner, car normalement, si je devais sélectionner un nœud, il serait surligné. Mais dans ce cas, le marqueur vous indique toujours où il se trouve. J'ai donc incliné et positionné le marqueur de telle sorte qu'il se trouve à l'intérieur de notre canon, ce que nous voulons, car l'obus va tirer depuis l'intérieur du canon Cela nous cause en fait quelques complications légères, mais cela semble meilleur à long terme. Je veux dire, donc nous pourrions mettre le marqueur ici, puis nous allons faire apparaître l'obus ici Et c'est très bien, mais cela signifie que l'obus va apparaître devant le canon puis tirer vers l'extérieur Et juste par souci de réalisme, nous voulons que notre carapace apparaisse à l'intérieur du canon puis tire vers l'extérieur Le développement de jeux est donc une question de compromis. OK, maintenant que nous avons un marqueur, qu'il est relié au canon et à tout ce que nous faisions, nous pouvons revenir à ce que nous faisions Revenons donc à notre coquille. Mais d'abord, avant de le faire, nous devons voir quelle taille réelle d'un baril. Il a donc un rayon de 0,1 et une longueur de section de 0,2. Souvenons-nous de cela. Nous voulons donc que le rayon soit légèrement plus petit. Disons donc 075. Et je l'ai déjà oublié. Quel était le rayon ? Quelle était plutôt la longueur ? La longueur de la section était de 0,2. Disons, 0,175. Et un moyen rapide de savoir si c'est correct ou non, c'est de prendre notre shell et l'insérer dans notre scène de jeu principale. Et on pourrait le mettre ici. Et, euh, et ça a l'air d' être à peu près de la bonne taille. Parfait. OK, nous allons donc le supprimer. Et nous allons revenir à ce que nous faisons. Revenons donc à la coque, et nous allons changer son matériau, le matériau standard, l'albédo, et nous allons en faire un gris foncé Et nous allons modifier une courbe. Alors, qu'est-ce qu'une courbe ? Une courbe est une ligne courbe qui affecte l'objet en fonction de son type. Donc, dans ce cas, il va appliquer la courbe à la section du cylindre dans laquelle nous nous trouvons. Nous allons donc le réduire à deux ou peut-être un, disons, et maintenant nous sommes là, et nous pouvons le faire glisser , puis cliquer pour ajouter un autre point, puis le faire glisser vers le bas Et maintenant, vous pouvez voir que la forme du cylindre a en fait changé pour suivre la courbe. Et ajoutons, nous ajoutons une deuxième section, et nous allons en fait la déplacer un peu pour que la coque soit un peu plus Woop, c'est trop Ensuite, nous allons cliquer sur cette petite poignée où ce sont des courbes de Bézier, je crois que vous les appelez. Et, euh, nous ajustons un peu cela, et maintenant nous avons une vraie forme de balle pour notre coque, et elle est orientée dans la mauvaise direction, donc nous devons l'affronter dans la bonne direction. Nous voulons donc faire pivoter le maillage de trois D de 180 degrés le long de l'axe y. Et maintenant, il est orienté dans la bonne direction. Bien. D'accord, la coque va avoir besoin de deux choses Il va falloir une forme de collision. Nous en avons donc déjà un dans notre histoire. Cliquons dessus. Donnez-lui une forme de collision. La collision aura la forme d' une capsule ou d'un cylindre. Donnons-lui un cylindre parce que nous avons utilisé des cylindres jusqu'à présent, de toute façon. Transformer. Il va falloir faire pivoter ce gars de 90 degrés. Et maintenant, nous allons le redimensionner pour qu'il s'adapte, comme nous l'avons fait pour nos autres objets Et dans ce cas, l' angle à l'avant de la coque n'a pas vraiment d' importance en termes de collision, nous allons donc simplement laisser les choses telles quelles. Enfin, le shell va avoir besoin d'un script. Et nous veillerons à le mettre dans notre dossier de scripts. Et nous allons appeler la classe shell. Maintenant, Shell va devoir faire deux choses. Il devra suivre toutes les collisions qu'il aura subies. Et une fois que nous aurons tiré ce foutu engin, nous voudrons qu'il regarde dans la direction de sa trajectoire de vol. Et c'est en fait très simple. Nous pouvons le faire dès maintenant. Ainsi, dans notre méthode des processus physiques, nous voulons simplement utiliser la fonction look at. La fonction look prend une cible et nécessite également le up. Quel est donc l'objectif ? Eh bien, la cible est l'endroit où la coque se déplace et l'endroit où la coque déplace à un point donné est la position globale de la coque, qui est un vecteur indiquant sa position dans le monde, plus la vitesse linéaire. Et la vitesse linéaire est le vecteur qui indique dans quelle direction la coque se déplace et à quelle vitesse. Donc, si vous additionnez ces deux éléments, vous obtiendrez la direction dans laquelle le vecteur se déplace. Cela exécutera donc chaque image. Et en gros, à chaque image, l'obus va mettre à jour sa position ou sa rotation et, en gros, son orientation angulaire telle sorte qu'il regarde dans la direction dans laquelle il tire. De cette façon, la coque suivra sa trajectoire en arc de cercle au lieu de simplement rebondir partout comme elle le ferait avec lieu de simplement rebondir partout comme elle le un objet physique normal Si vous ne le faisiez pas, en fait, l'obus pointerait dans la direction dans laquelle il est tiré l'obus pointerait dans la direction dans laquelle il est tiré parce que nous sommes sur le point de l'orienter de telle sorte qu'il fasse cela. Mais il ne s'inclinera pas réellement vers le bas en vol. Il va juste, en quelque sorte, voler directement puis atterrir. Et c'est un peu ennuyeux. n'est pas ce que nous voulons. Et nous devrons également suivre les collisions. Nous le faisons donc en connectant ce qu'on appelle un signal. Maintenant, un signal est un message que n'importe quel objet Gado peut envoyer et que tout autre objet GA Do peut se connecter à ce signal et l'écouter Et lorsque le signal est émis, tout ce qui écoute le signal appellera une méthode que vous allez spécifier. Donc, dans ce cas, nous voulons la forme de collision. Non, nous ne voulons pas vraiment la forme de la collision. Nous voulons la carapace. J' ai besoin de faire deux ou trois choses. La première chose à faire est d'indiquer à la coque qu'elle va surveiller les collisions. Pour ce faire, nous élargissons le groupe de solveurs et en cliquant sur le moniteur de contacts activé, puis nous devons indiquer maximum de contacts doit être supérieur à zéro maximum de contacts est un paramètre qui indique combien de collisions cet objet va-t-il vérifier avant qu'il ne s'en soucie plus ? Et nous voulons qu'il en ait au moins un. Vous pouvez augmenter cette valeur si vous le souhaitez, mais votre obus ne touchera qu'une seule cible puis explosera, donc cela n'aura aucune importance dans ce cas précis Ensuite, une fois que tout est configuré, nous pouvons cliquer sur le shell, puis nous pouvons passer de l'inspecteur au nœud. Et le nœud va vous montrer tous les signaux que ce nœud en particulier est capable d'émettre. Et comme il s'agit d'un corps rigide en trois D dont la forme de collision est correctement configurée, la coque va émettre ces signaux, et celui qui nous intéresse est le corps saisi. Ainsi, chaque fois qu'un autre corps physique entre en collision avec ce corps rigide, il déclenchera cette méthode si nous le connectons. Nous allons donc descendre ici jusqu'au bouton de connexion. Il va nous dire qu'il va nous demander sur quel objet nous voulons placer la fonction et comment nous voulons que la fonction soit appelée. Et ces deux valeurs par défaut sont correctes , nous allons donc simplement appuyer sur Connecter Et maintenant, chaque fois que l'obus touche un autre objet qu' il est capable de toucher, cette méthode sera appelée. Et nous allons compléter cette méthode dans un petit moment. Mais nous devons également nous assurer que nos couches de collision sont définies pour le shell, et que celui-ci ne fera partie d' aucune des couches que nous avons déjà définies, car il ne s'agit un joueur, ni d'un ennemi, ni d'un obstacle. Nous pouvons donc les décocher toutes afin qu' elles ne soient considérées comme faisant partie d'aucune couche Parce que l'obus va être tiré à la fois par les joueurs et par les ennemis. Nous voulons donc qu'il puisse entrer en collision avec le joueur, et que ce soit le même obus pour tous. Nous voulons donc qu'il puisse entrer en collision avec le joueur. Nous voulons qu'il soit capable d'entrer en collision avec des obstacles, et nous voulons qu'il puisse entrer en collision avec des ennemis Et s'il y a une chose que j'ai oublié de faire, c'est d'avoir oublié de provoquer une collision dans l'arène. La carapace va donc tomber par terre si nous ne le faisons pas. Retournons ici. Passons à notre instance de maillage trois D, et nous devons changer cela. En fait, ce que nous devons faire, c'est ajouter un corps statique trois D, et nous allons l' appeler ground. Et nous allons y ajouter l'instance de maillage en trois D qui représente le sol, puis nous allons ajouter une forme de collision au sol. Sinon, la carapace tomberait à travers le monde, et ce serait une mauvaise chose. Donc, forme de boîte. Nous , ça va être difficile de les attraper. Ici. Et nous voulons seulement que cette forme entre en collision avec des projectiles Donc collision avec le sol. Donnons-lui sa propre couche. C'est donc la couche de sol, et elle ne fait qu'entrer en collision Eh bien, en fait, il semble que nous allons avoir besoin d'une couche projective, n'est-ce pas ? OK, alors Shell. Très bien, la coque est une coque, et elle entre en collision avec Et nous allons simplement vérifier que notre Mm. OK. Oui, parce que parfois, lorsque vous changez les masques de collision sur différents objets, si vous ne le faites pas correctement, cela peut provoquer toutes sortes de comportements stupides Assurons-nous donc que notre char se déplace toujours bien. Ouais, tout va bien. Bien, revenons à notre script de jeu, et nous allons modifier notre gestionnaire de contrôle ici Et nous voulons vérifier s'il existe un autre objet de jeu, l' exception de l'interface utilisateur, qui est mappée à la fois sur la touche Entrée et sur la barre d'espace Et nous allons utiliser la méthode I action pressée , car elle ne se déclenchera que sur le cadre où la touche a été enfoncée. Si vous maintenez la touche enfoncée, cette action ne continuera pas à se déclencher. Cela garantira qu' un obus sera lancé par touche enfoncée. Donc, si la saisie est une action, il suffit d'appuyer sur le bouton « J' accepte Player Fire Shell ». Et nous n'avons pas encore créé la méthode Fire Shell, alors faisons-le maintenant. Oh. Pour tirer un obus, nous avons besoin d'une référence à l'obus. Donc, de retour dans notre réservoir, nous allons fournir d' autres variables d'exportation. Et créons un groupe d'exportations afin de pouvoir organiser ces choses. Nous avons une tourelle de groupe d'exportation. Il y a donc un bon retour au réservoir. Allons-y. C'est bon. Donc, la première chose dont nous aurons besoin pour pouvoir exporter est ce que nous appelons un préfabriqué. Et il s'agit essentiellement d'un lien vers la scène que nous allons instancier chaque fois que nous tirons un obus, qui est notre scène d'obus Et comme nous n'avons pas à définir le type de cette scène, vous pouvez laisser ce champ vide, mais il est bon de savoir que le type de scène est appelé scène compacte. Alors maintenant, si je le souhaite, je peux simplement faire glisser ma scène de coque ici. Il sera automatiquement chargé et mis en cache dans cette variable lorsque le tank sera instancié dans le cadre du jeu, ce qui est le Alors maintenant, lorsque nous tirons un obus, nous allons créer un nouvel objet de ce type d'obus. Nous avons donc var shell, qui est de type shell sera égal au shell prefab dot Une fois cela fait, nous avons besoin d'une autre chose assez importante, même si nous pouvons l' implémenter un peu plus tard, mais nous allons le faire maintenant. Nous allons définir un signal indiquant que le char tire chaque fois qu'il tire un obus. Et si nous allons le faire, c'est parce que depuis le tank, nous n'avons pas un accès direct au monde car le tank est un enfant du monde. Nous pouvons l'obtenir en appelant le tank la propriété parent, qui est une propriété intégrée d'un nœud en trois D, mais cela repose sur le fait que nous connaissons cette hiérarchie et que nous savons que le joueur serait capable d'obtenir le parent, c' est-à-dire le jeu, et que nous serions ensuite en mesure d'obtenir Ana depuis le jeu. Mais il existe de nombreuses façons de briser cette hiérarchie pendant la production. Ce n'est donc pas vraiment une bonne idée. Nous voulons que les choses soient encapsulées autant que possible, ce qui signifie qu'ils n'ont pas besoin de connaître autre chose qu'eux-mêmes Donc, tout ce que nous faisons, c'est de dire au tank de tirer un signal, et nous allons lui donner une référence à l'obus qui a été tiré. Cela signifie donc qu'après avoir instancié notre shell, nous émettons ce signal, et nous le transmettons au shell que nous venons Et pour le moment, rien ne se passe. Ce signal passe simplement dans l'éther disparaît et existe jusqu'à ce que la profondeur de l'univers atteigne la profondeur de chaleur, ou jusqu'à ce que vous finissiez votre partie, selon la première éventualité. Nous devons donc faire en sorte que le jeu écoute ce signal. Et il y a deux façons de le faire. Nous pouvons le connecter de la même manière que nous l'avons fait pour la forme de collision dans la coque, mais je n'ai toujours pas vraiment décidé si je veux que le char existe toujours ou non. Définissons donc simplement une fonction prête. Désormais, ready est appelé chaque fois qu' un nœud entre dans l'arbre de scène. C'est donc, à toutes fins utiles, la fonction que vous appelez lorsque le nœud est prêt, et vous voulez qu'il fasse tout un tas de choses avant qu'il ne commence réellement à faire des choses Donc, dans ce cas, nous voulons que Shell envoie un signal aux joueurs, et nous voulons le connecter à une méthode que nous allons appeler Shell Fred. Et bien sûr, God O est grognon parce que nous n'avons pas encore défini cette méthode, alors faisons-le plaisir Funk on Shell a été tiré. Maintenant, comme cette méthode est appelée en réponse au signal que nous avons défini, elle nécessite les mêmes paramètres que le signal. Et comme le signal prend un paramètre d'objet de type shell, nous devons également le définir dans le cadre de notre gestionnaire de signal Maintenant, nous avons cette méthode qui sera appelée lorsqu'elle recevra le signal indiquant que le shell a été déclenché. Et il suffit au jeu d' ajouter un shell enfant, car nous voulons que le jeu ajoute le shell à son graphe de scène avec tous les autres objets. Donc, si vous surveillez pendant que vous jouez au jeu, et que nous pouvons le voir dans un instant, cela apparaîtra ici. Alors faisons-le. Laissons jouer notre jeu. Et vous pouvez surveiller ce que fait votre jeu pendant qu'il est en cours d'exécution. Et c'est un peu plus facile à faire lorsque le jeu est en mode fenêtré, c'est pourquoi je ne l'ai pas sorti du mode fenêtré. Donc, si nous retournons dans notre éditeur, que nous accédons au graphe de scène et que nous cliquons sur Remote, il s'agit du graphique de scène réel de votre jeu de course à pied. Local est celui avec lequel vous travaillez dans l'éditeur. La télécommande est celle qui se trouve dans le jeu. Alors maintenant, si je retourne dans ma fenêtre de jeu et que j'appuie sur la barre d'espace, vous pouvez voir que nous avons un shell. Il a été ajouté au monde du jeu. Et maintenant, si je fais marche arrière, nous pouvons vraiment le voir. C'est juste ici. Et c'est parce que nous ne lui avons pas encore donné de forces ou quoi que ce soit de ce genre. Tout cela s'est donc produit et vous ne pouvez pas vraiment le voir sous cet angle de caméra. Tout ce qui s' est passé, c'est qu' tombé et a touché le sol, et maintenant il fait toutes sortes de bêtises parce qu'il entre en collision avec le sol Nous pouvons donc voir cela un peu plus facilement si nous passons à la coque, que nous accédons à Lock et que nous appuyons sur la linéaire Y. Cela signifie que la coque ne montera ni ne descendra, quel que soit le type de physique qui lui a été appliqué Maintenant, si je tire un obus et que je m'éloigne, vous pouvez vraiment voir où il se trouve. Et c'est probablement parce que je ne sais pas vraiment pourquoi, mais nous allons régler ce problème parce que ce n'est pas vraiment ce que nous voulons de toute façon. Revenons donc à Shell, et laissons le linéaire Y verrouillé pour le moment, car nous voulons pouvoir déboguer l'endroit où apparaît notre shell lorsque nous le lançons pour la première fois. OK, une chose que nous devons corriger avant de continuer, c'est que j'ai oublié de fournir le vecteur up pour notre fonction d'examen. Ainsi, chaque fois que vous regardez, et il existe également un tas d' autres fonctions qui nécessitent un vecteur de référence, généralement le vecteur ascendant, il vous suffit de fournir un vecteur trois points vers le haut, qui est un vecteur constant qui indique le haut dans la direction Y. Et Godot l'utilise pour toutes sortes de calculs afin de s'assurer que tout est correctement orienté. OK. Donc, la première chose à faire pour tirer correctement notre obus est de le placer là où il est censé être. Parce qu'à l'heure actuelle, j'ai l' impression que lorsque nous faisons apparaître le shell, il apparaît simplement à 00 dans le monde Nous allons donc changer cela. Et pour changer cela, nous avons besoin d'une référence au point de tir, qui est le marqueur trois D. Donc, var, point de tir d'obus, marqueur trois B. Maintenant, il suffit de le faire glisser ici, et nous avons une référence au point de tir. Nous allons également devoir définir une vitesse initiale pour la coque. Alors faisons-le. Merci, c'est vitesse ou la vélocité que nous allons appliquer à l'obus lorsqu'il se déclenche, et nous pouvons en faire un int. Nous pouvons le rendre égal à 20, puis vous pourrez modifier cette valeur ultérieurement si vous décidez que c'est trop rapide ou trop lent. Et avant de commencer à placer la coque sur le monde, il y a encore une autre chose que nous devons faire. C'est-à-dire que nous devrions fournir ici une valeur appelée Ignorer la couche, qui est un entier. Et pourquoi allons-nous le faire ? Eh bien, comme je l'ai déjà mentionné, chaque obus sera tiré par le joueur ou par des chars ennemis, et nous ne voulons pas que l'obus entre en collision avec sa propre équipe, pour ainsi dire Pour le joueur, cela signifie que nous ne voulons pas qu'un obus tiré par le joueur puisse détecter les collisions avec le joueur, autant plus que nous faisons apparaître l'obus dans le canon du pistolet du joueur Nous allons avoir besoin d'un peu plus de logique pour les ennemis, car si nous désactivons simplement la collision entre un obus ennemi et d'autres ennemis, cela signifie que les ennemis pourront se tirer dessus les uns dans les autres. Donc, lorsque nous en arriverons au point où nous utiliserons l'IA, les chars ne tireront pas lorsqu'ils n'ont pas une ligne de visée claire pour le joueur et que d'autres chars se trouvent à proximité. Il existe d'autres moyens de résoudre ce problème, mais c'est exactement ainsi que nous allons procéder. Cela signifie que nous devons fournir l'indice de couche de collision que nous voulons désactiver chaque fois qu' un obus est tiré, car la même méthode d'obus de feu sera utilisée à la fois par les joueurs et par les chars ennemis. Donc, dans le cas du joueur, ce sera la première couche, car, comme vous vous en souvenez, les valeurs des couches commencent à un, même s'il est indiqué que c'est le bit zéro, ce qui est assez désagréable. Nous avons donc un obus de feu égal à un, puis dans le réservoir, nous allons demander à l'obus de définir la valeur de son masque de collision égale à celle de la couche d'ignorance, et nous allons le définir sur false. Cela signifie que si un joueur tire un obus et que nous en transmettons un en tant que couche ignorée, il ira au shell. Et il va définir la couche de collision ou la collision Est-ce que je l'ai créée ou est-ce que je l'ai masquée ? Masque anti-collision. C'est exact. Je veux m'assurer que c'est le bon. Il va donc passer au masque anticollision. Il va définir la couche 1 égale à false, ce qui signifie qu'il va le désactiver. Cela signifie donc qu'un obus tiré par le joueur n'entrera pas en collision avec le joueur, ce que nous voulons Et nous pouvons ignorer cette erreur car nous n'avions pas enregistré cette fonction avant de la placer ici. C'était donc grognon que les signatures ne correspondaient pas, et maintenant elles sont bonnes Une fois cela fait, nous pouvons réellement commencer à positionner et à orienter la coque Maintenant, nous ne voulons rien changer à la position ou à la rotation des obus avant qu'ils ne soient ajoutés au monde. Sinon, nous allons recevoir un message d'erreur , du type Is inside trees égal à false. Et même si ce n'est pas vraiment grave, nous ne voulons pas que Godot nous fasse des erreurs Donc, la position globale de la coque. Est égal à la position globale des points de feu Shell. Et maintenant, si nous passons à notre jeu, et pour que cela soit un peu plus facile à voir, nous allons faire pivoter notre canon. Et nous tirons, voici notre carapace. Maintenant, bien sûr, il fait face dans la mauvaise direction, il ne bouge pas ou quoi que ce soit d'autre. Et nous sommes sur le point de régler ce problème ensuite. L'orientation de la coque est un peu plus délicate. En fait, il m'a fallu quelques heures pour le comprendre avant le tournage, afin que vous puissiez bénéficier de toutes mes douleurs. Il nous manque donc quelque chose en termes. OK, donc je l'ai appelée charnière à tourelle. Ça devrait être un joint de tourelle, mais peu importe. Boup. Est-ce que c'est mieux ? C'est mieux. OK. Donc, pour faire pivoter l'obus, nous devons tenir compte de la rotation Z des charnières de la tourelle dans le sens X. Z des charnières de la tourelle Cela n'a pas beaucoup de sens. Jetons-y un coup d'œil. Donc, si on retourne au tank, Boop. Eh bien, regardons-le du haut. Le point d'ancrage du canon, que nous avons appelé charnière de tourelle dans le script , se trouve donc ici Et comme le réservoir est orienté vers l'avant, c' est-à-dire dans le sens Z positif, nous faisons pivoter la charnière en X. Mais comme le réservoir est en fait pivoté de 90 degrés dans son espace local, nous le faisons réellement pivoter dans le sens Z. Donc c'est juste embêtant quand tout le monde sort. Donc, la rotation Z, dans ce cas, est la rotation du haut vers le bas parce que lorsque nous avions initialement le réservoir orienté vers la droite , c'est ce qui l'a fait monter ou descendre. Cela inclinera donc la coque dans la bonne direction. Cependant, nous devons incliner la coque ce qu'elle soit orientée vers le haut, ce qui, pour une raison ou ce qui, pour une raison nous oblige à inverser la rotation. Je ne sais pas pourquoi, mais c'est le cas. Ensuite, nous devons prendre en compte la rotation de la tourelle dans le sens Y. Parce que la charnière de la tourelle ne tourne pas réellement dans le sens Y. La tourelle pivote. Et nous y reviendrons. Revenons à trois D. Donc, la charnière, qui se trouve juste ici ne tourne pas lorsque la tourelle Donc, pour que l'obus pointe dans la direction dans laquelle il doit être tiré, nous devons tenir compte de la rotation des tourelles Donc, une fois que nous aurons fait tout cela, la coque sera orientée dans la bonne orientation. Alors allons-y, comme ça, et nous allons tirer. Et ça va me ridiculiser, n'est-ce pas ? D'accord ? Voyons quel est le problème. Eh bien, c'était amusant à débugger. OK, donc pour une raison ou une autre, le projet principal, lequel je l'ai fait fonctionner hier avec exactement les mêmes chiffres, ne fait pas la même chose que cette version du projet avec exactement les mêmes chiffres. Youpi. Donc, la façon dont j'ai pu régler ce problème est de faire deux ou trois choses. abord, nous sommes retournés à la coque et nous nous sommes assurés que l'orientation était faite d'une manière légèrement différente. Vous avez peut-être remarqué qu'au départ, nous avons abord effectué une rotation à partir de l'axe X, et je ne sais pas pourquoi nous l'avons fait. Nous n' aurions pas du tout dû le faire. Mais j'ai réinitialisé la rotation et je l'ai modifiée de telle sorte que dans Y, nous l'avons déplacée, nous l'avons fait pivoter de telle sorte que la coque soit tournée vers l'avant et dans la direction Z, que la coque soit tournée vers l'avant ? Que se passe-t-il si je le remets à zéro ? Étrange. Je suppose donc que l'orientation de base du maillage l'exigeait. Je ne sais pas vraiment pourquoi. J'ai également vérifié que les orientations des chars étaient correctes, et j'ai placé la tourelle sous le corps plutôt que directement sous le char Je ne sais pas exactement pourquoi cela a eu un effet là-dessus. Ça n'aurait vraiment pas dû. Mais oui. Une fois que tout cela a été fait, nous sommes en mesure d'effectuer la rotation selon le facteur d'origine pour le Z, qui était la valeur négative de la rotation des charnières de la tourelle vers le haut et vers le bas, ce qui est Mais pour que la rotation Y fonctionne correctement, nous avons dû ajouter la rotation des tourelles à celle des chars Sinon, il n'aurait été orienté correctement que si le réservoir était orienté droit vers le haut, droit vers l'avant ou vers l'arrière. Alors maintenant, si nous allons comme ça et que nous montons ici, puis que nous appuyons sur la barre d'espace, nous éloignerons le canon pour que vous puissiez le voir. Nous avons maintenant une coque parfaitement orientée. Et si j'oriente le tank, pareil. La morale de l' histoire est donc que parfois il suffit de jouer avec les chiffres pour s' assurer que tout s' aligne correctement, car visuellement parlant, bon nombre de ces orientations fonctionnent alors que mathématiquement, elles ne fonctionnent pas Et c'est mauvais. Donc, la prochaine chose que nous devons faire est de fournir ce que l'on appelle une impulsion. Et en physique, une impulsion est une force ponctuelle appliquée à un corps. Donc, si nous voulions que la coque bouge constamment pour toujours, nous appliquerions une force, mais ce n'est pas le cas. Nous voulons seulement qu'il ait une explosion initiale pour qu' il soit propulsé, puis que la gravité et la vitesse prennent le dessus C'est ce qu'on appelle une impulsion. Une impulsion est donc un vecteur trois. Et dans ce cas, je ne sais pas exactement pourquoi c'est fait de cette façon. On pourrait penser que ce serait dans l'autre sens, mais ce n'est pas le cas, et je m'en fous vraiment. Nous commençons par le vecteur arrière, qui se trouve à l' arrière de la coque, et nous allons le multiplier par notre vitesse initiale Et une fois que nous l'avons fait, nous pouvons appliquer cette impulsion à notre carapace. Malheureusement, ce n'est pas tout, car vecteur retour est un vecteur normalisé, ce qui signifie qu'il ne sera qu' un vecteur dans la direction négative Z. Et il ne sera pas orienté correctement par rapport à l'orientation du réservoir. Bref, pour faire court, il va falloir faire pivoter cette impulsion en fonction de l'orientation du réservoir. Nous pouvons donc le faire ici même. Donc, si nous prenons notre impulsion initiale, qui est un vecteur droit multiplié par la vitesse de nos muscles, examinons cela dans notre carapace, donc le retour direct est d'une unité ici, puis nous la multiplions par la vitesse initiale Donc c'est en fait quelque part là-bas. Mais maintenant, nous devons l' orienter vers la coque. Revenons donc à notre tank. Cela signifie donc que nous devons le faire pivoter et j'espère que ce sera correct, étant donné que je viens de changer toutes les orientations, mais nous devons le faire pivoter le long du bon axe, qui est l'axe X par rappo 17. Environnement : l'éclairage et le soleil: Bon retour. Dans ce chapitre court mais non moins intéressant, nous allons voir comment modifier l'apparence de l' environnement en utilisant l'environnement mondial et les nœuds lumineux directionnels. Comme vous pouvez le voir ici, j'ai supprimé la lumière directionnelle que nous utilisions comme soleil temporaire au cours des deux dernières leçons, et j'ai également changé la couleur de fond pour et j'ai également changé qu'elle ressemble un peu à un coucher de soleil. Maintenant, c'est entièrement en avant-première. Si je devais lancer le jeu, vous verrez que nous avons Nodite et que le ciel est gris et ne ressemble en rien au coucher de soleil que nous avons créé Et c'est parce que ce ne sont que des aperçus, et ils sont contrôlés par ces deux boutons ici Nous avons l'environnement de prévisualisation qui, si nous le désactivons , entraîne le coucher du soleil, qui couvre le sol, l'horizon et le ciel. Et puis nous avons également un aperçu de la lumière du soleil. Donc, si nous l'éteignons, notre lumière du soleil disparaît. Et si on les désactive tous les deux, on ne voit pas grand-chose. Ils vous permettent donc de modifier les paramètres de votre environnement et de les obtenir juste avant de les ajouter à votre monde de jeu, car dans les versions précédentes de Gadot, vous deviez modifier les paramètres manuellement , puis lancer le jeu chaque fois que vous vouliez voir à quel point ils étaient différents, et c'était un jeu d'enfant pour tout le monde . Cliquons sur ces trois points, et nous obtiendrons ces paramètres pour l'environnement de prévisualisation et le soleil de prévisualisation. Et nous pouvons changer tout ce que nous voulons changer ici. Ainsi, pour le soleil, par exemple, nous pouvons changer son angle. Nous pouvons changer son azimut, peu importe ce que cela signifie. Nous pouvons rendre le soleil très chaud si nous voulons nous faire tatouer, par exemple, et modifier la distance entre les ombres Et une fois que nous aurons un soleil qui nous plaît, créons de longues ombres. Une fois que nous aurons un soleil qui nous plaira, je le remettrai à un soleil. Nous pouvons ensuite l'ajouter à la scène en tant que lumière directionnelle. Nous allons maintenant nous intéresser davantage à l' éclairage dans une prochaine leçon, mais la lumière du soleil est simulée par une lumière directionnelle. En voici donc une. Et puis remarquez que depuis que j'ai ajouté une lumière directionnelle à la scène, je ne peux plus jouer avec le soleil dans le volet d'aperçu car comme la scène contient déjà une lumière directionnelle en trois D, cela ne vous permet plus d' utiliser les paramètres de prévisualisation car elle utilise les paramètres de ce qui se trouve déjà dans la scène. Et nous pouvons faire de même pour l'environnement. Comme vous pouvez le voir, je change la couleur du ciel en orange. Je peux le rendre orange encore plus foncé si je le voulais. Ou si nous voulions être sur une planète extraterrestre, nous pouvons la rendre verte. Et il y a une légère limite ici en ce sens que même si vous pouvez bien modifier le sol, vous pouvez modifier la couleur du fond ici. Si vous le vouliez, vous pourriez modifier ce que l'on appelle l'Horizon , cette petite bande lumineuse située au milieu entre le ciel et le sol, mais vous ne pouvez pas le faire via l'aperçu du soleil Décidons donc que ce soleil vert citron est exactement ce que nous sommes , puis nous appuierons sur Ajouter un environnement à la scène, et nous obtiendrons un nœud d' environnement mondial. Maintenant, le nœud World Environment propose un certain nombre d'options, mais l'une d'entre elles est que nous pouvons modifier les paramètres d'environnement avec lesquels nous avons joué ici, et cela se trouve dans la ressource environnementale. Donc, si nous cliquons dessus, nous l'ouvrons, et celui avec lequel nous jouions est le ciel. Donc, si vous ouvrez le ciel puis que vous ouvrez le matériau du ciel, le matériau du ciel est un ciel procédural. Maintenant, nous pouvons également utiliser des skyboxes et d'autres choses, et nous y reviendrons également dans une leçon ultérieure Si nous élargissons le ciel, vous devez approfondir celui-ci. Et puis si vous descendez enfin et ouvrez les paramètres du ciel eux-mêmes, voici les paramètres que nous avons modifiés, et maintenant si nous voulons changer l'horizon, nous pouvons le faire. Maintenant, tu vois, j'ai un horizon plutôt orange là-bas. Et vous pouvez également changer le sol, donc je vais changer le sol, et je vais le rendre rouge. Maintenant, nous avons une planète vraiment extraterrestre avec laquelle nous sommes en train de jouer Et vous pouvez également modifier l'angle du soleil ici si vous en avez besoin. Et cela est très profond. Il existe également un certain nombre d'autres paramètres, similaires à ceux que nous avons examinés précédemment pour l' espace devant l'écran, l'occlusion ambiante, ainsi que le brouillard et le brouillard volumétrique Et elles sont un peu difficiles à corriger. Mais, tu sais, si tu veux te battre dans une tempête de neige, c'est parti Maintenant, cet environnement aura incidence sur l'ensemble du jeu car si vous entrez dans le jeu, puisque cet environnement fait partie de l'arène et que l'arène fait partie du jeu, alors lorsque nous entrerons dans le jeu, nous le verrons, et cela a l'air un peu fou. Mais vous pouvez également contourner cela ou au moins y ajouter un environnement en ajoutant un environnement à votre caméra Et en fait, c'était la seule façon de le faire à Gudo, donc c'est bien que tu n'aies plus à t'occuper de ça. Mais il est toujours disponible. Alors disons, retournons dans notre aréna. Revenons à l'environnement mondial. Et ai-je éteint le brouillard ? Oui, on dirait que j'ai éteint le brouillard. OK. Disons donc que nous voulons que notre monde soit, faute de meilleur terme, normal, mais à un niveau particulier ou grâce à une caméra particulière, nous voulons un environnement de brouillard. Nous pouvons donc ajouter un environnement directement à la caméra, ce qui nous donnera à tous les mêmes paramètres. Alors maintenant, nous pouvons simplement passer dans le brouillard et nous pouvons l'activer. Et maintenant, si je lance le jeu, il devrait combiner les deux, et c'est le cas. En fait, ça a l'air plutôt bien. Tout bien considéré ? Donc, oui, au niveau le plus élémentaire, c'est la façon dont vous modifiez l'environnement et l' éclairage de vos scènes. Et encore une fois, nous examinerons lumières directionnelles et autres dans une prochaine leçon, mais cela vous donnera les bases. Nous vous verrons dans la prochaine leçon où nous recommencerons à coder. 18. Gameplay : ajouter des chars ennemis via des scènes héritées: Bon retour. Dans cette leçon, nous allons voir comment créer scènes héritées afin de pouvoir sous-classer notre char et fournir un nouveau doté de fonctionnalités supplémentaires Jetons donc un coup d' œil à notre tank. C'est un tank plutôt cool, et nous avons des scripts qui font des choses, se déclenchent, qui bougent et toutes ces bonnes choses. Mais pour un char ennemi, nous allons avoir besoin d'informations supplémentaires. Nous voulons que le char ennemi soit d'une couleur différente. Je vais ralentir le rechargement des chars ennemis. De plus, ils devront être contrôlés par une machine d' état basée sur l' IA, que nous allons développer dans la prochaine leçon, je tiens à le dire. Si ce n'est pas le cas, certainement pas moins de deux leçons plus tard. Probablement le suivant. Quoi qu'il en soit, en résumé, nous voulons ajouter un module d' IA supplémentaire à ce tank. Maintenant, nous pouvons simplement copier la scène de char existante , puis y ajouter nos nouvelles informations. Mais comme il s'agit d'un fichier entièrement distinct, si nous apportons des modifications au réservoir d'origine, elles ne se propageront pas au nouveau réservoir, et nous voulons qu'ils le fassent Nous allons donc utiliser ce que l' on appelle une scène héritée. Nous passons donc en scène, au lieu d'une nouvelle scène, nous dirons scène nouvelle et héritée, et il nous sera demandé de quelle scène nous voulons hériter Héritons donc du tank. Maintenant, nous avons une nouvelle scène, et c'est notre tank. Le nom est en blanc, ce qui signifie qu'il est unique. Mais tous ces noms jaunes, ce sont les nœuds originaux du tank, mais ils sont colorés en jaune pour montrer qu' ils sont hérités de l'autre scène. Maintenant, si nous devions changer l'autre scène, les informations de cette scène seraient mises à jour. Donc, par exemple, la première chose à faire est de le sauvegarder et nous l'appellerons tank ennemi. Maintenant, si j'allais au réservoir et que je passais au chronomètre de rechargement, je changeais le temps de pesée à cinq, puis je l'ai enregistré Maintenant, si nous passons au char ennemi, le temps de rechargement est désormais de cinq car il hérite du char d'origine Remettons donc ce chiffre à deux. Cependant, il est possible de modifier ces éléments indépendamment de la classe d'origine ou de la scène d'origine. Donc, si nous revenons au tank ennemi, nous allons le renommer en Enemy Tank Et nous allons l' épeler correctement. Allons-y. De plus, nous pouvons réellement modifier les données contenues dans ces valeurs, et cela remplacera ce qui provient du réservoir d'origine Donc, pour le char d'origine, le temps de rechargement est de deux, mais pour le temps de rechargement de l'ennemi, nous allons le changer à Maintenant, nous appuyons sur Enregistrer, et si nous revenons au char d'origine, le compteur de poids est toujours de deux, mais pour le char ennemi, il est de trois. Et nous allons faire de même, nous allons légèrement changer la couleur, et ce n'est pas le bon onglet. Nous y voilà. Donc, si nous allons voir le corps, nous allons sélectionner celui qui n'est pas le bon. C'est où ? C' est lequel ? Ça y est. Nous allons changer de couleur. Eh bien, nous pouvons changer la couleur du maillage d'origine. Cependant, comme je l'ai déjà mentionné, cela est enregistré d'une scène à l'autre, et c'est un peu compliqué Nous devons donc le rendre unique à cette scène. Et nous n'avons pas vraiment envie de le faire. Examinons donc une nouvelle fonctionnalité, ou du moins une nouveauté dans le sens où nous ne l'avons pas encore examinée, à savoir le remplacement du matériau de surface. Cela signifie que vous pouvez fournir un tout nouveau matériel ici, et il remplacera ce matériel Nous avons maintenant notre blanc par défaut standard, et nous allons passer à l'albito et le remplacer par un gris foncé Et nous allons économiser. Et maintenant, uniquement pour les chars ennemis, ils ont une bande grise sur le corps. Et maintenant, nous serons capables de les différencier. Alors maintenant, si nous entrons dans le jeu, si nous voulons en faire glisser un dans notre scène, ce que nous faisons, nous allons prendre le tank ennemi , nous le traînerons ici, puis nous l' utiliserons pour le déplacer, nous le mettrons ici et nous changerons son orientation. Et maintenant, dans notre scène, nous avons un tank ennemi. Et si nous le regardons, il contient des informations que nous ne pouvons pas voir parce qu'elles ne sont pas exportées. Nous allons donc simplement cliquer dessus pour l' ouvrir. Et nous y voilà. Nous sommes revenus à notre char ennemi, et nous pouvons vérifier que ses informations sont conformes à ce qu'elles devraient être. Rechargez le minuteur Est. Maintenant, si vous souhaitez modifier les informations à partir d'ici, vous pouvez cliquer dessus avec le bouton droit de la souris et sélectionner les enfants modifiables Cela vous permettrait de modifier ces informations ici, et elles seraient enregistrées cette instance particulière du réservoir. Nous pourrions donc changer les couleurs des chars directement à partir de là et les personnaliser, même s'ils font tous partie de la même équipe, pour ainsi dire OK, c'est donc la fin de cette leçon. Rejoignez-moi dans la prochaine leçon, et nous continuerons avec d'autres trucs sympas. 19. Détruire les réservoirs: Bon retour. Dans cette leçon, nous allons apprendre à configurer chars ennemis de manière à ce qu' ils puissent être détruits par le joueur. Et la première chose que nous allons faire est de déplacer le char ennemi afin qu'il soit légèrement plus visible pour le joueur. De cette façon, nous n' aurons pas à rechercher le mec à chaque fois que nous démarrerons le jeu. OK, c'est beaucoup mieux. La première chose à faire est donc de modifier certaines données supplémentaires sur le tank héritées du joueur et dont nous n'avons plus besoin. Donc, si nous agrandissons le réservoir, en fait , non, nous devrions le faire depuis la scène des chars afin que cela affecte tous les chars. Donc, la première chose à faire est d' aller à la caméra, et vous remarquerez que la caméra est réglée sur courant. C'est une mauvaise chose car nous voulons uniquement que la caméra du joueur soit à jour, alors nous la décochons Sinon, nous regarderions le jeu du point de vue du tank ennemi et, vous savez, même si les droits sont égaux pour les tanks et pour tous, nous voulons simplement que le joueur puisse voir ce qu'il fait. De plus, le tank est actuellement réglé sur la même couche de collision que le joueur. Nous devons donc décocher cela, et nous devons le vérifier pour qu' il se trouve dans la couche ennemie Et nous ne le voulons pas. Eh bien, nous voulons qu'il entre en collision avec d'autres ennemis car nous ne voulons pas que les chars se croisent, mais nous voulons aussi qu'ils entrent en collision avec le joueur Et cela devrait nous couvrir. Maintenant, l'autre problème est que le tank hérite actuellement ou qu'il est actuellement défini comme tank dans le script Et comme nous l'avons mentionné dans le chapitre précédent, le tank va avoir des informations supplémentaires qu' il devra gérer dans le script. Nous allons donc passer chez l'inspecteur et nous allons descendre jusqu' bas, là où il est écrit « script ». Et cela montre le script actuellement attaché au char ennemi. Et j'ai été agréablement surpris de découvrir qu'ils l'ont récemment amélioré Donc, si je vais ici et que je sélectionne Extend Script, qui est exactement ce que nous voulons, il générera automatiquement un nouveau script héritant d'un tank appelé Enemy Tank, c'est exactement ce que nous voulons, sauf que nous le voulons dans le dossier des scripts OK, alors maintenant nous créons ceci. Et nous sommes bons. Dans les versions précédentes de Gadot, vous deviez détacher manuellement le script et le rattacher ou au moins créer manuellement le script, puis définir le nom de classe, puis le joindre dans l'inspecteur Et c'est tout simplement plus rationalisé maintenant. Je dois adorer les logiciels open source. Nous allons donc appeler ce nouveau script de tank, si jamais nous pouvons l'épeler correctement, AI Tank. Nous allons également changer quelque chose concernant les chars en général, car à l'heure actuelle, il est possible qu'un obus touche non seulement un char, mais également les obstacles ou le sol de l'arène. Mais la seule chose que nous voulons détruire , c'est un tank. Et il existe différentes manières d' indiquer que seuls les chars peuvent être détruits. Nous allons examiner l'une des solutions les plus simples, savoir les groupes. Donc, si nous revenons à notre script de tank ou si nous revenons à notre objet de tank et que nous passons sous le nœud, nous voyons à la fois des signaux et des groupes. Donc, si nous passons à l'onglet groupes, vous verrez que nous n'avons aucun groupe. Nous allons donc créer un nouveau groupe que nous appellerons slable. Maintenant, il sera automatiquement placé dans les groupes de scènes, ce qui signifie qu'il n'est valable que pour tous les objets cette scène et qu'il n'est pas reconnaissable en dehors de la scène. Ce n'est pas ce que nous voulons. Nous allons donc cliquer dessus avec le bouton droit de la souris, et nous allons le convertir en un groupe mondial. Cela signifie que toutes les scènes du jeu peuvent être ajoutées à ce groupe Maintenant, si nous appuyons sur Enregistrer et que nous nous dirigeons vers notre char ennemi, nous pouvons constater que le char ennemi, agit d' un char dérivé est automatiquement classé dans la catégorie des chars vendables Donc maintenant, sous Shell, notre script shell, à l'origine, nous avons cette méthode saisie sur le corps avec laquelle nous n'avons rien fait depuis quelques chapitres ou quelques leçons maintenant. Donc, la première chose que nous voulons faire est de définir le type de corps entrant, et nous voulons que ce soit un corps physique trois D. Et cela tentera essentiellement de prévoir tout objet transmis par cette tout objet méthode en un corps physique trois D, et cela fonctionnera parce que la seule chose avec laquelle la coque peut entrer en collision est méthode en un corps physique trois D, et cela fonctionnera parce que la seule chose avec laquelle la coque peut entrer en et cela fonctionnera parce que la seule chose avec laquelle la coque un autre corps physique trois D, qui incluent les corps statiques, les corps rigides et les corps des personnages. Donc, nous voulons toujours que la coque disparaisse. Mais maintenant, et en fait, si nous ne l'avons pas fait, c'est en partie pour des raisons de commodité. C'est également en partie parce que les variables dont type est spécifiquement défini sont légèrement plus efficaces pour que Gadot y accède Mais si nous devions créer une instruction if then ici, et que nous devions passer au corps puis appuyer sur un point, eh bien, nous n'aurions pas de saisie semi-automatique car Gadot ne sait pas de quel type de variable il s'agit Donc, si nous le forçons à atteindre un corps physique en trois D, alors maintenant, si nous descendons ici et que nous touchons le point, nous avons maintenant la saisie semi-automatique Et la méthode que nous voulons s'appelle I in group. Et je me demande si tu peux le traîner. Non, tu ne peux pas. Nous allons donc devoir le saisir manuellement. Donc, si le corps dans lequel nous transmettons fait partie du groupe destructible, nous voulons le détruire, et nous pouvons le faire avec la méthode des trois corps Maintenant, si nous lançons notre jeu, nous devrions être capables de faire exploser le char ennemi. Il y a encore du brouillard Boum. Essaie encore. Boum. Non. Boum. Bien, je ne sais pas si je suis en train de toucher le tank ou j'ai une erreur dans mon script Nous y voilà. Coup direct. faudrait peut-être qu'il soit un peu plus facile de toucher le réservoir et d'expérimenter ou de nous inspecter pour enquêter. C'est le mot que je recherche. Nous voudrions peut-être étudier les raisons pour lesquelles cela s'est produit. Mais oui. C'est donc tout pour cette leçon. Et dans la leçon suivante, nous allons donner à nos chars ennemis un peu d'intelligence pour qu'ils puissent tirer sur le joueur et tenter de le riposter, car sinon, le jeu ne serait ni équitable ni amusant, n'est-ce pas ? Très bien, on se voit là-bas. 20. IA : machines d'état: Bon retour. Dans cette leçon, nous allons apprendre comment créer une machine d'État que, dans la prochaine leçon, nous allons attacher à nos chars ennemis telle sorte qu'ils puissent se déplacer, rechercher le joueur, puis lui tirer dessus, et nous aurons alors une partie. Alors, qu'est-ce qu'une machine étatique ? Une machine à états est une classe, un objet ou autre. Dans le cas de Godo, il peut s'agir d'un nœud, et nous allons en faire un nœud Quoi qu'il en soit, une machine étatique surveille essentiellement un État. Et qu'est-ce qu'un État ? Un état, c'est bien, c'est un état d'être, vraiment. Ainsi, par exemple, un char ennemi peut avoir de nombreux états. Il peut s'agir de rechercher un joueur. Cela peut attaquer le joueur. Il est peut-être mort. Fondamentalement, un état est un moyen de décrire ce que le tank est ou devrait faire à un moment donné. Et nous pouvons passer d'un État à l' autre en fonction de divers facteurs. Ainsi, par exemple, si le tank n'a pas vu le joueur, il est peut-être en état de recherche, ce qui signifie qu'il va se déplacer sur la carte. Et puis, une fois qu'il a repéré le joueur, il peut passer en état d' attaque, ce qui signifie qu'il attaquera le joueur, et ainsi de suite. Cependant, nous allons le faire intelligemment. Nous allons créer une machine à états autonome capable de gérer théoriquement n'importe quel état sans avoir à être codée spécifiquement pour le char ennemi Ainsi, si nous voulions ajouter une machine étatique à nos arbres, par exemple, pour les faire pousser ou pour prennent feu ou quoi que ce soit d'autre, nous pourrions le faire très facilement. Donc, la première chose que nous allons faire c'est dans notre dossier de ressources, nous allons créer une nouvelle scène, et cette scène sera un nœud. Et nous allons appeler la scène « state machine ». Et en gros, je ne peux pas l'épeler pour me sauver la vie. Il s'agit essentiellement d'un moyen de contourner la création manuelle d'une scène dans l'arbre des scènes Nous aurions pu facilement le faire ici en passant à une nouvelle scène, mais cela n'a pas vraiment d'importance. Nous allons donc cliquer sur OK. Maintenant, nous avons une machine étatique. Donc, si nous double-cliquons, nous pouvons ouvrir la machine à états, et comme vous pouvez le voir, il s'agit d'un nœud vide auquel rien n' est attaché. Et c'est ennuyeux. Nous allons donc ajouter un script à notre machine d'état, qui s'appellera State Machine. Nous allons nous assurer qu'il se trouve dans le dossier des scripts. Et maintenant, nous allons voir comment, dans la leçon suivante, vous pouvez glisser-déposer cette machine à états sur n'importe quel objet de votre choix. Donc, la première chose que nous allons faire est lui donner son propre nom de classe. Et que doit faire une machine étatique ? Eh bien, la machine à états doit surveiller l'état dans lequel elle se trouve actuellement, puis déterminer quand il est temps de changer d'état. Et heureusement, cela dépend en grande partie de l'État lui-même. Notre machine étatique doit donc simplement suivre l' état dans lequel elle se trouve actuellement. Je viens probablement de le dire, mais je suis en train de vieillir. Pour notre État ? Eh bien, en fait, avant de faire cela, nous devons créer une classe d'état. Passons donc aux scripts. Nous allons ajouter un nouveau dossier spécialement pour notre machine d'état. Nous allons y faire glisser le script State Machine, et heureusement, Gudo est assez intelligent pour reconnaître que nous avons déplacé notre ressource Nous n'avons donc pas à changer chemin de fichier ou quoi que ce soit Rien ne se cassera. C'est glorieux. Nous allons donc créer un nouveau script, et il va hériter Eh bien, il n' héritera de rien Alors devrions-nous vraiment le faire de cette façon ? Oui, pourquoi pas ? Nous pouvons toujours le supprimer. Machine à états, nouveau script. Déclarez puis créez. Maintenant, un état ne sera pas un nœud, et c'est parce que les états n' ont pas besoin de se traiter eux-mêmes indépendamment, ni de figurer dans l'arborescence des scènes. Nous voulons juste une classe de script GD autonome et directe. Nous allons donc l'appeler nom, nom de classe. Huit. Maintenant, nous pourrions en faire un nœud, mais nous n'en aurons qu'un seul en jeu à un moment donné pour une machine à états. Nous pourrions donc tout aussi bien en faire une classe et assigner dans le script, ce que nous sommes sur le point de faire. En gros, chaque nœud que vous ajoutez à l'arborescence de scène entraîne une surcharge de traitement Nous ne voulons donc pas avoir plus de nœuds que ce dont nous avons besoin. Et avant de faire quoi que ce soit d'autre, nous pouvons maintenant revenir en arrière et dire à la machine étatique qu'elle possède un état type. Cette variable d'état est donc l'état dans lequel se trouve la machine à états à un moment donné. Maintenant, comme la machine à états est un nœud, nous pouvons lui attribuer une fonction de processus, ce qui signifie que toutes les 60 secondes environ, soit autant que le jeu est capable de gérer, GIDO va exécuter cette fonction Elle est similaire à la fonction de processus physique que nous avons examinée précédemment, sauf que le système physique est toujours garanti de fonctionner à 60 images par seconde. La fonction du processus ne l'est pas. GIDO essaie de l'exécuter à 60 images par seconde, mais si votre ordinateur ralentit, la fonction de traitement est généralement la première à échouer Nous allons donc le dire au Eh bien, nous allons d'abord vérifier. Donc, en gros, ce que nous voulons faire, c' est savoir si l'État est prêt à changer ? Si c'est le cas, modifiez-le. Si ce n'est pas le cas, traitez-le. Oui, nous allons avoir une erreur ce ne sont que des commentaires. Maintenant, heureusement, tout cela se fait au sein de la classe étatique elle-même. Nous allons donc définir une fonction appelée est prête à changer d'état. Et ça va rendre un Bleion. Et notre classe officielle ne sera qu'une ébauche. Ce sera un cours abstrait. Et GAdo n'impose pas de classes abstraites à moins que vous ne travailliez en C Sharp, ce qui n'est pas le cas pour nous Mais vous n' instancierez jamais la classe state par elle-même Nous allons toujours le remplacer dans les classes pour enfants par le biais programmation orientée objet et de l'héritage Et je vais vous expliquer cela dans un instant. Techniquement, nous l' utilisons depuis le début, mais je vais l'expliquer plus en détail une fois que nous l'aurons fait. Et celui-ci va renvoyer false par défaut. Parce qu'un état complètement vide ne changera jamais d'état. Alors, bien sûr, nous aurons besoin d'une fonction de processus. Et cette fois, je ne mets pas le soulignement devant , car en fait, je ne sais pas pourquoi Godot utilise soulignement pour certaines de ses fonctions internes, mais nous n'allons pas le faire, principalement parce qu'en un coup d'œil, vous pourriez penser qu'il s'agit d'un processus de nœud, mais ce n'est pas le cas Et en fait, une chose dont nous aurons également besoin, c'est de faire passer la machine étatique chacune de ces méthodes. Nous pourrions en fait, une fois l'État créé, simplement fournir une référence à la machine étatique elle-même. En fait, non, nous n'avons pas à passer par la machine étatique. Ce que nous devons transmettre, c'est ce que l' on appelle l'objet surveillable Et ce n'est pas facile à dire. Nous l'appellerons donc simplement monitor monitorable object. Et pour l'objet surveillable, nous n'allons pas vraiment définir de type car il peut littéralement être Le processus ne doit donc pas nécessairement faire quoi que ce soit. Ensuite, nous allons avoir une autre méthode qui sera essentiellement un gestionnaire d'événements, donc un changement d'état Et encore une fois, nous aurons besoin de l'objet surveillable. Un état inchangé sera appelé chaque fois que nous changerons d'état. Parlons donc un peu plus de cet objet de table de surveillance, et je vais éviter de prononcer ce mot autant que possible, car il n'est pas facile à prononcer. Et en fait, tu sais quoi ? Nous pouvons simplement le changer à la place du tube de surveillance, ce qui implique, vous savez, qu'il a quelque chose de spécial à ce sujet. Eh bien, nous l'appellerons surveillé parce que c'est ce que c'est. Et il est également plus facile de dire « objet surveillé ». Voilà. Qu'est-ce qu'un objet surveillé ? La machine d'état va donc surveiller tout ce à quoi elle est attachée. Dans ce cas, ce sera le tank ennemi. Et c'est l'objet que la machine étatique elle-même, et donc les États, surveillent qui détermine si les états vont changer ou non. Ainsi, par exemple, si nous surveillons le char ennemi, nous pouvons vouloir passer de l'état de recherche à l'état d'attaque selon que le char a vu le joueur ou non. Cela signifie donc que la machine à états doit être capable de surveiller un objet. Par défaut, notre machine d'état va surveiller son parent car la machine d'état sera toujours attachée directement à l'objet qu'elle surveille. Nous allons donc créer une variable appelée nœud surveillé, et nous allons créer une fonction, une fonction prête pour notre machine à états. Et au sein de la machine d'état, le nœud surveillé sera immédiatement assigné au parent de la machine d'état. Donc, si nous devions ajouter notre machine étatique au tank ennemi, quel gâchis ou nous le ferons dans la prochaine leçon Si nous l'ajoutions ici, la méthode get parent renverrait le tank, qui est exactement ce que nous voulons. Ensuite, nous allons passer ce nœud surveillé aux fonctions d'état. Alors faisons-le. Maintenant que nous sommes en cours ou que nous pouvons terminer le processus. Si l'état actuel est prêt à changer état en fonction de l'état du nœud surveillé, alors le nouvel état sera égal à, eh bien, nous ne le savons pas encore, n'est-ce pas ? Parce que nous avons bien, en fait, est-ce que c'est l'État qui l'a défini ? Non, nous ne l'avons pas fait. D'accord. Il y a donc une autre méthode que l'état devra définir, appelée Determine Next state. Chaque État va donc savoir vers quels États il peut effectuer la transition. Et nous allons renvoyer une chaîne. Et la chaîne sera le nom du nouvel état vers lequel nous voulons passer. Et quel sera ce format ? Eh bien, nous verrons dans un instant. Donc, un état par défaut ou plutôt un état abstrait que nous n'instancierons jamais renverra la chaîne par défaut, car une partie de la conception de ma machine à renverra la chaîne par défaut, car une partie de la conception de états en général est que je veux qu'elle ait un état par défaut qui sera l'état initial dans lequel se trouve la machine à états lors de son premier démarrage Et nous le définirons sous peu. Mais maintenant que nous avons déterminé le prochain état défini, nous pouvons dire : Eh bien, en fait, nous ne l' avons pas encore. D'accord. Nous y reviendrons donc dans un instant. Passe. Sinon, si l'état n' est pas prêt à changer d'état, processus d'état est basé sur son nœud surveillé. D'accord, alors que faisons-nous ici ? Eh bien, nous allons avoir besoin d' une liste des États pris en charge par la machine étatique, ainsi que de leurs noms. Pour ce faire, nous allons exporter un dictionnaire. Et si vous n'avez jamais utilisé de dictionnaire auparavant, un dictionnaire est une liste d'éléments, et je vais vous montrer comment cela fonctionne dans un instant. En gros, il s'agit d'une liste de paires clé-valeur, et aucune clé n'est attachée à une valeur spécifique. Vous pouvez donc les rechercher. La meilleure façon de décrire est un peu comme un annuaire téléphonique, non ? Je montre mon âge. Les annuaires téléphoniques n'existent probablement plus. Mais supposons que vous ayez un carnet contenant tous les numéros de téléphone en Amérique, et que la clé pourrait être le nom de la personne, puis la valeur serait son numéro de téléphone réel. Donc, si vous connaissiez leur nom, vous pourriez les rechercher par leur nom, et vous récupéreriez le numéro de téléphone. Dans ce cas précis, le dictionnaire sera vide, mais une fois que nous aurons créé une nouvelle machine à états dans le chapitre suivant, nous serons en mesure de la remplir. Mais pour l'instant, ce que nous voulons, c'est remplacer cela par la syntaxe permettant d'accéder à une chaîne ou à une valeur dans le dictionnaire. L'état sera donc égal aux états, et vous accédez à la valeur d' une clé avec la notation entre crochets comme vous le feriez pour un tableau. Les États déterminent en fait, non, ce ne sont pas les États. C'est un État. C'est pourquoi nous optons pour n'importe quelle saisie automatique. Déterminez l'état suivant. Et si je me souviens bien, oui, d'accord, devrions-nous lui donner l'objet surveillé L'objet surveillé sera presque toujours nécessaire. Déterminez les états suivants. Parce que nous voulons pouvoir le faire de manière suffisamment sophistiquée pour que l'état soit déterminé en fonction des différents états de l'objet. Et nous avons une erreur ici, mais maintenant que nous l'avons enregistrée, elle devrait disparaître. Ça ne va pas disparaître. Allons-y. Bien, malheureusement, nous ne pouvons pas l'exécuter pour l'instant, mais il y a encore une chose que nous devons faire avant de passer au chapitre suivant afin que je puisse réellement l'implémenter et vous montrer comment tout cela fonctionne C'est-à-dire que nous devons ajouter un setter à l'état. Tout d'abord, qu'est-ce qu'un setter ? Un setter est une fonction que Gadot appellera, si elle existe pour définir, pour attribuer une valeur à une variable particulière Ainsi, par exemple, si je définis une fonction de réglage ici et qu'elle a toujours la même signature, elle prend toujours la valeur Chaque fois que j'essaie de faire quelque chose comme ça et que je dis l'état est égal à ce que cela va être, Gadot appelle cette fonction et transmet ce que cela va être en tant que valeur Donc, la seule chose que nous voulons toujours faire dans notre setter est d'attribuer la variable à la valeur Mais dans ce cas, nous voulons également appeler le gestionnaire d'État. Nous disons donc maintenant état lors du changement d'état avec un objet surveillé. Donc, chaque fois que nous le faisons, il le fera automatiquement. Maintenant, si nous ne définissions pas le setter ici, nous pourrions facilement le mettre ici Mais comme vous pouvez le voir, nous allons vouloir attribuer l'état par défaut à ready, ce que je pourrais aussi bien faire maintenant, état égal à états par défaut. Et comme je le mets également ici, si je ne le faisais pas dans le setter, je devrais penser à le mettre ici Donc, s'il y a un code standard que vous devez utiliser chaque fois que vous modifiez la valeur d'une variable, les setters sont inestimables, et nous allons beaucoup les utiliser lorsque nous examinerons les interfaces utilisateur, car chaque fois que nous définirons une valeur, nous voudrons envoyer un signal pour informer l'interface utilisateur que la variable a changé setters sont inestimables, et nous allons beaucoup les utiliser lorsque nous examinerons les interfaces utilisateur car chaque fois que nous définirons une valeur, afin que nous pouvons mettre à jour l'affichage. Quoi qu'il en soit, c'est maintenant fait, mais comme nous n' avons aucun État, cela ne nous servira à Je peux donc le gérer et vous montrer comment il fonctionne. Mais nous pouvons maintenant passer à la leçon suivante et mettre en œuvre la machine étatique pour le char ennemi, et je vais y remédier après la hâte. On s'y voit ? 21. Ajouter une machine d'état au char ennemi via ECS S: Bon retour. Nous allons maintenant ajouter notre machine d' état à notre char ennemi et configurer un état par défaut afin que le char puisse traiter son état, même s'il ne fait techniquement rien. Ensuite, une fois que tout ce cadre sera en place, nous pourrons commencer à créer l' intelligence artificielle qui fera fonctionner le tank. Jetons donc un coup d' œil à notre tank. Et la première chose que nous allons faire , c'est simplement traîner notre machine étatique sur notre tank. Boop, et voilà Techniquement, ce que nous faisons ici est une forme du modèle de programmation connu sous le nom de système de composants d'entités. Et Godot en parle en quelque sorte du bout des lèvres dans son architecture générale, en ce sens que le char ennemi est considéré comme une entité et que tout ce qui se trouve en dessous est considéré comme des composants Si vous connaissez Unity, il est plus solidement structuré dans Unity, où vous avez un objet de jeu auquel vous pouvez ajouter divers composants Et la philosophie est que les composants n'ont pas besoin savoir quoi que ce soit à propos de quoi que ce soit. Ils peuvent simplement se débrouiller seuls, et ce sera fini. Et l'entité est en quelque sorte chargée de les laisser faire leur travail et de réagir à ce qu'ils font. Donc, dans ce cas, la machine étatique est une composante de l'entité, qui est le tank ennemi. Hormis le fait qu'elle va lire des informations à partir des données des chars, la machine étatique n'a pas à se soucier de ce que fait le char , même si cela peut changer. Qui sait ? Nous allons le concevoir au fur et à mesure. Mais en résumé, si vous avez des objets attachés à un objet principal et que ces objets sont assez bien siphonnés ou isolés, cloisonnés les uns des autres Vous pouvez considérer qu'il s'agit d'un système de composants d' entités. Ainsi, comme je l'ai dit dans notre dernier chapitre, nous n'avons pas besoin que la machine étatique sache énormément sur tout ce à quoi elle est attachée, car son seul but est de surveiller les États. Créons donc des états à surveiller. Nous allons passer sous State Machine, et nous allons créer un nouveau script, qui héritera de State, et il s' appellera Idle State OK. Ensuite, nous allons double-cliquer dessus pour l'ouvrir. Maintenant, que va faire cet état d'inactivité ? Ça ne va rien faire. Il s'agit purement d'un état fictif afin que je puisse vous montrer comment fonctionne cette architecture Maintenant que la machine à états existe et notre dictionnaire d'états est déjà défini, nous pouvons remplir ce formulaire. Nous allons donc cliquer dessus, et maintenant vous pouvez voir qu'il me demandera une nouvelle clé et une nouvelle valeur. Je vais donc cliquer sur le petit crayon ici, et la clé sera une ficelle. Et comme nous l'avons déjà utilisée, nous devons définir la chaîne par défaut. Maintenant, quelle en sera la valeur ? Eh bien, les dictionnaires de Godot sont géniaux car leurs valeurs peuvent littéralement être Dans ce cas, nous voulons que notre valeur soit le script Idle State que nous venons de créer. Mais avant cela, passons à autre chose. Notre état inactif va avoir besoin de quelque chose. Donc, si vous vous souvenez, nous avons une méthode appelée nhange state. Nous voulons donc que notre état Idle indique qu'il s' agit désormais de l'état actuel. Donc, dans l'état inchangé, nous allons ajouter une instruction d' impression qui indique simplement l'état Idle. Ainsi, lorsque nous passons à l'état, il l'imprime sur la console, et nous savons que l' ensemble du système que nous avons mis en place fonctionne réellement. Notre nouvelle valeur sera donc un nouvel objet. Heureusement pour nous, dans Godot, les scripts, même les scripts qui n'ont pas été instanciés ou transformés en nœuds ou quoi que ce soit d'autre, les scripts eux-mêmes sont considérés comme des objets Plus précisément, si je me souviens bien, elles sont considérées comme des ressources. Ce que nous devons faire ici, c'est malheureusement que la seule option qui s'offre à nous est un nouveau script GD, et nous ne le voulons pas car cela supposerait littéralement un nouveau script vide vide Nous voulons donc faire défiler l' écran jusqu'en bas, et nous voulons passer au chargement. Maintenant, je peux aussi faire un chargement rapide parce que je l'ai déjà fait, mais vous ne l'avez pas fait, nous allons suivre l'ensemble du processus. Il va donc nous demander d'ouvrir un fichier. Maintenant, si nous passons aux scripts, State Machine, nous ne Z rien. Et c'est parce que, curieusement, un fichier de script GD n'est pas un type de fichier reconnu pour ce genre de choses Nous voulons donc descendre en bas et sélectionner tous les fichiers, puis nous pouvons sélectionner notre état inactif. Et la dernière chose à faire est cliquer sur Ajouter une paire clé-valeur. Notre script d'état inactif est maintenant assigné à la chaîne par défaut dans notre liste d'états. Cela signifie que nous devons faire encore une chose dans notre appareil d'État. Dans notre fonction prête, nous devons en fait ajouter le point Nu car comme le script GD est essentiellement une ressource de classe, nous devons en instancier une nouvelle dans notre état car notre objet d'état est un état et non une ressource de non une Donc, si nous faisons cela, maintenant que nous avons une machine d'état sur notre char ennemi, cela signifie que lorsque le char ennemi entre dans l'arborescence des scènes au début du jeu, il appelle sa fonction Ready, puis il va parcourir la liste des nœuds qu'il contient et appeler leur fonction Ready. Et lorsqu'il atteint la machine à états, la machine à états va saisir le parent, qui est, bien sûr, le tank comme nœud surveillé. Ensuite, il va définir l' état égal à l'état que nous avons défini dans notre dictionnaire par défaut. Et dans ce cas, c'est un état inactif, donc nous allons le récupérer, puis nous allons appeler new à ce sujet, et cela nous donnera un nouvel objet d'état. Et en fait, nous n'avons même pas besoin de l' imprimer ici car une fois que cela sera attribué, il appellera change state, ce qui signifie que nous devrions voir le mot idle state dans notre console. Voyons donc si cela fonctionne. Et voilà, Idle State. Bien, maintenant que ce cadre est en place, nous pouvons commencer à créer des états pour le char ennemi afin qu'il puisse réellement faire des choses Nous allons avoir besoin d'ajouter des composants supplémentaires. Ce mot désigne à nouveau notre entité tank, et une fois que nous l'aurons fait, nous pourrons travailler avec elle au sein de l'État. Commençons donc. Avant de le faire, cependant, une note rapide, l'état Idle et les autres états avec lesquels nous allons travailler font un usage intensif de l'héritage du paradigme de programmation orientée objet dont Godot est un grand utilisateur, pour ainsi dire Cela signifie donc que si nous créons une classe de base, ce que nous avons fait ici avec un état, puis que nous créons une classe enfant qui étend cette classe, nous obtenons tout ce qu'elle contient. Donc, si je n'avais pas défini cette fonction, l'état inactif bénéficierait de toutes ces fonctionnalités gratuitement, et c'est toujours le cas. Mais ensuite, si nous redéfinissons notre méthode d'état de changement, ce que nous avons fait, cela remplace ce que l' on appelle. Donc, si nous ne l'avions pas fait et si nous avions simplement utilisé la existante appelée « existing on méthode existante appelée « existing on change state », rien ne serait arrivé. Donc, ce que nous allons faire, c'est créer un ensemble de classes enfants pour remplacer la classe state, puis remplacer la base par la fonctionnalité enfant héritée Et nous pouvons toujours accéder à la fonctionnalité de la super classe ou de la classe parent en utilisant le mot clé super. Ainsi, par exemple, si je voulais appeler la méthode de changement d'état de base, je pourrais simplement dire super lors du changement d'état. Bien entendu, il faudrait que je passe devant l'objet surveillé. se peut donc que nous le fassions dans certains cas, mais ce ne sera probablement pas le cas, mais cette fonctionnalité est à notre disposition. OK, assez de théorie. Mettons-nous au point. Avant de commencer, un petit mot. Vous vous souvenez peut-être que dans la leçon précédente, j'ai corrigé un léger bogue où je devais ajouter le point Nu à la configuration de l'état. J'ai également dû faire de même dans la méthode de traitement lorsque nous avons changé d'état, car à l'origine, cela manquait, et une fois que nous avons changé d' état, cela aurait provoqué le crash. Mais cela n'a pas causé de crash dans notre leçon précédente car nous n'avons jamais réellement changé d'état, mais nous sommes sur le point de le faire. Donc, en fin de compte, notre char aura deux états. Il va soit se déplacer sur la carte et rechercher le joueur, ce que l' on appellera l'état de chasse, soit tirer sur le joueur, ce que l' on appellera l'état de tir. L'une des premières choses que nous devons faire est donc de créer ces États. Nous créons donc un nouveau script, et ils héritent de l'état, et il s' appellera Firing state Et nous allons ouvrir cette ventouse. Ensuite, nous allons faire de même, 40 Hunting State. Maintenant, il y a quelques choses que nous allons devoir faire afin de que nous allons devoir faire afin jeter les bases pour que tout cela fonctionne, et nous allons faire tout cela, puis nous créerons le code pour les États La toute première chose à faire est d' ajouter ces deux États à notre machine étatique. Donc, si nous cliquons avec le bouton gauche de la souris sur la machine à états, vous verrez que nous avions notre état inactif par défaut ici. Nous allons donc maintenant ajouter un nouvel état ou une nouvelle chaîne de paires clé-valeur, et cela s' appellera firing. Et bien sûr, la valeur sera un objet, puis nous y ferons glisser l'état de déclenchement , puis nous cliquerons pour ajouter la nouvelle paire clé-valeur. Ensuite, nous allons faire de même pour notre État de chasse. C'est ce que nous appellerons la chasse. Et nous allons l'ajouter. Et maintenant, notre machine étatique peut reconnaître tous nos États. Donc, pour gérer l'état de chasse, nous allons d' abord passer à l'état de tir , car c'est le plus facile des deux à mettre en œuvre, mais il y a une chose que nous allons devoir créer pour créer l'état de chasse. La recherche de trajectoire est donc un sujet extrêmement complexe, et Godot possède sa propre navigation intégrée , mais nous n'allons pas l'utiliser , car étant donné que nous gérons manuellement la façon dont le char se déplace, cela produira beaucoup plus de code que ce que j'aimerais vous transmettre pour vous apprendre ce qui se passe j'aimerais vous transmettre pour vous apprendre ce qui Je vais donc créer une version plus simple du pathfinding, un peu plus directe. Ensuite, vous pourrez soit examiner les maillages de navigation de Godot à votre rythme, soit simplement faire des recherches sur la recherche de trajectoire Mais je vais vous montrer comment procéder, c' est certainement l'une des normes de l'industrie, même si nous allons en voir une version très, très simplifiée. Donc, la première chose que nous allons faire est de retourner dans notre aréna. Et comme vous pouvez le voir ici, l'arène comporte un tas d'obstacles différents et ainsi de suite. Nous allons donc créer un nouveau type de nœud pour l'arène. Donc, la première chose que nous allons faire est ajouter un nouveau nœud trois D. Et la raison pour laquelle nous allons le faire est que , pour éviter tout encombrement, nous allons vouloir regrouper tous les nœuds que nous sommes sur le point d' ajouter sous ce nœud trois D. Renommons-le donc en nœuds Path Et pourquoi est-ce que je fais ça ? C'est parce que je vais créer un nouveau type de nœud, qui s'appellera NAPoint et nous verrons comment le faire en 2 secondes environ Et ce qui va se passer, c'est que je vais parsemer la carte ces points de navigation et de chars, les chars ennemis suivront ces points de navigation pour se déplacer sur la Et c'est l'une des méthodes standard originales d'utilisation de l'IA dans de nombreux jeux de tir à la première personne et autres jeux similaires C'est beaucoup plus simple que d'essayer d' utiliser un maillage de navigation unique, ce que Godot vous permet également de configurer En gros, il y a beaucoup moins de points à régler. Et nous allons procéder de cette façon parce que cela vous donne une idée de ce qu' impliquerait une solution plus complexe. Cela nous donne également une petite chance de développer nos compétences en mathématiques vectorielles en plein essor plutôt que de tout laisser au Godot Créons donc une nouvelle scène, et nous allons en faire une scène en trois D, et nous allons changer le type de scène en un corps statique trois D. Et nous allons renommer ces trois D en point de navigation Et comme nous l'avons déjà fait, nous allons ajouter une instance de maillage en trois D à cet AVPoint afin de pouvoir le voir Et nous allons en faire un filet à capsules, car pourquoi pas ? Et nous allons modifier le matériau pour que le maillage de navigation soit réellement visible, assez bien visible Nous lui donnerons un albédo jaune. Et nous allons également nous développer. OK, le maillage est bon. Nous allons changer la hauteur à 1 mètre, ce qui en fait une sphère. Intéressant Ensuite, nous réduirons le nombre de sonneries, parce que je veux dire, en fin de compte, nous allons les cacher en quelques minutes. Il n'a donc pas besoin d'être magnifique. Ensuite, nous ajouterons, bien sûr, une forme de collision en trois D, et ce sera une sphère car nous avons créé un objet sphérique de toute façon. Très bien, nous les avons, et nous pouvons les déplacer légèrement vers le haut pour qu'ils ne soient pas immédiatement sur le sol Et nous n'avons pas besoin d' y joindre un script de quelque façon que ce soit. Mais nous allons le sauver. Maintenant, nous allons changer certaines choses que nous n'avions pas réellement modifiées auparavant. La première chose que nous allons faire est, bien sûr, de régler la collision. Nous allons décocher le masque car le NavPoint lui-même n'a pas besoin de vérifier les collisions avec Et nous allons ajouter une nouvelle couche que nous appellerons NAV Points. Et nous allons, bien entendu, remplacer la couche de collision NavPoints par NavPoints Ensuite, nous allons passer à l'instance de maillage en trois D, puis nous allons passer aux couches d'instances visuelles, puis nous allons décocher une et en cocher deux Et nous allons changer le nom des couches pour que la couche deux soit NavPoints Et pourquoi l'ai-je fait ? Eh bien, les couches visuelles sont similaires aux couches de collision en ce sens que vous pouvez regrouper et elles sont également similaires aux groupes dans mesure où vous pouvez regrouper des éléments puis les éliminer. Donc, ce que nous allons faire, c'est passer au réservoir, et nous allons passer à la caméra 3 D. Et maintenant, la caméra 3 D a ce masque complet ici Et en gros, toutes les couches cochées et toutes cochées par défaut seront visualisées par la caméra. Maintenant, nous ne voulons pas que ces problèmes de navigation apparaissent dans le jeu, et la seule caméra que nous allons utiliser est celle du joueur ou, en gros, celle attachée à l'un des chars Nous allons donc simplement accéder à la couche NavPoints et la décocher Et maintenant, nos NavPoints ne seront pas affichés par la caméra du joueur Maintenant que nous avons un NavPoint, ajoutons-en un à notre scène Nous les ajouterons et nous les ferons glisser sur le nœud des nœuds de chemin afin qu'ils y soient attachés en tant que parent. Et assurons-nous que c' est droit de haut en bas. Nous allons faire un petit zoom arrière. Et ce que nous allons faire, c'est essentiellement placer ces points, et je vais simplement les dupliquer avec Control V ou Control D, puis nous les placerons dans différentes nous en placerons suffisamment pour que vous ayez l'idée. Ce que nous allons faire, c'est que notre tank va se déplacer d'un point à l'autre. Il va rechercher tous les points situés dans sa zone de mouvement. Il en choisira un au hasard, puis il tournera jusqu'à ce qu'il fasse face à ce point , puis il se dirigera vers ce point. En gros, tout ce que nous voulons faire ici, c'est simplement créer un tas de points ou créer un tas de points NAB pour donner au tank un endroit où se déplacer Maintenant, bien sûr, si les NavPoints sont configurés de telle sorte qu'il y ait un obstacle entre les deux le long du chemin, le char va entrer en collision avec l' Nous voulons donc les espacer suffisamment pour que le tank puisse les trouver lorsqu'il cherchera de nouveaux points, mais pas de manière à ce qu'il soit possible de réellement y aller. Ainsi, par exemple, si le char devait se rendre d' un point à un autre, nous voulons nous assurer que la ligne qui les sépare n'inclut pas cette roche. Nous allons donc ajuster un peu cela , et c'est ce que nous allons faire. OK. Et c'est suffisant pour cela, c'est suffisant pour l'arène. Donc, comme vous pouvez le voir, vous pouvez réellement voir les NavPoints ici Mais si nous devions commencer le jeu, ce que je vais faire, vérifierons où nous allons revenir au jeu. D'accord ? Le tank du joueur est donc ici. Alors maintenant, si nous devions commencer le jeu, vous verrez qu'aucun des NavPoints n'apparaît dans la fenêtre d'affichage du joueur parce que la caméra les élimine, mais ils sont OK, maintenant que c'est configuré, nous allons modifier notre tank ennemi afin qu'il puisse détecter le joueur et tenter de lui tirer dessus. La première chose que nous devrons faire, évidemment, est d' aller voir le tank ennemi. Mais ce que nous voulons faire maintenant, c'est ajouter ce que l'on appelle un nœud de zone 3 D. Nous allons donc aller voir le tank ennemi. Nous allons ajouter un nœud enfant, et nous allons ajouter une zone trois D. Et une zone trois D nécessite une forme de collision, tout comme notre forme de collision trois D. En fait, il s' agit essentiellement de la même chose. Nous allons donc ajouter un nœud enfant ici, qui est, bien entendu, une forme de collision. Et nous ne nous intéressons qu'à ce qui se trouve dans un rayon XY du réservoir. Nous pouvons donc simplement faire un cylindre. Maintenant, cela pourrait également être fait en vérifiant la distance entre les positions globales des deux réservoirs. Mais c'est moins de code de le faire de cette façon, et cela transmet également le tout au moteur physique, qui est plus efficace. Donc, la forme de collision va, euh bien, tout d'abord, nous allons la réutiliser un peu. Peu importe sa hauteur, mais pour que les choses restent visuellement cohérentes, nous allons la fixer à peu près à la hauteur du réservoir. Ensuite, nous devons modifier son rayon pour qu'il corresponde au rayon dans lequel nous voulons que le tank puisse voir le joueur. Faisons donc sortir ce gars jusqu'à ce qu'il ait environ 15 ans. Maintenant, c'est complètement arbitraire C'est juste un rayon dans lequel j'ai décidé que je voulais le tank puisse détecter le joueur. Vous pourriez facilement atteindre dix ou vingt. Je ne le réduirais pas à une distance inférieure à la distance à laquelle l'obus du tank peut tirer , parce que vous pouvez le fabriquer ou l'agrandir. Il est parfaitement normal que le tank puisse apercevoir le joueur avant que les joueurs ne soient à portée. Mais, vous savez, nous verrons comment cela fonctionne. Donc, pour le moment, nous allons le maintenir à 15, et nous allons changer la zone trois D, et nous l' appellerons zone de ciblage. Et il y a un bogue avec Godot lequel une zone tridimensionnelle ne détecte pas les éléments statiques à moins que les options de surveillance et de surveillance ne soient cochées, ce qui est assez odieux ce qui est assez Parce que normalement, vous voulez simplement vérifier la surveillance pour voir si des objets entrent dans la zone. Nous allons donc décocher la case surveillable pour celui-ci, mais nous allons faire la même chose Et je reviendrai sur cette discussion lorsque nous passerons au mouvement, je suppose Je suis en quelque sorte en train de prendre de l'avance sur moi-même ici. Mais maintenant que nous avons notre zone de ciblage, nous voulons tout d'abord changer la façon dont les chars ennemis ciblent les zones de collision, nous pouvons la désactiver pour une chose, ou nous pouvons désactiver ses couches pour une chose. Il n'est pas nécessaire qu'elle se trouve sur une couche, mais nous voulons simplement qu'elle entre en collision avec la couche du joueur, ce qui non seulement fait rimer, mais cela signifie également que la zone ne s'en souciera que si le joueur s'y déplace Passons maintenant au nœud et à la zone trois D, et bien sûr, nous voulons que le corps entre dans les méthodes et que le corps sorte Nous allons donc les connecter au char ennemi. Et pour une raison quelconque, le bouton de connexion ne veut pas coopérer. Maintenant, juste pour prouver que cela fonctionne réellement, nous allons faire deux choses. Nous allons imprimer le nom du corps lorsqu'il entre dans la zone, puis nous imprimerons le nom du corps lorsqu'il quitte la zone. Et vous vous demandez peut-être, à ce stade, comment puis-je visualiser tout ce qui se passe ? Je veux dire, comment pouvons-nous connaître l' étendue de nos lancers, de nos zones de collision, etc. pendant que nous déboguons notre jeu Je crois que je vous l'ai déjà montré, mais si ce n'est pas le cas, je vous le montrerai à nouveau. Si vous passez au stade du débogage et que nous détectons des formes de collision visibles, nous pouvons voir les formes de collision de tous nos objets Maintenant, si je commence le jeu, vous pouvez voir toutes les formes de collision que nous avons définies. Et voici la portée de ciblage du char ennemi, et voici la forme de collision de l'un des nœuds de navigation. Maintenant, si je conduis mon tank vers l'avant, je me rends dans la zone de ciblage des chars ennemis, donc il est écrit tank joueur, et maintenant si je quitte la zone de ciblage, cela déclenche l'autre méthode et indique également tank joueur. Nous avons donc un léger problème dans la mesure où le corps n' est concerné que par cette méthode et n'est donc valable que dans le cadre de cette méthode. Nous devons être en mesure d'accéder à tout ce que le tank cible en dehors de cette méthode. Donc, bien sûr, cela signifie que nous allons avoir besoin d'une variable, nous appellerons cible, et ce sera un corps de personnage trois D parce que c'est le type de tank de notre joueur. La cible est donc égale au corps. Et lorsque le corps a quitté la zone de ciblage, cible est égale à zéro. Donc, si, en dehors du script du tank, nous avons besoin d'accéder à une référence au joueur alors qu'il se trouve dans la zone de ciblage, nous pouvons utiliser cette variable. Et en fait, nous allons l' utiliser dans notre machine étatique. Passons donc à notre état de tir. La première chose que nous allons faire est de lui donner un nom. Et pendant que j'y pense, faisons de même pour l'état de chasse. Et nous devons retourner à notre machine d'état, et nous devons changer son état par défaut de cet état d' inactivité factice que nous avons créé à l'état de chasse Et une fois que nous y sommes, nous devons définir certaines choses. Donc, si vous vous souvenez, nous avions un tas de méthodes auxiliaires au sein de Donc, la première chose est que nous avons besoin de notre méthode de changement d'état. Donc, dans l'état de chasse, nous voulons sortir de l'état de chasse si le tank a trouvé un adversaire. Donc, ce que nous pouvons faire ici, c'est renvoyer le résultat d'un chèque d'investissement Et c'est la première chose que nous allons faire. Et c'est donc réellement valable. Lorsque vous remplacez une méthode, même si nous n'avons pas défini type de variable pour un paramètre d'entrée, nous pouvons le définir dans une classe enfant Et dans ce cas, nous voulons le faire pour aider notre autocomplétion. Nous allons spécifiquement lancer l' objet surveillé sur un tank IA. Nous allons maintenant renvoyer le résultat si la cible de l'objet surveillé est égale à null. Donc, si la cible de l'objet surveillé n'est pas nulle, cela signifie que nous devons passer de l'état de chasse à l'état de tir car nous avons trouvé une cible. Et inversement, nous voulons faire exactement le contraire dans l'état de tir. Nous devons donc sortir de l'état de tir si la cible est égale à zéro. Et puis, de même, nous devons être en mesure d' indiquer quel est le prochain état pour chacun de nos États. Donc, pour l'état de chasse, il va toujours passer à l'état de tir. Et pour l'état de tir , la transition vers l'état de chasse sera toujours transférée. Et juste pour nous aider dans notre débogage, nous allons utiliser echo car nous allons de toute façon annuler l' état du changement pour les deux Lorsque nous le définirons, nous allons donc faire écho à l'état dans lequel nous nous trouvons. Donc, dans l'état de chasse, nous allons simplement imprimer l'état de chasse. Et puis, en état de tir, oups, nous avons besoin de toute la méthode Dans l'état de tir, nous passons à l'état Echo Firing. Et maintenant, nous pouvons vérifier que les deux fonctionnent si nous revenons à notre jeu. Maintenant, si je manoeuvre vers le tank, nous avons un problème. Quel est notre problème ? D'accord, accès non valide à la propriété Key Firing Doll Doll Do OK. Ne les ai-je pas configurés correctement ? Jetons un coup d'œil. Ah, je n'ai pas utilisé le mot état. Donc, comme vous pouvez le voir, l'erreur ici est que je renvoie le mot, eh bien, celui-ci n'a pas été correctement orthographié au départ, mais il devrait simplement être en train de tirer au lieu d'être en état de tir Alors allons-y comme ça. Ensuite, pour ce qui est de l'état de chasse, nous allons le remplacer par la chasse. Maintenant, cela devrait fonctionner. Donc, comme vous pouvez le constater, puisque nous avons déjà configuré notre machine à états pour passer à l'état par défaut, le fait que nous ayons défini notre état par défaut l'état de chasse signifie qu' une fois qu'il est défini et modifié, Godot répètera le mot de chasse ici pour montrer que nous y sommes par défaut Maintenant, si j'y vais, euh, ça se casse à nouveau. Qu'est-ce que j'ai fait cette fois ? OK, ce n'est pas le problème. Pourquoi ces États de chasse sont-ils déterminés par Hunt Aha Next State. Oh, j'ai changé les mauvaises. Pouah. OK. Déterminez l'état suivant. État de tir. Déterminez l'état suivant. Chasse. D'accord. Encore une fois avec émotion. Allons-y. Donc, depuis que je suis entré dans la zone de ciblage, elle est passée en état de tir. Maintenant, si je pars, je reviens à l'état de chasse, et c'est exactement ce que nous voulons. Bien, maintenant que nous avons notre cible et que nous pouvons passer de l'état de tir à l'état de chasse, que voulons-nous faire ensuite ? Eh bien, comme nous l'avons déjà vu, nous avons une méthode de traitement. Et dans notre machine à états, gros, dans sa méthode de traitement, nous vérifions si nous devons changer d'état, et sinon, nous devons traiter l'état dans lequel nous nous trouvons actuellement. Nous devons donc remplacer la méthode de traitement pour chacun de ces états Et puisque nous travaillons actuellement sur l'état de tir, ce sera le premier que nous ferons. Donc, tout d'abord, veillons à modifier toutes ces signatures de manière à ce qu'elles convertissent spécifiquement l'objet car c'est ce que nous voulons faire. Et, bien sûr, nous devrons éventuellement annuler le processus en matière de chasse Donc, en mode de tir, une fois que nous avons une cible, à savoir le joueur, nous devons faire pivoter la tourelle des chars ennemis vers le joueur, vérifier si elle a une ligne de visée claire, puis tirer sur le joueur Et pour ce faire, nous devons ajouter quelques nœuds supplémentaires à notre tank ennemi. Le premier nœud que nous allons ajouter à notre tank s'appelle un lancer trois D. Un lancer est essentiellement une flèche qui pointe vers une position cible dans le monde indiquée en coordonnées locales, ce qui signifie qu'il utilise le même espace de coordonnées que le tank. Et nous allons surnommer cette ligne de visée. Et nous devons permettre au tank ennemi de modifier et d'y accéder depuis son propre script. Nous allons donc exporter une variable appelée ligne de visée, qui est, bien entendu, une refonte en trois D. Ensuite, nous allons la faire glisser ici Ainsi, un lancer est essentiellement une ligne, va de son point d'origine à la destination que vous lui avez donnée, et il sera en mesure de signaler la première chose qu' il rencontrera le long de cette trajectoire. Donc, pour ce qui est de notre ligne de mire, si nous traçons une ligne entre notre tank ennemi et le tank joueur, et revenons au jeu une seconde. Donc, si nous traçons une ligne, ce sera notre ligne de visée rayonnée. Si nous traçons une ligne entre le tank ennemi et le tank joueur, si rien ne s'y oppose, alors si nous disons « Hé, quel est le tank ennemi ou avec quoi le rayon projeté entre en collision », nous retrouverons notre cible S'il y avait, disons, un arbre sur le chemin, la ligne de visée indiquerait que la première chose qu'il a touchée est l'arbre, ce qui signifie que nous n' avons pas de ligne de visée vers le tank de notre joueur. Donc, en gros, nous voulons comparer la direction vers laquelle pointe le rayon de visée, et si c'est la cible, nous savons que nous avons une ligne de visée claire. Alors, comment s'y prendre ? La première chose que nous faisons est de retourner vers notre char ennemi, nous placer dans la ligne de visée, et nous voulons que nos rayons entrent en collision non seulement avec le joueur, mais aussi avec les obstacles et les chars ennemis, et non avec le sol, avec des obus ou des points de navigation De cette façon, il peut détecter s'il y a un tank ennemi ou un arbre sur le chemin, ou il peut trouver notre joueur lorsque nous le trouvons. Nous allons faire tout cela dans l'état de tir, car l'état de tir va contenir la logique qui déterminera si le char doit ou non tirer sur son adversaire. Et si nous faisons cela ici, c'est parce que si le char perd le joueur de vue, nous voulons passer de l'état de tir à l'état de chasse. Et ces informations sont incorrectes. Revenons au tank ennemi, et nous trouverons la bonne ligne, le bon code. Ah, d'accord. Ce n'est pas ça. C'est ça. OK. Alors, à quoi servent ces deux lignes de code ? Le premier prend notre objet surveillé, qui est, bien sûr, notre char ennemi, qui est l'entité à laquelle notre machine d'État est attachée, et il met à jour sa ligne de visée, qui est la ligne de visée projetée, sa propriété de position cible, qui est cette variable ici, et il la définit la position de la cible que l'objet surveillé est pointe actuellement vers. Comme vous vous en souvenez, il y a quelques minutes, nous avions fixé un objectif égal au tank du joueur s'il entrait dans le jeu Let's go back here. Il définit la valeur cible égale à celle du tank du joueur s'il entre dans la zone de ciblage. Et nous n'avons pas à nous soucier de vérifier les valeurs nulles ou quoi que ce soit d'autre, car le char ne sera pas en état de tir s'il n'a pas de cible. Et nous avons besoin de cette méthode en local car la position cible de l'objet surveillé est locale par rapport à son propre espace. Nous devons donc le convertir dans l'espace de coordonnées de l'objet surveillé. Sinon, ce serait dans l'espace global et les valeurs seraient erronées. Ensuite, nous appelons la méthode de mise à jour forcée sur la ligne de visée pour indiquer à Godot mettre immédiatement à jour le casting, car si ce n'était pas le cas, Godot mettrait à jour le cast à l'image suivante, sorte que nous serions dépassés par Nous voulons que cela se produise immédiatement afin vérifier la bonne chose. Maintenant, si je lance le jeu, puisque nous avons toujours nos variables de collision ou que nous avons toujours nos formes de collision définies, nous n' obtenons rien ici. Il existe un moyen d' activer ces éléments. Je vais voir si je peux le régler. OK, j'ai découvert ce qui n'allait pas. l'origine, la ligne de visée était située à la base du char, car c'est là qu'elle tombe à zéro. Au départ, j'ai commencé à moins un Y, est-à-dire ici. Nous avons donc c' est-à-dire ici. Nous avons donc dû le déplacer vers le haut de telle que vous puissiez le voir lorsqu'il pointait vers la cible adverse. Maintenant, on appelle Nat et on lance notre jeu. Vous pouvez maintenant voir le casting du char ennemi directement vers notre char. Et ce que nous devons faire ensuite, c'est vérifier si ou non la cible avec laquelle le cast est ou non la cible avec laquelle le cast entre en collision Nous le faisons donc en disant : «  J'ai surveillé l'objet, la ligne de visée », et la méthode s'appelle Get collider Donc, si nous appelons Get Collider sur la ligne de visée, nous devons voir si elle est égale à la cible de l'objet surveillé, qui est, bien sûr, le tank de notre joueur Et en fait, avant même de le faire, ce que nous pouvons faire, c'est de procéder comme ça et ensuite nous commenterons cela. Nous allons simplement imprimer ce avec quoi il entre en collision. Et nous ne le ferons pas de cette façon. Nous le ferons sous surveillance. Nous allons l'épeler correctement objet. Siteline point Get Collider. Nom du point. Maintenant que nous conduisons jusqu'ici, vous pouvez voir qu'il entre en collision avec le tank du joueur Mais si je vais ici derrière cette colline, le faisceau de rayons entre maintenant en collision avec la colline Parce que le faisceau passe par la zone de délimitation de la Colline avant de nous atteindre Cela signifie que le char ennemi n' a pas de ligne de visée directe vers le joueur. Alors débarrassons-nous de ça, alors nous reviendrons ici. Donc, si le char ennemi a une ligne de visée directe vers le joueur, nous voulons faire pivoter la tourelle jusqu'à ce qu'elle soit face au joueur Et pour ce faire, nous avons en fait besoin d'un second faisceau. Allons-y, commentons-le. Maintenant, où allons-nous placer ce jet de rayons ? Ce rayon sera en fait projeté sur la tourelle, et il sera orienté dans la même direction que le canon, car nous voulons être en mesure de voir ce que pointe la tourelle Ajoutez donc un autre nœud enfant ici, et ce sera à nouveau un raycast, hmm Et celle-ci sera la ligne de ciblage, elle ne fera qu'entrer en collision avec le joueur, et elle sera aussi longue que notre zone de visée ou notre zone de ciblage Quelle était donc la taille de notre zone de ciblage ? Notre zone de ciblage est un rayon de 15 mètres. Cela signifie donc que la ligne de ciblage doit être 15. Mais comme le char lui-même est pivoté, cela signifie que nous devons également faire pivoter la ligne de ciblage Maintenant, comme vous pouvez le voir, nous avons une ligne qui part de notre tourelle jusqu' au rayon de ciblage Et nous allons légèrement changer cela parce que nous ne voulons pas que ce soit comme ça ici. OK. Maintenant, si nous revenons à notre script et que nous pouvons le décommenter à nouveau, nous aurons évidemment besoin d' une référence à notre refonte du ciblage Char ennemi, ligne cible, ligne cible. Et faisons simplement un petit contrôle de bon sens pour nous assurer que si nous faisons pivoter la tourelle, nous serons en mesure de faire pivoter le plâtre correctement. Oui, ça y est. Parfait Permettez-moi de revenir à notre script. Retournez à l'ennemi. Non, revenons à l'état de tir. Et on vérifie si la ligne cible des objets surveillés entre en collision. S'il n'est pas égal à zéro, nous savons que nous ciblons notre joueur. Mais nous voulons vérifier s'il est égal à zéro, car s'il est égal à zéro, nous voulons faire pivoter la tourelle Et comment faire pivoter notre tourelle ? Eh bien, nous avons déjà une méthode pour cela. Objet surveillé. Je crois que je ne me souviens pas de son nom. Il était dans le réservoir. Allons-y. Et la vitesse de ro 22. Ajouter une machine d'État au char ennemi via ECS Pt. 2: Mmm, la première chose à faire est de forcer quelques variables de mouvement Ainsi, lors du changement d'état de notre état de tir, qui est appelé lorsque nous passons à l'état de tir, nous voulons que le char arrête de bouger, de tourner et de faire quoi que ce soit d'autre. Nous allons donc régler la vitesse de rotation et la vitesse vers l'avant égales à zéro. Cela signifie que dès que le tank repère une cible, il arrête tout et vérifie immédiatement si elle est ciblée. Et nous allons faire de même pour l'État qui chasse. Maintenant, quelle est cette propriété inactive ? Il s'agit d'une variable que nous devons ajouter à notre tank ennemi. Et c'est un booléen. Et cela indique si le char est en train de se déplacer d' un point de navigation à un autre. En gros, si le réservoir est inactif, nous voulons qu'il trouve un autre point de navigation et qu'il se dirige vers celui-ci, car nous ne voulons jamais que les réservoirs restent complètement inactifs. Mais je veux dire, peut-être que tu le sais. En fait, si vous avez envie d'aventure une fois cette leçon terminée, vous pourrez peut-être modifier les chars de telle sorte qu'ils s'arrêtent périodiquement et, vous savez, peut-être simplement regarder autour Mais pour le moment, ils vont toujours se déplacer, patrouiller et rechercher le joueur Donc, dans notre état de chasse, nous allons encore une fois, lorsque nous changerons d'état, forcer le réservoir à tourner au ralenti, ce qui signifie que lors de sa première passe de traitement, il trouvera une nouvelle position pour se déplacer vers lui. Et nous allons avoir besoin d'une liste de ces postes, et je suis en train de prendre de l' avance sur moi-même. Revenons donc à la scène des chars elle-même, et nous allons avoir besoin d'une autre zone. Et celui-ci sera notre zone de mouvement. Et c'est celle qui doit être à la fois surveillable et surveillable , car si nous décochons surveillable, ce qui est un mot très difficile à dire, même pour un anglophone, même pour un anglophone cela ne détectera pas nos points de navigation statiques pour une raison ou une autre, ce qui n'a pas beaucoup de sens car surveillable signifie que cette zone est détectable par d' sens car surveillable signifie que cette zone mais nous ne voulons pas qu'il soit détectable par d'autres formes de collision Donc, logiquement, nous le désactiverions. Mais il y a un bogue et Gadot où, si nous le désactivons, il ne détectera pas les objets statiques. Nous allons donc le laisser. Et lors de sa collision, nous voulons désactiver sa couche, et nous voulons qu'elle détecte les points de navigation. Nous allons donc changer cela et y ajouter une forme de collision. Cette forme étant, bien entendu, un cylindre. Et nous allons déplacer le cylindre un peu vers le haut et, bien sûr, changer. Nous n'avons pas besoin d'un joint pour qu'il soit aussi haut, et nous allons changer son rayon à 20. Ally, faisons-en 25. Et c'est un peu arbitraire. En gros, il s'agit du rayon dans lequel les points de navigation seront recherchés, et nous voulons qu'il soit plus large que la plage de ciblage, simplement parce que nous ne voulons pas avoir à remplir la carte de points. Nous voulons pouvoir les placer relativement loin les uns des Mais c'est complètement ajustable. Maintenant, ce dont nous avons besoin, c'est cette zone de mouvement puisse déclencher des fonctions sur le char ennemi. Nous allons donc connecter, encore une fois, le corps entré. Et le corps est sorti des méthodes pour nous connecter à certaines fonctions, et je ne sais pas pourquoi il continue de les déconnecter, mais voilà. Boum. Maintenant, nous pouvons revenir ici et définir un tableau appelé points de navigation à proximité. Et ce sera un tableau de nœuds trois D, même si nous n'avons pas vraiment besoin le déterminer ou de le déclarer avec Nous pouvons simplement dire, et c'est un tableau, ou nous pouvons le supprimer complètement et le faire ressembler à ceci. Mais d'une manière générale, vous souhaitez définir les types de vos variables, si possible. Ainsi, lorsque le char est suffisamment proche d'un point de navigation se trouver à l'intérieur de la zone de mouvement, il déclenche cette fonction. Et lorsque cela se produit, nous voulons ajouter le corps à nos points NAV les plus proches Et lorsqu'il sort de cette fourchette, nous voulons l'effacer. Depuis le point de navigation le plus proche. Cette variable contiendra donc toujours une liste des nœuds corrects. Maintenant, il existe également une méthode appelée get overapping nodes que nous pourrions également utiliser, mais elle est légèrement plus claire à des fins pédagogiques Maintenant que nous l'avons, nous pouvons passer à la chasse. En gros, ce que nous voulons faire c'est que si l' objet surveillé est inactif, nous allons vouloir faire certaines choses, mais avant de le faire, notre char ennemi devra être capable de suivre son point de navigation le plus proche Également connu sous le nom de point de navigation cible, dans les deux cas. Et en fait, les NApoints sont des corps statiques à trois D. Mais encore une fois, il n' est pas nécessaire de préciser la définition Mais ici, celui-ci, vous devriez probablement le faire. D'accord. Permettez-moi de revenir à l'état de chasse. Donc, si l' objet surveillé est inactif, nous voulons lui donner un NavPoint à proximité Son NavPoint le plus proche sera donc égal à l'objet surveillé Obtenez des points de retrait aléatoires. Et nous n'avons pas encore défini cette méthode. Alors faisons-le. Au moins sous forme de talon. Nous allons supprimer toutes ces méthodes, puis nous verrons comment les implémenter réellement Euh, hein. Bien mieux. Bien, revenons à Hunting State. Et une fois que nous avons défini un point de navigation, nous voulons en fait dire qu'il n'est plus inactif Ainsi, idle est désormais égal à false. Et sur l'image suivante, nous allons vérifier si l'objet surveillé ou. A atteint sa destination. Eh bien, nous allons vérifier s'il n'a pas atteint sa destination. Si ce n'est pas le cas, nous allons faire certaines choses, et je les aborderai dans un instant. Mais si c'est le cas, nous voulons remettre en mode inactif afin que je puisse choisir un nouveau point de navigation D'accord, donc s'il n'a pas atteint sa destination, nous voulons voir s'il fait actuellement face à sa destination. Et s'il ne fait pas face à sa destination, nous voulons le faire pivoter jusqu'à ce qu'il le soit finalement. Donc, chaque image sera vérifiée pour voir si elle fait face à sa destination, et sinon, nous avons dit qu'il s'agit d'un objet contrôlé par la vitesse de rotation. Et nous avons le même problème qu' avec la tourelle Nous allons donc simplement régler la vitesse de rotation sur une valeur égale à un afin qu'elle tourne toujours positivement Et s'il fait face à sa destination, nous voulons qu'il se dirige vers sa destination. Donc, objet surveillé Réglez une vitesse de déplacement pour qu'il avance vers sa destination. D'accord. Alors maintenant, une fois que nous aurons implémenté ces méthodes, nous aurons un réservoir en mouvement. Et bien sûr, nous devons également nous assurer que nous désactivons correctement la vitesse de déplacement et la vitesse de rotation. Donc, s'il n'a pas atteint sa destination et qu'il ne fait pas face à sa destination, nous devons régler sa vitesse de rotation, mais s'il fait face à sa destination, nous voulons qu'il arrête de tourner et qu'il règle sa vitesse de déplacement. Et puis, bien sûr, une fois qu'il a atteint sa destination, nous fixons sa vitesse de déplacement à zéro. Oh, maintenant, implémentons ces méthodes. Nous avons donc atteint notre destination. Rich, bien sûr, rend un lingot. Et pour l'instant, il peut renvoyer faux. Ensuite, nous avons Is facing Destination. Et c'était juste ces deux-là ? A atteint sa face, puis obtient un point de navigation aléatoire. Eh bien, nous l'avons déjà fait. Et je suppose que je dois veiller à ce que les conventions de dénomination soient cohérentes. C'est dit, je suis nul à ce sujet. Très bien, alors comment obtenir un point de navigation aléatoire ? Très bien, alors comment obtenir un point de navigation aléatoire Boum. Donc, ce que nous faisons, c'est quoi ça ? Ce n'est probablement pas le bon . Points de navigation à proximité. D'accord. Ah ah. Le nom est légèrement différent. Points de navigation à proximité. Hein ? Qu'est-ce qui me manque ? Allons-y. OK, maintenant tout est aligné avec mes notes. Donc, dans cette méthode, nous déclarons un NavPoint et nous le définissons comme égal à null, et nous vérifions si notre réseau de NavPoints à proximité que nous maintenons ici est supérieur Si c'est le cas, cela signifie que nous avons des NavPoints à proximité. Et il devrait toujours y avoir des NavPoints à proximité. Si ce n'est pas le cas, c'est que nous avons fait quelque chose de mal. Mais c'est juste un test de santé mentale. Nous parcourons donc les points de navigation en boucle, nous faisons une boucle, et en gros, nous vérifions pour voir le point de navigation que nous avons sélectionné est égal au point de navigation le plus proche, ou s'il est nul, cela signifie que nous devons en obtenir un nouveau, parce que ce que nous voulons faire, c'est ne pas essayer de nous rendre au même point de navigation que celui où nous étions juste En gros, il continuera à essayer de sélectionner un nouveau point de navigation au hasard jusqu'à ce qu'il en obtienne pas celui d'où nous venons ou pour la première fois dans la boucle, pour ainsi dire, car lorsque la fonction est appelée pour la première fois, le point de navigation sera égal à zéro. Donc, à tout le moins, celui-ci va se déclencher. Nous définissons donc le point de navigation comme une valeur provenant des NavPoints voisins, qui est, bien entendu, un tableau, et nous utilisons la fonction Randy Range. Randy Range prend donc deux valeurs, la plage inférieure et la plage supérieure, qui sont inclusives Nous devons donc le réduire de moins un. Nous voulons donc commencer à zéro, qui est l' indice le plus bas de notre tableau, et l'indice le plus élevé du tableau est, bien sûr, la taille de la matrice moins un. Euh, donc en gros, nous voulons un nombre aléatoire compris entre zéro et le dernier élément du tableau. Donc, une fois que nous avons attribué un élément de tableau aléatoire à notre NavPoint, nous vérifions, encore une fois, s'il s' agit du NavPoint que nous avons déjà ou s' il existe simplement ? Donc, une fois que nous avons obtenu cette valeur, nous la renvoyons, puis nous aurons un point de navigation aléatoire. Il est très facile de vérifier si nous avons atteint notre point de navigation car il suffit vérifier la position globale du point de navigation vers lequel nous nous dirigeons, si la distance entre la position globale de notre réservoir et la position globale du point de navigation est inférieure à 1,1. Et 1,1 est une valeur arbitraire. Je l'ai calculé en surveillant la position globale du char à chaque image au fur et à mesure de sa mise à jour, et le nombre minimum d' unités que le char déplace à la vitesse que nous avons définie est légèrement supérieur à une. C'est comme 1,08 ou quelque chose comme ça. Donc, 1,1, s'il est inférieur à 1,1, cela couvre cette plage. Vérifiez donc que nous utilisons la méthode de la distance deux, qui est, bien sûr, une méthode définie dans un vecteur, et bien sûr, la position globale d'un nœud est un vecteur. Nous vérifions donc la distance entre notre position globale et le point de navigation cible que nous voulons atteindre. Et si nous en sommes suffisamment proches pour ne pas avoir à bouger une seule image, alors nous avons atteint notre destination. Et enfin, le plus complexe du lot. Il fait face à destination. Donc, ce que nous devons faire ici, c'est trouver le vecteur entre les deux qui représente l'angle nous essayons de faire face. Permettez-moi donc de revenir au jeu, et nous allons régler cela ici. Maintenant, nous devons trouver le vecteur qui représente cette ligne, la ligne qui va du tank au tank ennemi, du tank joueur au tank ennemi. Et le moyen d'obtenir ce vecteur est de soustraire la position du char de celle du char ennemi, et cela nous donnera ce Et nous voulons qu'il pointe d'ici à ici. Donc on soustrait ceci ou on le soustrait de cela. Et c'est Oups. Et c'est ce que nous avons ici. Donc le point NAV le plus proche. D'accord, je dois en fait me corriger légèrement. Ce n'est donc pas le joueur. C'est le point de navigation que nous allons atteindre. Supposons donc que le char ennemi se dirigeait d'un endroit à un autre. Nous devons obtenir le vecteur qui représente ce chemin. Donc, pour y parvenir, il faut soustraire l'origine, qui est, bien sûr, le réservoir, de la destination, qui est le point NAV Donc, les points NAV, la position globale moins la position globale du réservoir, et nous le normalisons. Et le normaliser signifie que nous raccourcissons la longueur du vecteur pour qu'il soit un, ce qui signifie qu'il sera beaucoup plus court car tout ce qui nous intéresse vraiment, c'est l'angle Une fois que nous avons obtenu ce vecteur normalisé, nous calculons l' angle en utilisant la méthode de l'angle deux pour la base des points de transformation Z. Et nous avons déjà examiné la transformation lorsque nous déplaçons notre tank La composante Z de la transformation représente le revêtement du réservoir. Donc, si nous calculons l'angle d'ici à la façon dont le réservoir est orienté, nous obtiendrons l'angle entre ces deux vecteurs. Et au fur et à mesure que nous tournons vers le point de navigation, cette valeur va devenir de plus en plus petite. Et finalement, si l'angle entre les deux vecteurs est inférieur à un degré, peut dire sans risque de se tromper que nous pointons vers la destination. Nous prenons donc l' angle entre les deux, entre la composante Z de notre base et le vecteur opposé, que nous venons d'obtenir. Et pour des raisons pratiques, j'utilise la méthode des degrés en radians, parce que j' aime penser en degrés et je ne sais pas quel est l' équivalent en radians aime penser en degrés et je ne sais pas quel est l' équivalent en radians Nous disons donc des degrés à des radians d'un degré, et cela calculera le nombre approprié de radians, car l'angle deux renvoie Donc, encore une fois, nous vérifions si l'angle entre ces deux éléments est inférieur à un degré et si c'est le cas, alors l'objet fait face à sa destination. Tout cela devrait donc fonctionner parfaitement. Commençons notre jeu. Et nous nous trompons. Donc, Rotate Turret est probablement le mauvais nom de la fonction. Pas de tank ennemi. Oui, c'est une tourelle Rotate Underscore. D'accord. J'espère que c'est le seul que j'ai cassé de cette façon. Allons-y. Maintenant, le réservoir tourne espérons-le, vers l'un des points de navigation, et c'est parti. Et maintenant, bien sûr, oui. Donc, je ne l'ai pas fait. Je n'ai redéfini correctement ces noms de fonctions. Alors, qu'est-ce qu'on a ? Nous avons défini la vitesse vers l'avant et la vitesse de rotation égales à zéro. Donc, oui, c'est une tourelle rotative zéro. Et réglez la vitesse de déplacement. Donc, ce qui s' y passe réellement , c'est parce que, comme vous pouvez le voir, voici la collision, la sphère de collision du point de navigation. Le tank va donc tourner jusqu'à ce qu'il le touche, puis il se dirige droit vers lui. Mais maintenant que je suis assez proche pour que le tank m'ait vu, il va arrêter de bouger, et maintenant il va essayer de tourner, comme nous l'avons vu précédemment, puis me tirer dessus. Voyons si cela fonctionne réellement. Et cela ne fonctionne probablement pas parce que je suis hors de portée. Cela nécessite probablement juste un peu plus d'ajustement des valeurs, cependant Mais oui, donc je vais laisser cette leçon ici parce qu' elle est déjà bien trop longue. Si vous suivez le projet de ce chapitre, il peut être difficile pour vous de tenter de corriger ces bogues. Si vous le pouvez, vous aurez certainement maîtrisé les concepts que je vous enseigne en étant capable de les résoudre Mais il s'agit probablement simplement d' ajuster littéralement les rayons de la zone trois D et des moulages Eh bien, c'était un gros problème. Rejoignez-moi dans la prochaine leçon, et nous continuerons avec d'autres trucs sympas. 23. SFX : Audio 3D: Bon retour. Nous allons examiner l'audio positionnel Mais avant de le faire, nous devons apporter quelques ajustements légers à notre réservoir et à notre machine à états afin que le son fonctionne correctement. La première chose à faire est donc de revenir à notre script tank point gd original, et nous allons ajouter une variable appelée destroyed Et ça va être un livre. Et si vous vous souvenez, lorsque nous détruisons nos chars ennemis ou lorsque nous détruisons ou lorsqu'ils nous détruisent, nous libérons simplement le nœud et supprimons le char d'existence. Et c'est mauvais pour le son car si vous essayez de lancer, par exemple, une explosion pour être détruit, le fait que le nœud soit immédiatement signalé signifie que vous n'entendrez pas cet effet sonore Au lieu de supprimer le tank, nous allons simplement remettre sa valeur détruite à true, puis pour le joueur, nous ignorerons toute autre information. Et pour l'ennemi, nous le mettrons dans un état détruit, que nous créerons avant procéder à toutes les opérations audio positionnelles. Ajoutons donc une fonction tout en bas de la page et nous l'appellerons Hit. Et pour l'instant, le hit ne sera qu'une passe. Et puis, dans le shell, lorsqu'il touche un objet shellable, au lieu de le libérer, nous allons appeler sa fonction hit Et maintenant, dans le hit, nous allons simplement transformer « détruit  » en « vrai ». Et dans notre jeu, nous pouvons monter en haut et dire en gros : « Si le joueur a détruit le retour ». Cela signifie qu'aucune pression sur les touches sera traitée une fois le joueur mort, ce qui n'est vraiment qu'un jeu d' enfant pour tout le monde. Et pour le char ennemi, comme je l'ai dit, nous allons avoir besoin d'un nouvel état car, en gros, lorsque le char est détruit, nous voulons qu'il passe dans un état où il ne pourra plus se transformer. Nous allons donc créer un nouveau script. Il va hériter d'un État, et on l'appellera «   État mort », mais il est techniquement détruit Ouvrez ce type, donnez-lui un nom de classe. Et, bien sûr, nous allons passer à son état de changement, qu'il puisse indiquer quel est son état actuel. Et puis, bien sûr, dans la machine étatique de l'ennemi, nous devons ajouter un nouvel état à la machine. Chaîne détruite. La valeur est, bien sûr, un objet, puis nous faisons glisser notre état mort jusqu'ici. Ajoutez une paire clé-valeur, et maintenant c'est bon. Nous devons maintenant modifier nos états existants pour passer à cet état au cas où le drapeau détruit aurait été renversé Et heureusement, le code est le même pour les deux. Nous passons donc en état de tir, et en cours de processus, non, pas en cours de processus. J'ai déterminé l'état suivant, non, euh, je devrais changer d'état, nous revenons, nous n'avons pas besoin d'un supplément. Nous renvoyons soit la cible de l'objet surveillé égale à null, soit l'objet surveillé détruit. Dans l'un ou l'autre de ces cas, nous voulons changer d'état, et nous devons le faire également dans notre État de chasse. Ensuite, dans l' état suivant déterminé, pour les deux, nous vérifions si l' objet surveillé a été détruit, puis nous passons à détruit. Sinon, on passe au tir, du moins dans le cas de l'état de chasse. Et puis, en état de tir, il sera soit détruit, soit il sera chassé. Et que fait l'État mort ? Eh bien, cela ne fait absolument rien. À ce stade. Eh bien, en fait, cela fait encore une chose. Nous allons arrêter inconditionnellement toute rotation et tout mouvement une fois que l' objet sera dans cet état, cette façon, il aura vraiment cessé de bouger, et il sera mort Très bien, nous avons donc une tourelle rotative, vitesse de déplacement définie et nous avons besoin d'une tourelle rotative Eh bien, j'ai déjà les deux. OK. Rotation Rotation, vitesse de déplacement. Il y en a une de plus. Nous avons besoin de vitesse de rotation. C'est celui-là. D'accord. Une fois que ces trois valeurs ont été mises à zéro, le tank ne bougera plus et il n'y aura aucun moyen de sortir de cet état. Donc, une fois que le char est mort, il est mort, ce qui est pénible pour tout le monde, surtout pour les personnes à bord du char. Bien, maintenant que c'est fait, nous sommes capables d'ajouter nos effets sonores Mais assurons-nous que cela fonctionne avant de faire quoi que ce soit d'autre. Nous allons donc aller ici, nous allons tirer sur le char ennemi, et boum, il a été détruit. Et comme vous pouvez le voir, il tournait, et maintenant il ne tourne plus. Il ne fait plus rien d'autre. Parfait. Bien, ajoutons quelques effets sonores Nous allons donc revenir à notre réservoir d'origine. Eh bien, en fait, non, nous allons commencer à un niveau légèrement supérieur. Eh bien, il existe deux types de sons dans Gadot. Il y a le son positionnel, et il y a ce que l'on pourrait appeler le son ambiant Vous pouvez entendre le son ambiant où que vous soyez dans le jeu, et il est généralement utilisé pour des choses comme la musique de fond. Dans notre cas, nous allons ajouter du son ambiant à notre arène. Nous allons donc ajouter un nœud enfant, et nous allons utiliser le nœud du lecteur de flux audio. Désormais, le lecteur de flux audio sans désignation à deux ou trois D est un simple lecteur audio qui diffusera toujours le son au même volume, où que vous soyez. Nous allons donc le renommer, l' appeler ambient. Et je vous ai déjà fourni trois effets sonores pour ce projet. Donc, si vous téléchargez le projet de la leçon 8, ces sons devraient déjà être importés. Si vous souhaitez les réimporter ou importer vos propres sons, entraînez-vous à les importer dans un GodObject Vous pouvez simplement récupérer vos propres fichiers audio, à condition qu' ils soient au format Wave Og ou MP Three, et simplement les faire glisser dans le dossier de votre projet qu'ils soient importés immédiatement. Nous allons donc accéder au fichier audio Amazon Jungle Night, et nous allons le faire glisser dans le stream. Maintenant, nous sommes prêts à y aller, et nous voulons vérifier le fonctionnement automatique, ce qui signifie qu'il démarrera dès que le nœud entrera dans l'arborescence, qui signifie qu'il démarrera dès que le nœud entrera dans l'arborescence, c' est-à-dire qu'il fonctionnera immédiatement. Maintenant, nous avons un problème, c'est que nous voulons pouvoir modifier les différents niveaux audio des différents types de sons. Ainsi, par exemple, nous ne voulons pas que les bruits de la jungle soient plus forts que ceux nos coups de feu et de nos explosions, Et nous y parvenons grâce au bus audio. Et il existe plusieurs bus audio. Eh bien, je veux dire, nous en avons un pour Master par défaut, ce qui signifie que tous les fichiers audio passent par le bus Master. Par exemple, si nous ajoutons un nouveau bus et que nous l'appelons ambient, nous revenons ensuite à notre lecteur de flux audio ambiant. Nous pouvons changer le bus en mode ambiant. Et maintenant, si nous baissons le volume ici, l'ambiance sera plus faible, même si nous n'avons pas abaissé le son ou le niveau de volume de l'ensemble de notre jeu Nous allons donc ajouter un autre bus audio, et celui-ci sera destiné aux effets sonores. Et celui-ci sera à volume normal. Alors maintenant, si nous chargeons notre jeu, cela ressemble à une jungle brumeuse la nuit avec presque aucun arbre dedans Et désactivons ces formes de collision. Nous n'en avons pas besoin pour le moment. OK, maintenant nous devons faire en sorte le joueur et les chars ennemis soient capables émettre des bruits de tir lorsqu'ils tirent et d'exploser lorsqu'ils explosent Nous allons donc passer à notre scène de chars de base, et nous allons ajouter deux nouveaux nœuds. Nous ajouterons deux fois le nœud 3D du lecteur de flux audio. Et nous allons en renommer un, et nous allons l'appeler Cannon Ensuite, nous allons appeler l'autre explosion. Nous devons également pouvoir y accéder dans le script. Nous allons donc revenir à notre script de tank, et nous allons exporter ces variables. Et je vais créer un nouveau groupe simplement parce que nous voulons que les choses restent organisées. Exportez vers le lecteur de flux audio Cannon SFX trois D. Et il nous en faut un autre pour l'explosion Maintenant, nous revenons à notre réservoir, et nous allons tout simplement, d'abord , élargir la catégorie, puis nous les faisons simplement glisser ici pour y avoir accès. Et maintenant, lorsque nous utilisons la méthode des obus, il ne nous reste plus qu'à jouer aux points de canon. Et quand on meurt, on joue à des points d' explosion. Et comme elles sont en bon état, il faut les trouver. Nous devons d'abord trouver les bons noms. Il s'agit de Cannon SFX et d'Explosion SFX. Et comme il s'agit de nœuds audio en trois D, ils sont positionnels, ce qui signifie qu' ils s' ajustent de la distance par rapport à l'écouteur audio, qui, dans ce cas, est votre caméra par défaut. Oh. D'accord, ça n'a pas marché . Et cela s' explique en partie par le fait que, eh bien, ils empruntent le bus principal, ce que nous ne voulons pas. Nous voulons en fait qu'ils passent par le bus SFX. C'est un peu gros. Faisons-le glisser vers le bas. Touchez. OK, maintenant ça devrait fonctionner. Et ce n'est pas le cas, voyons ce que j'ai cassé. Ah, je vois ce que j'ai cassé. De toute évidence, je n'y ai pas introduit les effets sonores. Vous l'avez probablement remarqué avant moi. Très bien, explosez Cannon. OK. Maintenant que nous avons le son, cela devrait fonctionner. Il est clair que j'ai besoin d'une tasse de café. Nous y voilà. Bien mieux. OK. Et comme vous pouvez entendre le kaboom du tank ennemi. Et maintenant, nous allons également me rapprocher pour que vous puissiez entendre le char ennemi tirer sur moi. Et vous pouvez voir que ce ne sera pas aussi bruyant qu'avant. Et voilà. Nous avons un système audio positionnel, un système audio trois D à Gado Et c'est la fin de cette leçon. Je t'avais dit que ce serait beaucoup plus rapide que l'autre. Alors n'hésitez pas à jouer en ajoutant vos propres sons. Et si vous le souhaitez, utilisez ce que nous avons appris en ajoutant des NavPoints et ajoutez peut-être des entités cartographiques à votre arène qui pourraient émettre des sons et les faire en ajoutant des NavPoints et ajoutez peut-être des entités cartographiques à votre arène qui pourraient tourner en boucle lorsqu'elles s'approchent de vous Sinon, je vous verrai dans la prochaine leçon. 24. Couches d'UI de base: Bon retour. Dans cette leçon, nous allons apprendre les bases de l'interface utilisateur, et il n'y aura aucun codage impliqué. Il s'agit donc d'un peu plus de vacances compte tenu de la quantité de travail que nous avons accompli au cours des deux dernières leçons. Donc, iGado, l'une des choses les plus utiles que vous puissiez faire est de combiner deux actifs D et trois actifs D dans la même scène Et l'un des moyens d'y parvenir est évidemment d' utiliser des nœuds de contrôle, qui vous permettront de superposer une interface utilisateur en deux D au-dessus de votre terrain de jeu Voici donc notre vue en trois D. Et nous avons également un autre onglet ici pour deux D. Maintenant, bien sûr, nous n'avons encore rien fait avec deux D, donc il va être vide. Mais lorsque vous passez à cet onglet, vous verrez que vous avez un espace de coordonnées à deux D dont l'origine se trouve dans le coin supérieur gauche ici. Et ce rectangle violet marquera les limites de votre écran. Et vous pouvez modifier la taille de ce rectangle en accédant aux paramètres du projet. Et puis fenêtre, et elle est spécifiquement mappée à la largeur de la fenêtre d'affichage et à la hauteur de la fenêtre de votre fenêtre de jeu GaDO utilise une échelle de coordonnées par pixel un pour un lorsqu'il crée ses interfaces utilisateur Mais il est également possible de les adapter à votre fenêtre. Mais nous n' allons pas vraiment le faire. Ce que nous allons simplement faire, c'est placer nos actifs directement dans notre interface utilisateur et partir de là. Alors faisons-le. Nous avons notre scène de jeu ici, et bien sûr, nous y avons nos trois atouts D. Nous allons donc maintenant ajouter une interface utilisateur en ajoutant un nœud enfant et en ajoutant un contrôle. Un contrôle est le nœud le plus élémentaire des interfaces utilisateur. Et du simple fait qu'il s'agit d'une commande, elle s'affichera toujours au-dessus des trois D. Donc, ce que nous voulons faire ici, c'est que notre commande soit alignée en bas de l'écran. Nous allons donc cliquer sur ce préréglage d'ancrage et nous allons cliquer sur celui-ci, qui se trouve en bas. Il va donc forcer l'alignement et l'ancrage de forcer l'alignement et l'ancrage cette commande au bas de l'écran et l' étendre sur tout l'écran Nous pourrions saisir ces poignées et les faire glisser vers le haut pour les agrandir ou les réduire. Nous pourrions même le déplacer car un contrôle n'est verrouillé à rien. Un contrôle peut avoir la taille que vous souhaitez et la position que vous souhaitez. C'est juste que dans de nombreux cas, vous souhaitez l'ancrer les coins de l'écran pour diverses raisons, généralement pour que si vous modifiez votre résolution, que ce soit à la volée ou si vous comptez créer différentes versions de votre jeu, vous pourriez avoir des problèmes avec l'interface utilisateur qui ne s' ce soit à la volée ou si vous comptez créer différentes versions de votre jeu, vous pourriez avoir des problèmes avec adapte pas correctement. Donc, par exemple, si je vois ici les points d'ancrage, en fait. Si je les ai changés pour qu'ils soient ainsi, puis que j'ai créé le contrôle comme ça, eh bien, il est ancré à cet endroit précis. Et si nous devions agrandir l'écran, pourrait qu' il ne s'aligne pas correctement. C'est peut-être comme ça parce que tout a changé. Nous allons donc nous orienter. Mais heureusement, nous n' allons pas avoir à nous inquiéter à ce sujet pour le moment. Nous n'allons construire que pour une seule résolution. Nous allons donc le réaligner au bas de l' écran comme ceci, et nous allons ajouter un nœud endommagé par la texture. Et une épave de texture fait exactement ce qui est écrit sur la boîte. Il conserve une texture. Dans ce projet, je vous ai fourni une texture unique et polices tou que nous allons utiliser pour créer notre interface utilisateur très basique. Nous allons donc faire glisser le fichier PNG sur la texture, et le tour est joué. Et maintenant, en raison de l' orientation que nous avons effectuée, elle se trouve en fait en bas de l'écran. Voyons donc si nous ne pouvons pas réaligner ce truc correctement. Non, tu vas être comme ça, n'est-ce pas ? D'accord. Allons-y comme ça. L'un des avantages de l' des interfaces utilisateur dans Gadot, c'est que même s'il est infiniment plus facile à utiliser que plupart des autres moteurs de jeu et qu'il comporte beaucoup moins de bizarreries que vous devez contourner, vous vous retrouvez parfois à vous battre Vous vous dites : « Oh, est-ce que ça marche comme je le pense ? Oui, non, peut-être. Je ne sais pas OK, changeons donc le rectangle de texture en cela, et cela devrait vraiment fonctionner. En fait, ça OK, oui, revenons en arrière. Essayons cela différemment. Nous allons passer par le contrôle, mais nous ne le ferons pas. Nous opterons plutôt pour le plein écran ou la pleine fenêtre. De cette façon, le rectangle de texture, si nous le réglons sur la largeur inférieure, sera désormais correctement redimensionné et devrait être comme nous le souhaitons. Et nous n'avons pas à nous soucier du mode d' extension ou de quoi que ce soit d'autre, mais nous allons changer cela. En fait, non, nous ne l'ignorerons pas. Mais si nous devions modifier la taille de cette texture ou la taille du contrôle, nous pourrions modifier la mise à l'échelle de la texture ici. Nous allons également utiliser un conteneur de marge, qui à long terme est probablement l'un des conteneurs les plus utiles dont vous disposez pour les interfaces utilisateur, aux côtés des conteneurs VBox et HBox Les conteneurs en panneaux sont également incroyables. Et ce que nous allons faire ici, c'est que le conteneur à marge va être complètement détruit Mais comme je considère le conteneur à marge comme un enfant de la texture, quand je dis complètement détruit, pour le conteneur à marge, ce sera l' épave complète de son parent Donc, dans le cas de la commande, quand j'ai dit « complètement détruit », son parent était l'écran, donc c'était la taille réelle de l'écran Mais le conteneur de marge aura la taille réelle de l'épave de texture Et ce que fait un conteneur de marges c' est qu'il nous permet de fournir des marges pour notre interface utilisateur. Et c'est sous la mise en page que le thème remplace les constantes. Allons-y donc 20 pour la gauche, 20 pour la droite, dix pour le haut, dix pour le bas. Encore une fois, il s'agit de valeurs en pixels. Maintenant, bien sûr, nous n' allons rien voir car il n'y a pas d'enfants dans le conteneur à marge. Nous allons donc lui en donner un. Nous allons lui donner le conteneur VBox Comme le montre l'icône, le conteneur VBox prendra tous ses enfants et les disposera de telle sorte qu'ils soient orientés verticalement Donc, si je devais ajouter, disons, un tas d'étiquettes, nous en avons une ici. Mettons un peu de texte. Et puis si je devais le dupliquer plusieurs fois, vous verrez qu' ils s' empilent automatiquement les uns sur les autres, ce qui est incroyablement utile pour la mise en page. Cependant, dans notre conteneur VBox, nous allons utiliser un conteneur HBox. Et le conteneur HBox fait exactement la même chose que le conteneur VBox, mais il le fait dans le sens horizontal également de noter que la plupart des conteneurs redimensionnent tous leurs enfants de manière à ce qu'ils occupent tout l' espace disponible. Comme vous pouvez le constater, le conteneur de marge est aussi grand. Ensuite, lorsque j'y ai placé le conteneur VBox, il s'est automatiquement redimensionné pour occuper autant d'espace que la taille du conteneur de marge moins les Voici donc notre marge de 20 pixels, et je n' aime pas vraiment ces dix pixels. Je pense que je vais le changer dans une seconde. Mais voici notre marge de 20 pixels et voici notre marge de dix pixels. Si nous n'avions pas ces marges, le conteneur VBox aurait la même taille que le conteneur de marge Et nous ne serions pas en mesure de modifier cette taille. Nous ne serions pas en mesure de le réduire parce que c'est ainsi que fonctionnent les conteneurs. Nous allons donc revenir à notre conteneur de marges et augmenter ces marges simplement parce que. Et maintenant, dans le conteneur HBox, nous allons fournir une étiquette Et comme vous pouvez le constater, l'étiquette ne permet pas d'y voir quoi que ce soit, alors nous allons lui donner du texte. Ce que cela va faire, c'est que nous allons créer un indicateur ici, que nous allons connecter au code dans la prochaine leçon, qui indiquera si notre char est prêt à tirer ou non. Nous avons donc un statut, et nous allons changer la couleur de la police et toutes ces autres bonnes choses. Nous voulons donc passer aux remplacements de thèmes, couleurs, et nous voulons changer la couleur de la police pour qu'elle soit noire, et nous allons remplacer la police elle-même par la police au pochoir que je vous ai fournie dans le projet, car elle est jolie et Ensuite, nous passerons aux tailles de police, et nous passerons à 25. Et ce n'est pas une bonne chose. Faisons en sorte que ce soit 45. Bien mieux. Maintenant, c'est justifié en haut à gauche, et nous voulons vraiment le déplacer vers la droite. Il y a donc deux façons de résoudre ce problème. La première est que nous allons dire à notre conteneur HBox de s'aligner jusqu'au bout, et cela résout en grande partie notre problème En fait, oui, cela résout l'essentiel de notre problème car notre étiquette est là où nous en avons besoin. Et maintenant, au lieu d' ajouter une autre étiquette, nous allons ajouter une étiquette en texte enrichi. L'étiquette Rich Text est une version sophistiquée de l'étiquette qui possède de nombreuses fonctionnalités supplémentaires. Vous pouvez les utiliser presque de manière interchangeable. de l'un par rapport à l'autre présente certains avantages utilisation de l'un par rapport à l'autre présente certains avantages. Le principal inconvénient que j'ai trouvé en utilisant l'étiquette de texte enrichi est qu'elle n'est pas toujours dimensionnée verticalement avec précision, en fonction de la hiérarchie de contrôle dans laquelle vous l'utilisez. Mais comme nous allons le voir, il possède de nombreuses autres capacités qui le rendent vraiment cool. Donc, la première chose que nous allons faire est passer à la mise en page et à la transformation. Non, en fait, nous ne le sommes pas. Nous allons passer à la mise en page. Et ici, vous pouvez voir la taille minimale personnalisée. Désormais, dans la plupart des contrôles, valeur par défaut sera 00. Ce que fait Gadot, c'est qu'il va commencer par cette taille minimale. C'est exactement ce que vous pourriez penser. Donc, pour le moment, la taille minimale est de zéro. Ainsi, à la fois dans le sens horizontal et vertical, ce contrôle est traité comme zéro. Cependant, verticalement, il s'étend en fait jusqu'à la hauteur du conteneur parent, bien sûr, le contrôleur HBox Mais verticalement ou horizontalement, il n'y a rien là-dedans. Donc, pour horizontalement dans le sens X, disons que notre minimum est de 200. Vous pouvez donc maintenant voir, au strict minimum, agrandi à 200 pixels. Et nous allons devenir un peu plus sophistiqués. Nous allons passer aux remplacements de thèmes, et nous avons beaucoup plus d'options pour l'étiquette de texte enrichi Et ce que nous voulons, ce sont des styles, normaux. D'accord, nous ne pouvons pas le vérifier car nous n'avons rien là-bas. Mais si nous étendons cela, nous avons la possibilité de créer des boîtes de style. Nous allons donc passer au style box flat, et maintenant vous pouvez voir que l'arrière-plan de l' étiquette est coloré. Mais nous ne voulons pas cette belle couleur. Passons au noir. Et mettons un peu de texte ici. Et, bien sûr, ce texte n'est pas de la bonne police et de la mauvaise taille. Donc, la première chose que nous allons faire, c'est de changer où il se trouve ? Polices de caractères. Nous allons changer la police normale. Et encore une fois, nous ne pouvons pas cliquer dessus car il n'y a pas de police dedans. Nous allons utiliser la police LCD N, qui est vraiment cool. Alors maintenant, vous pouvez voir que nous avons une jolie police qui ressemble à un écran LCD. Nous allons changer la taille, normalement. Oh, je n'utilise pas le bon. Ce n'est pas étonnant. Taille de police normale, 24. Allons-y. C'est un peu trop grand. C'est une bonne chose. Maintenant, nous avons un léger problème ici : la police au pochoir est un peu décalée dans le sens vertical et la police LCD est parfaitement centrée Et nous ne pouvons absolument rien y faire. Nous allons donc devoir en quelque sorte le tolérer. Si nous utilisions simplement mise en page manuelle avec chaque contrôle directement sous le contrôle, nous pourrions parfaitement déplacer le X et le Y, mais dans cette leçon, je veux vous montrer comment les conteneurs interagissent Alors maintenant, nous voulons passer aux couleurs, et je pense que la couleur par défaut, nous voulons qu'elle soit le jaune. Donc c'est beau et ça a l'air d' un ordinateur. Et maintenant, c'est le principal atout de l'étiquette de texte enrichi. Nous avons ce qu'on appelle le code BB. Et si nous vérifions cela, le code BB nous permet d'utiliser du HTML comme le formatage dans notre étiquette. Ainsi, par exemple, même si nous définissons la couleur de notre étiquette sur le jaune, si je mettais une paire de balises de couleur ici, elles utiliseraient des crochets et non des crochets angulaires comme le HTML. Donc, si vous essayez de le faire, cela ne fonctionnera pas. Alors vas-y. Couleur J' ai deux là-bas. La couleur est égale au rouge. Et maintenant, nous avons du texte en rouge. Et le BB Code peut effectuer de nombreux formatages. Malheureusement, je ne pourrai pas entrer dans le détail, mais si vous êtes curieux, vous pouvez simplement utiliser le code BB de Google Gadot Four, et cela vous mènera directement à la documentation de Gado et vous montrera toutes les balises prises en charge Celui que nous allons utiliser va justifier notre texte dans l'étiquette. Nous allons donc simplement dire « c'est vrai ». Et maintenant, le rechargement est là où il doit être. Heureusement, il est un peu coincé sur le bord, alors je vais le compléter avec quelques espaces supplémentaires Et maintenant ça a l'air plutôt bien. De toute évidence, nous pouvons ajouter tout un tas d' autres indicateurs et doodads à notre interface utilisateur Mais c'est suffisant pour nous aider à démarrer. Donc, si nous lançons le jeu maintenant, nous avons une barre d'état. Dans la leçon suivante, je vais vous montrer comment connecter la barre d'état au code et utiliser des signaux pour mettre à jour ses valeurs. On s'y voit ? 25. Événements et signaux de l'interface utilisateur - Marque: Mmm, hum. Mmm, hum. Bon retour. Avant de commencer, nous allons dupliquer le conteneur HBox pour notre indicateur d'état avec Control D. Et la raison pour laquelle nous allons le faire est que nous voulons avoir un deuxième indicateur pour notre nombre de victimes Même si nous n' avons qu'un seul tank sur le plateau pour le moment, nous allons en avoir d'autres. Maintenant que nous avons plusieurs conteneurs HBox ici, nous allons les renommer Vous chargez donc le statut et le nombre de victimes. Il est également judicieux de renommer les libellés de texte enrichi eux-mêmes, car nous allons les utiliser comme références directes Nous devons donc savoir ce qu'ils sont pour pouvoir faire la différence entre les deux. Et la convention de dénomination que j'utilise habituellement dans un tel cas est le nom du contrôle et valeur, car cela le différencie de l'étiquette que nous utilisons pour également désigner l'objet parce que nous avons une étiquette, mais nous avons également une Alors, comment faire la différence entre les deux ? Eh bien, celui-ci est statique et celui-ci a de la valeur. Et puis, bien sûr, nous changeons le rechargement du texte à zéro, et nous devrions également changer l'état de rechargement de l'autre texte sur Prêt car c'est par cela que nous allons commencer Bien qu'il soit peut-être un peu plus intelligent refactoriser par la suite pour qu'il soit réglé sur l'état actuel ou initial du char , nous n' allons pas le faire Nous allons simplement le configurer pour qu'il soit prêt. OK, maintenant que tout est prêt, nous devons ajouter quelques scripts, puis nous pouvons connecter tous nos signaux. Le premier script que nous allons ajouter est donc celui du contrôle lui-même, qui, bien sûr, devrait être renommé maintenant que j'y pense, car il s'agit de notre interface utilisateur. Et nous allons joindre un script, ce qui peut bien sûr être fait d'ici ou d'ici. Et nous n'avons pas vraiment besoin de lui donner son propre nom de classe, mais nous allons le faire quand même. Et dans l'interface utilisateur, nous devrions obtenir des références aux valeurs que nous allons modifier. Il s'agit d'une étiquette en texte enrichi. OK. Et puis, comme d'habitude, nous les traînerons ici. Nous avons besoin de ces étiquettes pour répondre aux signaux provenant de deux endroits différents. La valeur du nombre de victimes doit répondre à un signal provenant de l'un des chars ennemis Tout d'abord, nous n'avons qu'un seul char ennemi ici, mais nous allons restructurer la scène dans avenir proche afin que les chars ennemis se trouvent à des endroits différents. Il ne passera que sous un nœud secondaire pour les ennemis, très probablement, ou peut-être que le générateur brûlera ce pont quand nous y arriverons Le problème, c'est que si nous changeons de hiérarchie, notre char ennemi peut changer , quelle que soit la manière dont nous l'avons obtenu , à moins que nous ne fassions référence aux chars du jeu, nous n'avons pas vraiment envie de le faire. De même, nous devons obtenir l'état du rechargement auprès du joueur, et le joueur dans lequel il se trouve va bien, mais vous savez, malgré Donc, ce que nous allons faire , c'est ajouter ce que l'on appelle un chargement automatique. Nous allons donc aller dans notre dossier Scripts, et nous allons créer un nouveau script, que nous allons appeler Messenger. Et c'est exactement ce que j' appelle tous mes chargements automatiques. Tu peux l'appeler comme tu veux. Donc, le messager est là. Le messager n'a pas besoin d'un nom de classe car nous allons aller dans les paramètres du projet, puis nous allons aller dans Globals, puis cliquer sur l'icône du dossier, scripts Messenger pour l'ajouter, puis nous appuyons sur le bouton publicitaire Maintenant, ce qui s'est passé, c'est que Gadot va charger ce script et instancier en tant qu'enfant de la scène racine du jeu et de la scène que nous avons créée Et le moyen le plus simple d'illustrer cela est d'aller de l' avant et de le faire. Donc, si nous lançons notre jeu, et si nous passons à la télécommande, nous pouvons voir que nous avons la scène principale. Voici notre scène de jeu, et maintenant nous avons également notre messager. Cela signifie que nous pouvons accéder à notre messagerie à partir de n'importe quel script de notre jeu en utilisant uniquement son nom. C'est ce que nous allons faire. Avant de le faire, cependant, nous devons configurer quelques fonctions d'assistance dans notre interface utilisateur Alors, que voulons-nous faire ici ? Ce que nous voulons faire, c'est que l' interface utilisateur réponde à deux signaux différents. Premièrement, lorsque l'état de rechargement du joueur change, et l'autre lorsque le nombre de victimes change Nous allons donc avoir besoin de fournir une paire de fonctions pour ce faire. Et dans le cadre de cette méthode, tout ce que nous voulons faire est de modifier l'état de rechargement sous forme de texte basé sur le texte du statut ou non, en fonction du statut. Le statut est un booléen Donc, si c'est vrai, cela signifie que nous sommes en train de recharger. Si c'est faux, cela signifie que nous ne le sommes pas. Et normalement, nous pourrions simplement dire que je suis ici, mais cela illustre un peu plus ce que nous testons En fait, nous pourrions modifier cela pour l'état de rechargement. Et cela ne ferait que clarifier les choses encore davantage, en fait. Ainsi, si le statut de rechargement est égal à true, la valeur de l'état de rechargement possède une propriété appelée text Et ce que nous voulons définir va devenir un peu compliqué. Alors allons-y, recomposons-le ici pendant une seconde. Nous avons donc plusieurs chaînes dont nous aurons besoin. Commençons donc ici pendant une seconde. Soit il va être rechargé, soit il sera prêt. Cependant, si vous vous souvenez, nous avions du code BB ici. Et nous ne voulons pas avoir à taper ce code BB à chaque fois. Nous pourrions facilement procéder comme ça, mais il va falloir le faire pour les deux cordes, et c'est juste un peu irritant Donc, ce que nous allons faire, c'est définir une constante. Désormais, les constantes sont comme des variables, sauf que vous n'êtes pas autorisé à modifier leur valeur une fois qu'elles ont été définies. Et comme convention de dénomination, j'aime toujours mettre les noms de mes constantes en majuscules. Notre const va donc être rechargé. Format de texte. Et c'est, bien sûr, une chaîne. Et ce que cela va être c' est que ce sera notre code BB. Les deux espaces dont nous avons besoin pour nous assurer que tout est correctement espacé et un pourcentage s. Et c'est un jeton que nous allons utiliser pour le formatage des chaînes, et nous verrons comment cela fonctionne dans un instant Nous avons donc raison et cela. Maintenant, ce que nous voulons faire ici, c'est définir notre texte sur cette chaîne de format de rechargement, puis nous utilisons le signe du pourcentage pour dire que nous allons formater cette chaîne avec la chaîne que nous lui donnons Nous avons donc obtenu le format de texte de rechargement, puis Godot va automatiquement voir ce symbole , puis remplacer le pourcentage s par le mot Cela signifie donc que nous allons obtenir cette chaîne comme résultat, et nous allons faire la même chose ici. Mais, honnêtement, cela pourrait aussi être un peu plus réduit Je veux dire, techniquement, on peut le faire comme ça. Mais maintenant, il ne nous reste plus qu'une seule fois à le faire. Ensuite, nous ferons de même pour notre nombre de victimes. Maintenant, dans ce cas précis, nous n'avons pas besoin de fournir le nouveau nombre de victimes. Nous pourrions facilement le mettre sur le lecteur, puis transmettre la valeur ici dans le cadre du signal. Mais pour simplifier les choses, nous allons le laisser dans le cadre de l'interface utilisateur elle-même. Le nombre de victimes est donc un entier, il est égal à zéro. Ensuite, lorsque le nombre de victimes changera, nous augmenterons simplement notre variable d' une unité, puis nous définirons la valeur du nombre de victimes Égal aux formats de texte de rechargement, et nous remplacerons le nombre de victimes. Et nous allons le faire correctement avec le bon. Nous y voilà. OK, maintenant câblons nos signaux. Le premier signal que nous allons utiliser est le signal de destruction du char ennemi. Nous retournons donc à notre messager et nous allons définir un signal ne nécessite aucun paramètre. Et puis, si nous nous dirigeons vers notre char ennemi, le char ennemi, si vous vous souvenez bien, notre char de base possède une fonction appelée hit, et cette fonction est appelée lorsqu' un char est touché par un obus Il le détruira donc et produira l'effet sonore de l'explosion. Nous voulons que le char ennemi émette également ce signal. C'est donc là que nous utilisons l' héritage, car le char ennemi, qui est un tank de classe AI, étend le tank, ce qui signifie que sa méthode de tank a déjà été définie. Nous n'en avons donc pas besoin si nous ne redéfinissons pas cela et que nous l'appelons simplement, le char ennemi aura cette fonctionnalité Mais si nous le redéfinissons, nous pouvons désormais ajouter nos propres fonctionnalités Ce que nous voulons faire, c'est bénéficier la fonctionnalité des classes de base. Nous utilisons donc le super mot-clé. Nous disons donc super point Hit. Et c'est ce que nous appellerons la méthode Hit des classes de base. Ensuite, nous voulons détruire un messager, un char ennemi. Émettre des points. Désormais, chaque fois qu'un char ennemi est détruit, il demande à la classe Messenger d'émettre ce signal. Maintenant, notre interface utilisateur, avec sa propre méthode prête à l'emploi, peut se connecter à ce signal car, encore une fois, cette classe de messagerie est accessible à importe quelle classe, n'importe où et à tout moment. Nous faisons donc simplement Messenger, un char ennemi détruit, connectons, et nous fournissons la méthode que nous voulons utiliser pour nous connecter. Et maintenant, pour le joueur, nous voulons faire deux choses. Nous pouvons donc le faire. Nous pouvons le faire à deux endroits. Nous voulons que le joueur émette un signal indiquant que son état de rechargement a changé Cependant, le joueur est un tank, pas un tank IA. Donc, si nous devions le mettre dans un tank, il pourrait être disponible pour n'importe quel tank du jeu, ce qui n'est pas grave car nous n'avons qu' à nous connecter à l' émission de ce signal par le joueur. Je ne sais pas pourquoi ma casquette aime s'éteindre toute seule lorsque j'utilise mon trait de soulignement, mais voilà Maintenant, nous voulons nous connecter à ce signal, et nous le ferons dans le jeu car le jeu a accès à tout ce dont nous avons besoin. Nous sommes donc déjà connectés au shell du joueur qui a été lancé ici. Nous allons maintenant nous connecter à o. Je ne sais pas pourquoi cela ne se termine pas automatiquement, mais peu importe. Et quelle est la méthode à laquelle nous voulons le connecter ? Eh bien, nous avons besoin de notre nœud d'interface utilisateur, nous allons donc faire ce que nous avons fait ici pour récupérer le char ennemi. Nous pourrions également fournir une référence à l'interface utilisateur du jeu. Et en fait, nous allons également faire d'autres choses avec l'interface utilisateur. Faisons donc simplement une exportation. Et c'est un contrôle. Oui, nous savons que tu es brisée en ce moment. OK, le joueur va maintenant se connecter aux interfaces utilisateur. En fait, ce n'est pas correct. Cela devrait être UI car nous avons en fait une classe pour UI. C'est bon. Les deux devraient fonctionner, et maintenant nous pouvons utiliser Auto Connect. Maintenant, le statut de rechargement des joueurs a changé. Et voici une chose à laquelle tu dois faire attention. Chaque fois que vous essayez d'utiliser ou que vous laissez Gadot compléter automatiquement nom d'une fonction dans la méthode connect, cela ajoute toujours des parenthèses d'appel à la méthode, et vous ne voulez pas cela car cela casse Et puis si vous essayez de les supprimer, Gadot supprime toutes les parenthèses OK, alors maintenant les deux devraient être connectés. Donc, si nous entrons dans notre jeu, vous pouvez voir que notre statut est prêt. Si je tire, rien ne se passe. D'accord, il va falloir le déboguer. Mais si je tire sur le tank ennemi, je devrais me procurer un kit. Ça y est. Char détruit. Nous devons maintenant tuer Count of One. Ah hein, je vois le problème. Nous n'avons jamais réellement émis le signal. Donc, retourner au tank aurait dû être la première chose que j'ai faite. Ensuite, nous passons à Fire Shell, et la toute dernière chose que nous faisons après le feu d'obus est simplement d'émettre le signal avec la valeur de la variable de rechargement Maintenant, nous devrions avoir raison. Ouaip. En fait, non, non, je me suis trompé. Ce ne serait pas la première fois. Le problème ici est donc que lorsque le délai de rechargement expire, nous devons le modifier, nous devons indiquer à l'interface utilisateur que le statut a de nouveau changé Et c'est embêtant car il faudrait maintenant aller partout dans le jeu modifier cette variable et émettre ce signal. Nous devons donc le faire intelligemment. Et c'est pourquoi encore une fois, nous avons besoin d'une variable setter ou d'une méthode setter. Nous définissons donc un setter pour le rechargeur. Et, bien sûr, le rechargement est égal à la valeur, puis nous émettons un signal, et maintenant ça devrait être génial Parfait. Nous disposons désormais d'une interface utilisateur entièrement fonctionnelle. La prochaine chose que nous allons faire est de voir comment utiliser des astuces intelligentes et des composants d'interface utilisateur pour créer une mini-carte 26. Créer une mini-carte: Bon retour. Dans cette leçon, nous allons ajouter une mini-carte à l'interface utilisateur du jeu, et c'est beaucoup plus simple que vous ne le pensez Nous allons utiliser les nœuds Gado incroyablement utiles appelés sous-fenêtres. Si vous connaissez les versions précédentes de Gado, elles s' appelaient auparavant simplement viewports, mais je suppose que j'ai confondu trop de monde Donc, la première chose que nous allons faire est de revenir à notre vue en deux D afin de voir notre interface utilisateur ici. Et nous voulons ajouter une mini-carte dans le coin supérieur droit de l'écran Pour ce faire, nous avons besoin du contrôle de l'interface utilisateur connu sous le nom de conteneur de sous-fenêtre Comme son nom l'indique, il s' agit d'un conteneur, qui est essentiellement un contrôle qui contiendra une sous-fenêtre Nous allons l' étendre à la taille que nous voulons, puis nous allons justifier correctement avec les bons préréglages d'ancrage Nous allons également nous assurer qu'il est carré, disposer Transform de taille 230 x 190. Cela ne suffira pas. Disons 200 par 200. Bien mieux. Ensuite, nous allons le glisser un peu pour qu' il soit parfaitement justifié. Allons-y. Maintenant, pour utiliser un conteneur de sous-fenêtre, comme vous pouvez le voir ici, nous avons reçu un petit avertissement indiquant qu' il n'en a pas. Modifions-le Nous allons ajouter une sous-fenêtre. Un port de vue secondaire est essentiellement une nouvelle fenêtre sur votre monde de jeu. Il affichera tout ce qui est visible dans ce petit sous-espace. Et dans notre cas, ce que nous voulons y voir, c'est une vue secondaire de notre monde actuel avec une caméra. Et ne vous inquiétez pas, c'est en fait beaucoup moins compliqué qu'il n'y paraît. Donc, ce que nous allons faire, c'est ajouter une autre caméra en trois D à notre monde de jeu principal. Et celui-ci n'a pas besoin d'être à jour car nous allons déjà avoir une caméra actuelle sur notre lecteur. Cependant, renommons-le. Nous l'appellerons caméra espion parce qu' elle va flotter au-dessus de notre monde de jeu. Parlons-en donc ici et évitons de le faire. Revenons ici. Nous allons voir deux fenêtres d'affichage. Maintenant, nous pouvons voir ce que voit notre caméra. Allez. Cliquez. Allons-y. Parfois, mon ordinateur est lent et grincheux et n'aime pas faire les choses. OK. Si nous descendons maintenant et faisons pivoter la caméra, nous procéderons de cette façon. C'est plus facile. Si nous faisons pivoter la caméra telle sorte qu'elle soit orientée vers le bas, 90 degrés, je ne pense pas avoir fait les choses correctement. Les rotations m'embrouillent toujours. Où est-ce que nous regardons ici ? Oh, je regarde le ciel. OK, c'est moins 90. Ça m'attrape à chaque fois. Très bien, maintenant nous le faisons simplement glisser vers le haut jusqu'à ce que nous puissions voir l'intégralité de la carte ou au moins la partie de la carte que cela est possible. Et c'est une bonne chose, je pense. Ou nous pourrions toujours procéder comme ça pour pouvoir simplement voir ce genre de choses là-bas. C'est suffisant, je pense. Vous remarquerez par défaut qu'il affiche nos points de navigation Bien entendu, nous devons revenir à notre masque d'appel et désactiver la couche NavPoints afin de ne pas les voir dans la caméra Maintenant, il ne nous reste plus qu'à faire glisser notre caméra espion dans notre sous-fenêtre Et maintenant, si vous passez à deux D, vous pouvez voir un peu de désordre car ce qui se passe ici, c'est que le port de vue secondaire, qui mesure 512 pixels 512 pixels, n'est pas correctement étiré à la taille du conteneur de sous-fenêtre Heureusement, nous pouvons résoudre ce problème simplement en cochant l'option Stretch, et nous avons maintenant un tout petit port de vue. La seule autre chose que nous devons faire maintenant est de mettre à jour la caméra espion lorsque notre joueur se déplace. Et normalement, vous penseriez que vous devez simplement confier la caméra espion au joueur. Mais si vous le faites, le joueur devra se trouver dans la fenêtre d'affichage, et nous ne voulons pas vraiment modifier notre hiérarchie ici Nous pouvons donc simplement donner à la caméra son propre script. Et comme le joueur existera toujours, suffit d'exporter une référence au joueur, et nous l' il suffit d'exporter une référence au joueur, et nous l'appellerons target et nous le rendrons un peu plus générique, dans la cela peut prendre trois D pour n'importe quel corps physique, mais nous ne l'utiliserons que pour le joueur. Ensuite, nous allons faire glisser le joueur ici. Et maintenant, dans la méthode de traitement Spy CAMs, que je ne peux apparemment pas épeler. Allons-y. Il suffit de mettre à jour les positions X et Z de la caméra pour qu'elles correspondent à celles du joueur. Nous ne mettons pas à jour la valeur Y car la valeur Y représente la hauteur, le haut ou le bas, et nous voulons que cela reste cohérent. Nous voulons littéralement qu'il aille dans les directions X ou Z en fonction du réservoir. Ainsi, la position globale de notre caméra, X et Z, est égale au point X de position globale de la cible et à la position globale Z de la cible. Et cela devrait faire l'affaire Voyons voir. Oui Maintenant, si je déplace mon tank, vous pouvez voir qu'il est en train de tout mettre à jour. Un autre ajustement que nous devrions probablement faire est d' orienter la caméra de telle sorte que lorsque le lecteur tourne, la caméra tourne également Mais je vous laisse faire un exercice pour voir si vous avez maîtrisé cette leçon fenêtres d'affichage sont incroyablement utiles en trois D. Vous pouvez même les utiliser pour effectuer un rendu sur la surface d'un autre objet Et si nous avons le temps à la fin du cours, j'aborderai peut-être ce sujet en guise de bonus. Je vous verrai lors de la prochaine leçon. 27. 3D UI avec nœuds Label3D: Bon retour. Cette leçon sera assez courte, et nous allons examiner moyen rapide d'ajouter une interface utilisateur tridimensionnelle, également connue sous le nom d'interface utilisateur diagétique dans notre environnement tridimensionnel Et nous allons le faire en apposant un nom de style World of Warcraft au-dessus de tous nos chars Comme vous pouvez le deviner, cela nécessite l'ajout d'un nœud enfant, et le nœud enfant que nous allons rechercher est l'étiquette trois D. Maintenant, bien sûr, nous devons orienter correctement notre étiquette trois D. Maintenant, nous devons l'orienter correctement. Mettons-la ici, et nous la reculerons légèrement pour qu' elle soit au-dessus de notre tourelle Allons-y. Ensuite, nous allons ouvrir son texte. Et comme vous pouvez le constater, il existe des paramètres similaires à ceux que vous obtiendriez dans votre étiquette et votre étiquette en texte enrichi. Nous allons donc simplement ajouter un texte d'espace réservé ici, le nom du tank Maintenant, comme vous pouvez le constater, nous ne pouvons voir le nom du tank que de face et de dos. Si nous regardons de côté, nous ne verrons rien car il s'agit vraiment d'un objet en trois D. Et parfois c'est ce que vous voulez, parfois non. Nous sommes dans la catégorie « peut-être pas variée ». Donc, ce que nous allons faire, c'est étendre drapeaux et activer Billboard panneau d'affichage signifie que l' objet sera toujours face à la caméra, quelle que soit son orientation Maintenant, nous voulons également étendre un peu notre script de tank, et nous allons le faire en ajoutant une variable d'exportation. Mm. Et, bien sûr, nous allons y faire glisser notre étiquette en trois D. Et dans notre objet de jeu, nous allons remplacer le nom du joueur et le nom des chars ennemis par des valeurs appropriées. Comme nous l'avons déjà fait puisque nous avons déjà une référence à notre joueur, nous pouvons simplement saisir la propriété de l'étiquette du nom du tank et définir son texte comme « joueur ». Ensuite, nous attrapons notre char ennemi de la même manière que lorsque nous nous sommes connectés en tant que signal et nous faisons exactement la même chose. Mais avec le nombre approprié de périodes, c'est parti. Alors maintenant, vous pouvez voir que le joueur a un puits, le joueur et le tank ennemi ont tous deux une étiquette au-dessus d'eux. Maintenant, en jouant avec le build, j'ai remarqué en jouant avec le build qu'il y a quelque chose dans les chars ennemis utilisant l' intelligence artificielle des chars ennemis qui provoque une boucle infinie Vous l'avez peut-être remarqué vous-même. Je vais l'étudier, et avant de passer à la leçon suivante, je vais le corriger, puis vous expliquer comment le réparer vous-même avant de continuer. Mais c'est la fin du chapitre 9. Donc, malgré ce bug, bravo. 28. Menu Démarrer: Bon retour. Comme promis, j'ai un peu débogué le système de points de navigation et j'ai découvert qu' en fait, nous n'avions pas assez de points de navigation dans la zone de mouvement du char, de sorte que lorsqu'il est arrivé à un point où il ne pouvait sélectionner qu' un point en particulier, il s'est bloqué Et nous ne voulons jamais que cela se produise. J'ai donc ajouté quelques points supplémentaires sur la carte juste pour éviter que cela ne se produise. manière générale, vous devez affiner votre couche de points de navigation manière à ce que les objets ne se déplacent pas les uns autres et qu'il y ait suffisamment de points pour qu'elle ne reste pas bloquée comme ça. Euh, j'ai également fourni un peu de code supplémentaire dans la fonction get random NabPoint, gros, et cela ne devrait jamais arriver si vous configurez correctement vos points de navigation Mais s'il en arrive au point où le tank n'a le choix que d'un point, il est pratiquement bloqué près du point le plus proche et n'a aucune autre cible à atteindre. J'ai donc imprimé un avertissement et j'ai défini le point de navigation qu'il devait sélectionner, égal au point de navigation le plus proche existant Et ce n'est pas une solution idéale, mais elle empêche le jeu de se verrouiller. À ce moment-là, vous allez vous rendre compte que quelque chose s'est mal passé et que vous devez ajouter d'autres nœuds à votre grille de navigation. Bien, cela étant dit, parlons maintenant de ce dont nous sommes ici pour parler au chapitre dix. Dans cette leçon, nous allons commencer à étoffer notre jeu et à y ajouter tous les composants qui en feront un jeu plutôt qu'un prototype Et la première chose dont nous aurons besoin est un menu de démarrage. Alors, bien sûr, nous allons revenir à notre scène de jeu. Et nous avons déjà une interface utilisateur intégrée au jeu, ce qui est génial, mais nous pouvons maintenant y ajouter une interface utilisateur de démarrage. Et nous allons être assez simples et paresseux à ce sujet. Nous allons essentiellement laisser la scène de jeu principale gérer tous les composants internes et externes de l' interface utilisateur et simplement les activer et les désactiver selon les besoins plutôt que de passer à des scènes externes. Pour un jeu plus vaste et plus compliqué, ce serait certainement une bonne idée, mais nous voulons garder les choses simples. Donc, si nous ajoutons un nœud enfant, nous pourrions ajouter un contrôle, mais nous allons plutôt ajouter un conteneur de panneaux. Et qu'est-ce qu'un conteneur à panneaux ? Un conteneur à panneaux est un conteneur similaire aux conteneurs VBox, H Box et Margin que nous avons utilisés auparavant Cependant, il contient une image d'arrière-plan qui sera redimensionnée en fonction de la taille de votre contrôle. Et nous pouvons modifier cette image d'arrière-plan pour qu'elle ressemble réellement à quelque chose de texturé Mais pour ce que nous faisons ici, fond noir semi-transparent est par défaut, et c'est exactement ce que nous voulons, car nous voulons simplement que le jeu disparaisse lorsque le menu apparaît Nous pouvons donc le faire à fond et obtenir ce que nous avons. Nous allons le renommer Et encore une fois, assurez-vous que vous êtes dans les deux onglets D lorsque vous modifiez des interfaces utilisateur. Nous allons donc maintenant utiliser un autre nouveau conteneur, et celui-ci s'appelle le conteneur central. Et à quoi sert un conteneur central ? Un conteneur central prend tout ce qu'il contient, l'écrase à la plus petite taille possible, puis le force à être centré sur le contrôle auquel il est attaché Donc, dans ce cas, il est attaché au menu Démarrer, il va donc centrer toutes les commandes qu'il contient. Juste ici. Et cela permettra de maintenir cette force à cette taille particulière, quelle que soit la taille à laquelle nous redimensionnons le menu de démarrage Donc, dans notre conteneur central, nous allons utiliser notre bon ami le conteneur VBox, et à l'intérieur de celui-ci, nous allons ajouter une étiquette Ce label sera le titre de notre jeu, qui est Zone Battle. Nous veillerons à ce qu'elle soit centrée, même si la police que nous allons utiliser n'est pas particulièrement bien centrée. La taille de police sera de 100, et la police elle-même sera notre amie, le pochoir Donc, au lieu de le localiser ici, nous pouvons simplement accéder à Quick Load puisque nous l'avons déjà chargé, puis cliquer dessus ici, et boum, nous avons un pochoir Maintenant, je vais vous montrer un truc vraiment chouette. Dans votre dossier de projet, j'ai fourni une texture de camouflage qui porte un nom très horrible Et nous allons l'utiliser pour créer un effet spécial sur notre titre. Donc, la première chose que nous allons faire est ajouter une touche de texture en tant qu'enfant de notre étiquette Et nous allons également renommer cette étiquette juste pour que nous puissions ou simplement pour que nous sachions de quoi il s'agit Et notre problème de texture, il faut qu'il soit de la taille de notre étiquette Donc, comme nous l'avons déjà noté, puisqu'il s'agit de l' enfant de l'étiquette, si nous disons complètement détruit, il va se forcer à prendre la taille de l'étiquette Nous devons maintenant fournir une texture. Faisons donc glisser notre texture camouflage vers l'emplacement de texture, et maintenant elle est trop grande. Nous passons donc en mode expansion et nous disons Ignorer la taille. Malheureusement, elle est écrasée. Nous avons donc changé le mode Stretch en mode tuile, et maintenant ça a l'air plutôt bien. Mais nous allons l'inverser un peu juste pour voir si nous pouvons obtenir une orientation légèrement meilleure. Euh, nous pouvons également changer cela en « Ouais, ça ne va pas marcher ». R, c'est Tile. OK, ça a l'air plutôt bien. Et maintenant, voici la partie la plus sophistiquée. Si nous descendons, nous revenons à si nous resélectionnons le titre de notre jeu et que nous passons à la visibilité, nous avons une option appelée Clip Children Et si nous changeons cela en clip uniquement, n'est-ce pas cool ? Il attache la texture sous-jacente à l'étiquette elle-même. Bien sûr, ce n'est pas parfait parce que certaines de ces valeurs sombres sont un peu obscures, mais nous pouvons changer la couleur de notre arrière-plan pour hommes en passant au thème des styles de remplacement et en le remplaçant par au thème des styles de remplacement et en le remplaçant un nouveau style à plat, ce qui est moche. Nous allons donc changer cela et le rendre plus sombre. Et nous allons également laisser tomber un peu l'Alpha afin de pouvoir voir l' arrière-plan à travers celui-ci. Cela ne résoudra pas parfaitement notre problème. L'obscurité du E est toujours un peu présente, mais vous savez, elle a l'air plutôt belle quand même. En fait, n'essayez pas ça. Déplaçons-le vers un vert plus foncé. Oui, ce n'est pas parfait, mais ça a l'air un peu mieux. Je ne sais pas Je ne peux pas vraiment le dire de toute façon, assez près. Tu as compris l'idée. À partir de là, nous devons ajouter quelques éléments supplémentaires. Nous voulons laisser le joueur configurer le nombre de chars ennemis avec lesquels il commence le jeu. Pour ce faire, nous devons donc ajouter un autre conteneur HBox, qui nous fournira une autre ligne avec laquelle nous pourrons travailler Et dans ce conteneur HBox, encore une fois, nous allons ajouter une étiquette Et cette étiquette portera la mention « ennemis ». Et, bien sûr, nous devrons changer la police et la taille de police. Faisons en sorte que la police soit de 50 caractères, et nous procéderons à un autre chargement rapide pour récupérer notre pochoir Nous pourrions également définir ici un thème à utiliser pour le menu, mais étant donné que nous ne changerons que le texte, et qu'il ne s'agit que d'un élément supplémentaire à modifier, utilisez-le normalement, nous devons toute façon déposer le thème sur l'étiquette. Alors, quelle est la différence entre déposer un thème sur l'étiquette et supprimer la police et la taille de police sur l'étiquette, vous savez ? Donc, en plus de cela, nous avons besoin d' un autre élément dans le conteneur HBox, et celui-ci s'appelle une boîte de rotation Et nous le ferons également pour ne pas vouloir de boîte à rotation ici. Et en fait, maintenant que je le regarde, il est presque complètement invisible sur fond vert. Nous allons donc changer cela encore une fois. Mais avec l'étiquette surlignée, passons à la mise en page du dimensionnement des conteneurs Et puis nous avons des valeurs horizontales et verticales ici. Ainsi, en général, un contrôle n'occupera que l'espace dont il a besoin. Et cela peut être changé. Et une façon de le modifier est de cliquer sur Développer, ce qui signifie qu'il occupera autant d'espace que possible dans l' espace dont il dispose. Donc, dans ce cas, le conteneur VBox que nous utilisons ne sera que aussi large que le texte du titre Cela signifie donc que nous avons autant d'espace disponible pour travailler. Et puis, bien sûr, verticalement, la HBox sera aussi haute que le texte et le contrôle, selon le plus grand Mais horizontalement parlant, si nous ne le faisions pas, aucun de ces objets occuperait toute la largeur du contrôle, ce qui est normal, même si le contrôle occupe toute la largeur du contrôle parent. Ce que nous voulons faire, comme nous l'avons vu, c'est l'élargir de manière à ce qu'il occupe tout l'espace disponible et qu'il nous reste la petite boîte à outils Malheureusement, la seule partie de la boîte de rotation que nous pouvons modifier est la couleur du texte et des flèches. Et nous ne pouvons le faire qu' en définissant le thème, ce qui est un peu odieux Nous allons donc simplement le laisser tel quel. Mais nous allons apporter quelques modifications à la boîte de rotation elle-même. Nous allons modifier l'alignement du texte au centre, et nous allons changer la valeur minimale à un, sinon ce serait un jeu ennuyeux. Et nous allons changer la valeur maximale à sept, car c'est peu près ce que notre carte peut facilement supporter. Nous pouvons toujours changer cela si nous le voulions, et nous arrondirons de manière à ce qu'il n'inscrive que des valeurs entières. La valeur est un, la valeur maximale est sept. OK, ça a l'air bien. Maintenant, changeons à nouveau cette couleur car elle ne fonctionne pas pour nous maintenant. est ce que je fais toujours. J'essaie toujours de faire glisser les flèches au lieu de cliquer sur OK, c'est un peu comme ça. Enfin, nous allons avoir besoin de deux boutons. Ajoutez donc à nouveau un nœud enfant, et nous utilisons un bouton. Le premier bouton sera notre bouton de démarrage du jeu. Et nous allons le renommer comme tel. C'est toujours une bonne idée renommer les commandes importantes de votre interface utilisateur, car comme vous pouvez le voir ici, la hiérarchie de l'interface utilisateur a tendance à s' encombrer très Il est donc toujours bon de pouvoir voir ce que vous faites à tout moment. Et nous allons ajouter un autre bouton. Et celui-ci va nous permettre de quitter le jeu. Dieu nous en préserve Et maintenant, bien sûr, nous devrons passer à leurs remplacements et modifier à nouveau les polices. La taille de police est donc de 50. La police elle-même est, encore une fois, un pochoir. Ensuite, nous ferons de même pour commencer. Si nous avions fait quelque chose de plus complexe que simplement changer la police et la taille, j'aurais certainement créé un thème à ce jour. Mais oui. D'accord. Voici donc notre écran titre. Dans la leçon suivante, nous allons utiliser ce que nous avons appris ici pour créer un écran de pause qui s' affichera au milieu du jeu. Ensuite, dans la leçon suivante, nous les connecterons au code pour qu' ils fonctionnent. Je t'y verrai. 29. Menu pause: Bon retour. Dans cette leçon, nous allons créer un menu de pause que nous pouvons utiliser pour suspendre le jeu. Comme vous l'avez peut-être deviné, notre interface utilisateur est un peu encombrée ici Nous allons donc cliquer sur le globe oculaire à côté du menu de démarrage pour désactiver sa visibilité Nous pouvons désormais travailler sans entraves. Nous allons ajouter un autre nœud enfant. Et celui-ci sera un conteneur central. Et si nous voulons un conteneur central, c'est parce que notre menu de pause n' occupera pas la totalité de l'écran. Nous voulons donc qu'il soit centré au centre de l'écran. Donc, si nous faisons tout le nécessaire ici et que nous allons changer ce menu pour suspendre le menu Maintenant, dans ce cadre, nous allons utiliser un autre conteneur de panneaux. Maintenant, bien sûr, remarquez que vous ne pouvez pas voir le conteneur du panneau, et c'est parce que, comme je l'ai mentionné dans la leçon précédente, le conteneur central écrase tout à sa taille minimale absolue Il y a donc deux façons de résoudre ce problème. La première est que nous pouvons passer à la mise en page et à la transformation. Non, il n'est pas en cours de transformation. C'est en cours de mise en page. Taille minimale personnalisée. Si nous devions changer cela, vous verrez que le contrôle imposerait une taille minimale absolue, mais nous n'avons pas besoin de le faire Cliquez dessus et remettez-le à zéro, car tout ce que nous allons mettre dans le conteneur du panneau va le dimensionner pour nous. Ainsi, nous n'avons pas à nous soucier de réajuster taille minimale personnalisée chaque fois que nous changeons la taille de notre conteneur de panneaux La première chose que nous allons ajouter est donc un conteneur de marge. Et comme nous l'avons déjà mentionné, un conteneur de marges permet simplement ajouter des marges à la périphérie de notre contenu existant, qui s'ajusteront une fois que nous y aurons intégré certaines informations. Il existe en fait des moyens de gérer ces bêtises selon lesquelles la police au pochoir que nous utilisons est un peu décalée Nous ne pouvons rien y faire sur les boutons, mais nous pouvons faire quelque chose pour l'en-tête du menu, pour lequel nous allons l'utiliser. Nous allons ajouter un autre nœud enfant, et celui-ci sera un conteneur VBox Et dans le conteneur VBox, nous allons ajouter une autre étiquette Et bien sûr, cette étiquette indiquera le menu Pause. Et nous allons le centrer, puis nous allons passer à Hemovides, bien sûr, la taille de police sera de 45 et la police, encore une fois, est Ça a l'air plutôt décent. Maintenant, nous allons faire preuve d'un peu de fantaisie et nous allons utiliser un nouveau type de commande appelé séparateur H. Et le séparateur H est incroyablement utile car il permet essentiellement ajouter des lignes qui sépareront votre contenu, et vous pouvez contrôler l'apparence de ces lignes de différentes manières. Donc, la façon dont nous allons procéder est revenir à themoide, et nous allons changer le style du séparateur, et ce sera un nouveau style de ligne, un type de style que nous n'avons pas encore vu Ensuite, lorsque nous l'ouvrons, la couleur de la ligne, nous allons la changer en blanc pour qu'elle corresponde à notre texte. Et nous allons lui donner une épaisseur de deux parce que pourquoi pas ? Et nous allons modifier les marges de contenu. Et nous allons porter la marge de contenu supérieure à environ 16. Et comme vous pouvez le constater, elle se soulève. Même si le contrôle est techniquement là, il élève les lignes pour donner l' impression qu'il est plus proche de notre police. Maintenant que nous l'avons maintenant que nous avons la police ici, nous pouvons modifier légèrement nos marges pour lui donner un peu plus d'apparence. Donc, si nous revenons à notre conteneur de marges et que nous passons sous les constantes de Themoides, nous pouvons désormais modifier les Commençons donc avec une bonne dizaine de pixels partout, et cela semble plutôt bon pour l'instant. Nous pourrons donc l'ajuster davantage une fois que nous aurons nos autres boutons, et nous allons ajouter trois nouveaux boutons. Ou allons-nous ajouter deux nouveaux boutons ? Je pense que nous allons ajouter deux nouveaux boutons. À l'origine, je pensais que nous allions quitter l'ordinateur de bureau, mais nous pouvons arrêter le titre. Notre premier bouton sera donc simplement un bouton Zoom, qui nous ramènera au jeu, et notre deuxième bouton sera un bouton permettant de revenir au titre. Donc, bien sûr, le Zoom va dire «   Zoom », et « quitter le titre » va indiquer « quitter le titre ». Et maintenant, voici une astuce vraiment intelligente. Si vous maintenez la touche Ctrl enfoncée et que vous cliquez avec le bouton gauche de la souris pour sélectionner plusieurs nœuds, vous pouvez les modifier tous en même temps s'ils ont des propriétés communes . Une fois ces deux éléments sélectionnés, nous passons maintenant à eux au fur et à mesure, et nous pouvons modifier les polices et les tailles de police sans avoir à le faire individuellement. Donc, chargement rapide, pochoir. Boom, c'est pas cool ? Et maintenant, nous allons passer à ici. Et allons-y avec 40. Ça a l'air juste. Et nous allons double-cliquer ici pour le recentrer Et ça a l'air plutôt bien. Euh, les marges sont bonnes. OK. C'est notre menu de pause. Nous pouvons donc cliquer sur la visibilité pour la masquer. Et maintenant, dans la leçon suivante, nous allons l' associer à du code et ajouter la possibilité de démarrer et de mettre le jeu en pause. Et oui, je t'y verrai. 30. Gestionnaire de jeu : états début/fin: Bon retour. Dans cette leçon, nous allons écrire le code qui reliera nos menus de démarrage et de pause, ainsi que la possibilité pour le joueur de mourir et d'être renvoyé le menu de démarrage afin qu'il puisse réessayer. Pour ce faire, nous devons cependant mettre en place un petit cadre. La première chose à faire est donc évidemment de créer des scripts pour le menu de démarrage et le menu de pause. Maintenant que notre dossier de scripts est un peu encombré, nous allons ajouter un nouveau dossier pour y placer nos scripts d'interface utilisateur Et nous devrions également créer des références à notre menu de démarrage et notre menu de pause dans notre jeu. Et évidemment, nous voulons que le menu de démarrage apparaisse lors du premier chargement du jeu. Ainsi, dans la méthode prête pour notre objet de jeu, nous pouvons indiquer à notre menu de démarrage de s'afficher. Maintenant, nous avons un léger problème. Même si le menu de démarrage s'affiche, le joueur peut toujours se déplacer et le tank ennemi peut toujours se déplacer. Et cela est dû au fait que nous n'avons pas suspendu le traitement qui aurait lieu pendant le jeu cause de l'affichage du menu Et nous voulons le faire à la fois pour le menu de pause et pour le menu de démarrage. Maintenant, nous pourrions examiner les méthodes de traitement pour nos chars, pour notre jeu et pour tout reste, ainsi que pour la saisie non gérée des touches gros, vérifier si l'un des menus s'affiche , puis revenir prématurément à Mais c'est beaucoup de travail. Et la marque d' un bon programmeur de jeux vidéo est un sentiment accru de paresse. Donc, ce que nous allons faire, c'est utiliser ce que l' on appelle la propriété pausée de l'arbre des scènes Oups. Nous allons également appuyer sur un tas de boutons aléatoires qui n' ont absolument rien à voir avec ce que nous faisons . D'accord. Ainsi, pour accéder à l'arbre des scènes, nous utilisons la méthode get tree. Et il existe une propriété de l'arbre des scènes appelée pause. Maintenant, si nous le définissons sur true, cela signifie qu'aucun traitement n'aura lieu. Alors maintenant, si nous devions lancer notre jeu, vous verrez qu'il ne se passe absolument rien. Si j'appuie sur l'une des touches, le jeu ne fonctionnera pas ou le tank ne bougera pas. Le seul problème, c'est que si je clique sur l'un ou l'autre, je veux dire, nous n'avons pas encore mis de code derrière eux, mais laissez-moi le faire à des fins d'illustration. Nous allons donc dans notre menu Démarrer, et nous allons brancher le bouton de fermeture, et nous allons le faire en accédant à l' onglet des signaux et en obtenant le signal pressé. Et si nous cliquons sur Accéder à la source, le message ira directement à l'objet qui diffuse le signal. Nous voulons faire défiler la page un peu vers le haut car nous voulons en fait l'associer au script du menu Démarrer. Alors maintenant, disons simplement imprimer, arrêter de presser. Maintenant, si nous essayons de passer à l'ordinateur de bureau, vous remarquerez que nous ne voyons rien dans notre coin, et c'est parce que, bien entendu, notre interface utilisateur ne fonctionne pas non plus. La façon de changer cela est donc de cliquer sur le composant de l'interface utilisateur, le contrôle. Et cela fonctionne pour n'importe quel nœud, en fait, mais nous ne l'utiliserons que pour nos menus de démarrage et de pause. Et vous voulez passer à la procédure. Ensuite, nous changeons le mode de traitement d'hériter à toujours Cela signifie que même si l'arbre des scènes est suspendu, cet objet continuera à être traité. Maintenant, si nous redémarrons notre jeu et que nous essayons de le quitter, vous verrez que la méthode Quit Pressed s'est déclenchée et que le message est apparu sur la console. Donc, pour quitter notre jeu, il suffit d'obtenir une référence à notre arbre. Et puis dites simplement « arrête ». Maintenant, dans un jeu plus raffiné, vous devriez ajouter une boîte de dialogue disant : Voulez-vous vraiment arrêter ? Oui ou non Vous devriez en fait avoir suffisamment d'outils à votre disposition pour en créer un. Donc, si vous décidez programmer un peu plus apprendre, pour apprendre, je vous demanderais dans cette leçon ajouter une boîte de dialogue de confirmation qui apparaît lorsque appuyez sur le bouton Quitter Nous ne quitterons le jeu que si le bouton Oui du dialogue confirmé a été enfoncé Alors maintenant, nous voulons également câbler le bouton Démarrer. Et nous pourrions aussi bien donner les deux menus, noms des classes et les épeler correctement, bien sûr. Et bien sûr, nous voulons également connecter les deux boutons du menu de pause. Et dans le cas du menu pause, nous voulons reprendre le jeu lorsqu'il reprendra Donc, naturellement, dans ce cas, nous allons le reprendre et en fait, nous devons également définir le processus sur notre menu de pause sur toujours. Donc, bien sûr, lorsque nous reprenons, pause est égal à faux, et nous masquerons le menu de pause. Maintenant que nos talons sont tous câblés, nous devons réellement leur ajouter des fonctionnalités Donc, dans le menu Démarrer, nous avons notre méthode d'appui sur le bouton Démarrer. Et comme vous pouvez le constater, le menu Démarrer est un produit du jeu, et nous allons avoir besoin que le jeu réagisse lorsque le bouton du menu de démarrage est enfoncé, car nous voulons le jeu fasse toute la comptabilité nécessaire pour démarrer le jeu lorsque ce bouton a été enfoncé Godot a une devise qui est une ligne directrice pour dicter la manière dont les parents et les enfants doivent interagir Et cette directive s'appelle Call Down Signal Up. Cela signifie que le jeu peut manipuler directement le menu de démarrage, comme nous l'avons vu ici lorsque le jeu appelle la méthode d'affichage de Start Men, mais le menu de démarrage doit envoyer un signal et laisser les autres nœuds décider quoi en faire. Et comme le jeu est le parent du menu de démarrage, il réagira naturellement à ce signal, car nous montons essentiellement dans la hiérarchie. Le menu de démarrage devrait donc déclencher un signal auquel le jeu pourra réagir. Maintenant, le problème est que le jeu sera suspendu lorsque le menu de démarrage s'affichera, sorte que le menu du jeu ne pourra pas réellement réagir Nous devons donc dire que nous devons faire deux choses. En fait, nous devons mettre la pause de arbre dans l'objet du bouton de démarrage lui-même, ce qui est Ensuite, nous devons envoyer un message pour informer le jeu et tous les autres objets intéressés qu'un nouveau jeu a été lancé. C'est ce que nous allons faire. Nous obtenons un arbre suspendu, égal à faux Ensuite, nous entrerons dans notre messager et nous définirons un nouveau signal. Mmm, hum. Et notre menu de démarrage déclenchera ce signal. Et en fait, une autre chose qu'il doit faire est de se cacher. Donc, actuellement, le jeu ne va pas vraiment faire quoi que ce soit au début du jeu mais connectera quand même le signal. Oh, je l'ai mal fait. C'est connecter Comme je l'ai dit, pour le moment, cela ne fait rien. Voyons donc si cela fonctionne réellement. Oup, nous avons une erreur. Et j'ai déjà rencontré cette erreur. Je ne suis pas tout à fait sûr de quoi il s'agit, mais en gros, ce qui se passe, c'est que pour une raison ou une autre, le NavPoint devient nul lorsque le réservoir sort de son état d'inactivité, et c'est un problème Donc, si nous revenons à notre état de chasse, donc si l' objet surveillé est inactif, nous vérifierons s' il existe un NavPoint Nous allons obtenir le NavPoint , puis l' objet surveillé inactif est faux Mais cela suppose que cela fonctionne réellement. Maintenant, si cela ne fonctionne pas, cela va échouer au point de supposer que le NAPoint a été défini Donc, ce que nous devons faire ici, c'est faire une petite précaution en disant : si les objets surveillés les plus proches de NavPoint sont égaux à zéro, eh bien, en fait, non, nous n'avons pas à le faire ici Nous allons le faire ici. Ainsi, si les objets surveillés les plus proches de NAPoint ne sont pas nuls, vous pouvez définir idle sur false Sinon, lors du prochain cycle, nous voulons réessayer. Maintenant, il est également possible que nous devions à nouveau ajuster notre niveau de navigation J'examinerai cela avec un peu plus de tests après cette leçon pour voir si c'est le cas. Mais cela nous évitera certainement quelques problèmes, car si le char ne bouge jamais réellement, nous savons que c'est le problème. Cela ne permet pas de trouver un point Av. C'est peut-être juste un problème lié à la pause du jeu. Mais oui. Revenons-y donc, et nous verrons si cela fonctionne et si cela devrait fonctionner. Et lui et le tank ennemi se déplacent et ainsi de suite. Bien, maintenant nous voulons faire apparaître le menu de pause lorsque la touche d' échappement est enfoncée, et nous effectuons actuellement toutes nos saisies dans les touches non gérées du jeu, mais nous pourrions également le faire dans le menu de pause lui-même Si la mémoire est pleine simplement parce qu'elle n'est pas visible, cela ne signifie pas qu'elle ne recevra pas d'événements de pression sur les touches Nous allons donc tester cette théorie. Et si je me trompe, nous allons simplement mettre là où nous allions le mettre à l'origine. Si la saisie est une touche physique, échappement et qu'elle n'est pas visible, alors nous voulons mettre le jeu en pause, et nous recommençons simplement en utilisant get tree, pause comme égal à true et show OK, je viens de me rendre compte que je viens de me rendre compte d'un léger bug. Nous ne sommes donc pas en train de vérifier si le jeu est encore en cours d'exécution. Donc, si je clique sur Escape now, nous aurons un menu de pause. Et c'est ce que nous ne voulons pas. Nous voulons donc que cela se produise uniquement si ce n'est pas visible, mais aussi, en fait, au lieu de ce n'est pas visible vérifier si l'arbre a déjà été suspendu si Si l'arbre n'est pas suspendu, c'est ce que nous voulons faire. Et nous y voilà. Nous allons donc commencer le jeu et nous pouvons faire une pause. Nous avons donc déjà utilisé notre bouton Zoom. Ensuite, nous devons gérer notre bouton pour passer au titre. Et, bien entendu, le moyen le plus simple de le faire est d'ajouter un autre signal. Et nous émettrons ce signal depuis notre menu de pause. Et nous voulons que le menu Démarrer surveille ce signal. C'est bon. Où est mon point de départ ? Ça y est. Donc, dans la méthode prête de notre menu de démarrage, nous nous y connecterons. En fait, nous pouvons faire un petit raccourci ici. Donc, ce que nous ferions, c'est fournir un nom de fonction ici, puis nous fournirions une fonction ici. Mais la fonction ne fera que montrer le menu de démarrage, et il existe un moyen beaucoup plus rapide de le faire. Nous allons utiliser ce que l' on appelle une fonction Lambda. Et une fonction Lambda est littéralement une fonction définie en ligne sans nom Nous pouvons donc fournir une définition complète de la fonction ici au lieu d'un nom de fonction. Et nous le faisons simplement en fournissant le mot-clé funk et les arguments de la fonction comme nous le ferions ici, mais nous ne lui donnons pas de nom, puis nous ajoutons simplement le code par la suite Donc, dans ce cas, le code va littéralement simplement afficher le menu de démarrage. Maintenant, nous sommes en pause ou nous sommes dans le menu Démarrer. Et nous passons à Start. Le jeu est en cours. Pause. Quittez le titre. J'ai oublié de masquer le menu de pause. Mais oui, c'est comme ça que ça marche. Et maintenant, si nous étions trop bien portants, nous ne pourrions pas créer un nouveau jeu car le menu de pause est toujours là. Très bien, alors arrêtez de titrer, émettez. Masquer Et maintenant, nous devrions être dorés. Et nous le sommes. C'est plutôt cool. Bien, lorsque nous quittons le titre, passons au bureau. Le jeu est terminé. OK, maintenant que nous pouvons avoir un menu de démarrage et un menu de pause, nous devons configurer les états du jeu de telle sorte que le jeu quitte le jeu. Le jeu affiche un message, puis revient au menu de démarrage après la mort du joueur. Et, encore une fois, le moyen le plus simple de le faire est de fournir une fonction globale. En fait, non, le tank ne l'est-il pas déjà ? Non, nous l'avons fait en coque. Eh bien, on peut le mettre ici. Nous pouvons donc fournir un signal lorsqu'un char a été détruit. Et si nous ouvrons notre script shell, puisque nous sommes déjà en train de gérer la collision du tank ici, oui, nous pourrions le faire. Nous pouvons le faire ici. Nous pouvons soit le faire ici, soit faire dans le cadre de la méthode hit. L'un ou l'autre est parfaitement acceptable. Mais si c'est vraiment le cas, tu sais quoi ? C'est le moyen le plus logique de le faire. Désolée, je n'arrête pas de rebondir ici. Mais si nous retournons dans le tank, nous avons une variable détruite, et encore une fois, les setters Destroyed ont valeur égale Messenger, en fait, nous devons changer cela parce que c'est pour n'importe quel tank. Tank Messenger détruit, émets-toi. Self est un mot clé spécial qui indique l'objet qui exécute actuellement le script. OK. Ouais. Ça aide si j' épelle correctement les choses. Boum. Allons-y. OK, encore une fois, le seul tank dont le message nous intéresse est le tank du joueur. Bien que cela soit en fait un peu superflu, étant donné que dans notre char ennemi, nous en avons, euh, hein OK. D'accord. Oui, nous avons ici des signaux redondants, qu'il faut normalement éviter, mais dans ce cas, nous voulons faire la différence entre le char ennemi détruit et un char en général détruit Dans ce cas, nous voulons nous connecter à la méthode de destruction des chars du joueur. , vous savez, si c'est le cas, nous n'avons pas besoin de le mettre ici. Parce que nous avons déjà reçu différents signaux ici. Ensuite, nous retournerons ici et c'est juste un peu détruit. Et puis de cette façon, le jeu peut se connecter à la méthode de destruction des joueurs. Ce qui déclenchera la fin de la partie. Et, bien sûr, cela signifie que nous aurons besoin d' une interface utilisateur supplémentaire. Nous allons donc le créer maintenant. Passons au jeu, et cela fera en fait partie de l'interface utilisateur. Nous pouvons donc ajouter ça ici. Ce sera un conteneur à panneaux. Ouais. Ce sera à peu près la taille à peu près, et nous le centrerons, ce qui est une autre solution. C'est une autre façon de centrer les choses que d' utiliser un conteneur central Cependant, si vous en modifiez la taille ultérieurement, vous devrez le recentrer Donc, si je pars comme ça, maintenant c'est décalé, donc je devrais le recentrer Dialogue de fin de partie. Étiquette du nœud enfant. En fait, non. Nous voulons un panneau, nous voulons un conteneur de marge. Je vais augmenter un peu ces marges. Constantes de Themoides. Donnons-leur tous les quinze ans. Conteneur à marge. Étiquette. L'alignement horizontal est désormais centré. Et ces dérogations. Chargez rapidement notre police au pochoir, modifiez la taille du texte pour qu'elle soit beaucoup plus grande Allons-y. Et maintenant, nous pouvons ajouter le code pour lancer cela et faire une pause de quelques instants, puis revenir au menu de démarrage. Donc, bien sûr, nous allons devoir revenir à notre jeu, et nous allons exporter une autre référence. C'est bon. Et une fois que le dialogue de fin de partie s'affiche, nous devons mettre le jeu en pause puis le terminer après, disons, environ 2 secondes. Ainsi, dans la méthode « on player destroyed », nous utilisons le mot clé Awet Cela signifie qu'il va suspendre le traitement de ce script en particulier, dans ce cas, du jeu jusqu'à ce que le signal que vous indiquez soit déclenché. Donc, ce que nous voulons faire, c'est obtenir notre arbre, et nous allons appeler Create Ti, ce qui équivaut à créer un nœud de temporisation, comme nous l' avons fait pour le chronomètre de rechargement des chars, mais cela se fait en quelque sorte de manière invisible Il crée essentiellement un nouveau nœud de temporisation et l'attache à l'arbre principal avec ce nombre de délais de compte à rebours en secondes, puis il le démarre. Et nous voulons indiquer que nous attendons la méthode de temporisation ou le signal de temporisation de ce temporisateur, qui est appelé lorsque le chronomètre est écoulé Et nous voulons également connecter à ce signal notre méthode de gestion de fin de partie. Malheureusement, cela ne bloque pas le jeu. Cela ne permet pas de suspendre l'arborescence des scènes, comme nous l'avons fait pour suspendre le jeu Et nous voulons cela parce que nous ne voulons pas mettre le jeu en pause car si nous le mettions en pause dès que le dialogue de fin de partie apparaît, cela interromprait la diffusion du son. Le joueur mourrait donc. Le bruit de l'explosion se produirait. Mais ensuite, le dialogue s' engageait l'arbre s'arrêtait et nous n' entendions pas vraiment l'explosion. C'est pourquoi nous ne voulons pas effectuer notre appel universel Getree avec pause à points égaux lorsque nous détruisons le joueur Cependant, nous devons mettre en place quelques mesures de protection pour empêcher que des choses ne en place quelques mesures de protection pour se reproduisent lorsque le joueur est mort, car, par exemple, si nous ne disons pas aux chars ennemis d'arrêter de tirer sur le joueur mort, lorsque le joueur est mort, car, par exemple, si nous ne disons pas aux chars ennemis d'arrêter de tirer sur le joueur mort, ils continueront à tirer sur lui, ce qui ne fait qu'ajouter insulte à blessure Donc, en état de tir, nous corrigeons ce problème en vérifiant si l'objet surveillé, qui est, bien sûr, le char ennemi, sa cible, c'est-à-dire le joueur, est détruit ou s'il n'est pas détruit ou s' il n'est pas détruit, pas détruit, puis nous tirons un obus vérifiant si objet surveillé, qui est, bien sûr, le char ennemi, sa cible, c'est-à-dire le joueur, est détruit ou s'il n'est pas détruit ou s' il n'est pas détruit, pas détruit, puis nous tirons un obus Et s'il est détruit, nous l'ignorons. Nous devons également corriger un léger bogue dans le setter détruit de notre tank car ce qui se passait ici , c'est que nous émettions le signal détruit quel que soit le statut de la variable détruite Et nous ne voulons admettre le signal détruit que lorsque le char a été réellement détruit, ce qui signifie que le terme « détruit » est égal à « vrai ». Nous avons donc jeté un chèque ici. Et la raison pour laquelle c'est important, c'est que si le joueur devait mourir et que nous devions revenir au menu principal pour recommencer une nouvelle partie, le joueur serait toujours mort. Maintenant, au début du jeu, nous ajoutons un joueur détruit Eagles False pour le remettre en état actif afin que nous puissions jouer à une nouvelle partie. Malheureusement, aucune des autres variables que nous avons définies ne sera égale à celle qui aura été réinitialisée. Le joueur conservera donc son ancien nombre de victimes, etc. Et nous pouvons réellement changer cela. Donc, si nous allons dans UI, Kill Count, nous pouvons le remettre à zéro. Ce serait aussi une bonne idée de simplement « Oui, allons-y ». est donc préférable d'avoir le nombre de victimes ou de faire que l'interface utilisateur se connecte à la méthode de démarrage du jeu. Parce que plusieurs objets peuvent être connectés au même signal. Et en fait, nous ne voulons pas le faire ici. Nous voulons le faire dans l' interface utilisateur elle-même , car cela permet à tout de rester autonome. Alors Messenger, lancez le jeu, connectez-vous sur Démarrer le jeu. Ensuite, dans le jeu OnStart, nous voulons remettre le nombre de victimes à zéro Malheureusement, les positions de départ des chars des joueurs et des chars ennemis n' auront pas été réinitialisées, mais nous allons corriger ce problème dans la prochaine leçon lorsque nous mettrons en place un véritable système d'apparition Maintenant, permettez-moi de m'assurer que je n'oublie rien. L'état de cuisson est donc bon. Le char détruit est bon. Nous avons fait notre travail dans le jeu. Donc, bien sûr, nous allons relier la fin de partie à la fin de partie, nous masquons le jeu par le biais d'un dialogue et nous émettons simplement le signal de fin de partie . Et, bien sûr, nous devons à nouveau geler le jeu lorsqu'il revient à l'écran titre, et je ne pense pas l'avoir fait. Vérifions-le. OK, jeu Cart. Laisse l'ennemi me tuer. OK, donc le joueur ne va pas bouger, mais comme vous pouvez l'entendre, nous n'avons pas vraiment suspendu l'arbre Nous allons donc devoir le faire. Donc, en fin de partie, Messenger passe à Title Amit. Cela signifie donc que le jeu Eh bien, le menu de démarrage s'est connecté rapidement à Title it Funk Show Et ici, nous voulons donc ajouter une autre ligne à notre Lambda ici, ce qui mettra l'arbre en pause Nous pouvons donc le formater un peu mieux en appuyant simplement sur Entrée. Godot ne s'en souciera pas. Ensuite, nous ferons Get Tree Almost equal true. Et cela devrait régler le problème. Et c'est le cas. OK. Maintenant que c'est fait, il nous reste encore une chose à faire, évidemment, et nous devons vérifier si le joueur a tué tous les chars ennemis, et si c'est le cas, alors la partie devrait être terminée à cet égard. Ou du moins, il devrait redémarrer et faire réapparaître un certain nombre de chars Mais nous n'allons pas le faire maintenant. Nous allons le faire dans le cadre du développement du générateur d'ennemis, ce que nous allons faire dans la prochaine leçon 31. Système d'création d'ennemis: Bon retour. Dans cette leçon, nous allons coder un système d' apparition qui gérera l'insertion de notre joueur et de nos ennemis sur la carte Mais avant de passer au codage, nous devons faire un peu de ménage Donc, la première chose à faire est d'aller dans notre arène, et d'ajouter un nouveau NavPoint car nous devons également indiquer où le joueur apparaît Nous avons donc déjà notre scène NavPoint, et nous allons la faire glisser dans la liste Une fois qu'il sera disponible, nous le renommerons player spawn. Nous allons utiliser le nom du spawn pour indiquer qu'il s' agit du point d'apparition auquel le joueur doit apparaître En plus de cela, nous voulons changer la couleur des points d'apparition afin de savoir qu'ils sont spécifiques au joueur Donc, si nous cliquons dessus avec le bouton droit de la souris et que nous sélectionnons Enfants modifiables, nous avons désormais accès aux enfants de l'objet Comme je l'ai mentionné dans une leçon précédente, le maillage est une ressource, et comme tous les points d' apparition proviennent de la même scène, ils partagent tous la même ressource, qui signifie que si je modifie ce maillage, cela les changera tous, donc nous ne voulons pas cela Nous élargissons donc le menu déroulant et nous disons rendre unique, récursif. Et si nous disons « récursif » et pas simplement « rendre unique », c'est parce que nous voulons également que le matériau contenu dans le maillage soit également unique Nous pouvons donc maintenant l'étendre et passer au matériau, modifier son albédo et lui donner la couleur que vous voulez J'ai choisi le vert. Ensuite, nous devons déplacer le spawn des joueurs ailleurs. Je vais le placer dans le coin de la carte juste pour que le joueur n' apparaisse pas au-dessus de ses adversaires Et je vais également modifier la rotation du point d'apparition afin que nous puissions indiquer l'origine vers laquelle le joueur va apparaître Ils apparaîtront donc à l'emplacement correspondant à la rotation de ce point d'apparition en particulier Ensuite, la prochaine chose que nous devons faire est modifier notre jeu pour tenir compte du fait que nous allons utiliser un nœud générateur. La première chose à faire est donc de supprimer le tank du joueur et le tank ennemi, car le générateur va les ajouter à la scène Et nous devrons également ajouter un générateur. De plus, ce serait une bonne idée à ce stade de subdiviser l'objet du jeu en jouable et une section d'interface utilisateur Nous allons donc ajouter un nœud enfant, que nous allons appeler playfield, et il sera simplement de type node nœud est le type d' objet par défaut le plus bas que vous puissiez avoir dans Godot Et c'est très utile lorsque vous voulez dire : je veux quelque chose dans une scène, mais je ne veux pas que ce soit quoi que ce soit. Les nœuds sont parfaits pour regrouper des éléments, comme nous allons le voir. Nous allons donc renommer ce nœud en terrain de jeu, et nous allons faire glisser l'arène en dessous telle sorte qu'elle soit un enfant du terrain de jeu Et le terrain de jeu aura également besoin d'un générateur, qui sera également un nœud Et bien sûr, le générateur aura besoin d'un script joint Et changera le nom de sa classe en spawner. Nous sommes maintenant prêts à commencer à créer notre système de spawn. La première chose que nous devons faire est de donner plus de poids à la foulée Le générateur doit gérer plusieurs choses. Il a besoin de configurer certains signaux. Donc, bien sûr, nous allons lui donner une fonction prête à l'emploi. Cela va faire apparaître des chars ennemis. Et cela va non seulement faire apparaître le tank du joueur, mais aussi le renvoyer le nœud appelant, car nous voulons pouvoir l'intégrer dans le monde du jeu Et non seulement nous voulons l' intégrer au monde du jeu, mais nous devons également connecter certains signaux et autres éléments à l'objet du jeu. Il est donc légèrement plus facile de le faire en renvoyant l'objet du joueur. Mais nous pouvons également transmettre l'objet de connexion, ce que nous allons faire de toute façon pour les chars ennemis. Nous avons donc maintenant nos trois méthodes, et bien sûr, va se plaindre parce qu' elle veut renvoyer une valeur, nous n'en avons pas encore. Alors maintenant, nous les avons coincés. Et bien sûr, nous allons avoir besoin références aux fichiers de scène que nous allons instancier , à savoir le tank et le tank AI Player Tank Prefab est donc une scène pleine à craquer. Et le char préfabriqué ennemi est également une scène pleine à craquer. Nous devons également connaître le nombre de chars ennemis que nous allons faire apparaître, car spinner apparaît dans le menu de démarrage Et par défaut, ce sera un et cela devrait suffire pour commencer. Donc, si nous entrons dans le jeu, en fait, nous devrions entrer dans le script du jeu. Nous avons donc déjà un tas de choses que nous avons faites dans le script de préparation au jeu, qui supposent que le joueur et le tank ennemi sont déjà dans la scène au début du jeu Ce n'est plus le cas, mais nous avons toujours besoin de ce code. Donc, plutôt que d'essayer de tout mémoriser, nous allons simplement contrôler K et tout commenter. Et dès le début de la partie, nous avons désormais des informations à traiter. Passons donc par là. Ensuite, nous y reviendrons. Vous pouvez ignorer cette erreur si elle se produit. C'est une sorte de bug bizarre que Godot vomit. Il n'apparaissait pas dans les éditions précédentes, donc, probablement, il sera corrigé. Cela n'affecte rien à ce que nous faisons actuellement. OK, alors dans le spawner, que devons-nous faire ? Eh bien, encore une fois, nous devons faire apparaître le tank du joueur, et le moyen le plus simple de le faire, bien sûr, est d'en créer un nouveau Donc, le joueur var sera un tank. Et ce sera une instance du player tank prefab préfabriqué du tank joueur s'instancie donc et, pour être trop précis à ce sujet , nous pouvons le lancer en disant Et nous avons maintenant une copie d'un tank que nous pouvons utiliser en tant que joueur. Nous pouvons donc renvoyer le joueur. Mais il va falloir faire plus que cela. Nous allons également devoir fournir une référence au terrain de jeu, en particulier à l' objet de l'arène, car nous allons devoir être en mesure de demander ses points d'apparition. Et nous ne voulons pas simplement accéder directement au nœud des points d'apparition, car nous devrons également accéder au nœud parent de l'arène Nous allons donc simplement faire de l'arène une variable A ici. Générateur. D'accord, nous devons donc également attribuer ces valeurs. Le terrain de jeu sera donc une arène. Le préfabriqué de chars du joueur est, bien sûr, un tank, et le préfabriqué de char ennemi est un char ennemi Donc, entre autres choses que nous devons faire pour le joueur, nous devons définir son nom, sa rotation et sa position. Le nom, le nom du nœud et la valeur de l'étiquette sont donc assez simples. Si nous voulons définir le nom du nœud, qui apparaît ici dans l' arborescence des scènes, nous indiquons simplement le nom du point du joueur, et nous l'appellerons joueur parce que si nous devions le laisser tel qu' il est pour le tank, ce serait un tank, ce que nous ne voulons pas. Nous voulons donc indiquer qu'il s'agit du joueur. Maintenant, si vous vous souvenez, le réservoir porte une étiquette en trois D, que je crois que nous avons appelée étiquette nominative du réservoir, selon la saisie automatique. D'accord. Ça y est. Étiquette indiquant le nom du réservoir. Alors oui. Le texte est également égal au joueur. Ensuite, nous devons obtenir le point d'apparition à partir duquel le joueur va apparaître. Et le moyen le plus simple d'y parvenir est simplement emprunter notre terrain de jeu Et nous aurons le nœud Nav Points. Oh, en fait, il existe un moyen un peu plus simple de le faire qu' à l'origine. Donc, la première fois que je l'ai fait , j'ai saisi le nœud NAV Points, et je l'ai orthographié correctement, ce que je ne fais jamais sur le tournage Ensuite, j'ai utilisé la méthode find child et je lui ai donné le nom player spawn Mais nous n'avons pas besoin de le faire, car nous savons qu' il y aura toujours un joueur associé aux NavPoints Je devrais donc être en mesure spécifier directement son chemin de cette manière. Et nous saurons bientôt si cela ne fonctionne pas réellement, car nous allons assister à un crash D'accord. Une fois que nous avons fait tout cela, nous devons ajouter le joueur au terrain de jeu Parce que, si vous vous en souvenez, nous n'ajoutions aucun objet mobile à l'arène, nous les ajoutions à la base du jeu. Je veux dire, nous pourrions les ajouter à l'arène, mais j'aime séparer mes maillages de terrain des objets mobiles C'est pourquoi nous avons un terrain de jeu. Alors oups. Le terrain de jeu est donc le parent du terrain de jeu. Nous avons donc simplement un rôle parent-enfant. Et nous devons le faire avant de tenter de définir la position ou la rotation du joueur. Si nous n'allons pas avoir d'erreur, c'est une erreur que nous ne devons pas ignorer. Ainsi, une fois que le joueur est sur le terrain de jeu, nous pouvons modifier sa rotation et sa rotation sera égale à la rotation des points d'apparition Et la position globale du joueur sera égale à la position globale des points d'apparition Désormais, l'utilisation ou non de la position ou position globale dépend généralement la position globale dépend généralement des systèmes de coordonnées dans lesquels vous travaillez. Parfois c'est important, parfois il n'utilise pas presque toujours la position globale juste pour ne pas avoir de mauvaises surprises. Mais, vous savez, essayons simplement la position et voyons si cela fonctionne réellement. Cela devrait. Maintenant que tout cela est fait, nous pouvons revenir à notre jeu. Et, bien sûr, lorsque le nouveau jeu commence, nous devons réellement faire apparaître le joueur, faire apparaître les ennemis et initialiser un peu plus la configuration avant que le jeu ne avant que le jeu Donc, comme nous avons déjà une référence au joueur dans notre jeu, ce que nous allons faire ici, c'est dire que le joueur est égal à Oh, nous avons un petit problème car nous n'avons pas de référence au générateur. Alors prenons-en un. accord, spater est un nœud, bien sûr Et nous allons commenter tout cela afin de pouvoir réellement attribuer la variable « crier fort ». Allons-y. D'accord, Spanor. Boum. Nous avons maintenant Spawner OK, maintenant nous pouvons revenir en arrière et le faire. Le joueur est égal au spawner Dot. Donc, en fait, avons-nous défini un Nous lui avons donné un nom de classe, n'est-ce pas ? Oui, nous l'avons fait. Revenons donc au script du jeu afin de pouvoir utiliser Autocomplete Spawner n'est pas un nœud. Le spawner est un spawner. OK, maintenant nous revenons ici, Spawner Spawn Et une fois que nous aurons le tank du joueur, nous pourrons connecter tous ses signaux ici. Nous n'avons donc pas besoin de changer l'étiquette des chars des joueurs. Nous l'avons déjà fait, mais nous devons relier ces trois méthodes. Très bien. Et maintenant, nous devrions être en mesure de voir notre joueur au début de la partie . Et nous ne le pouvons pas. C' est donc parce que notre point d'apparition est nul, ce qui signifie que quelque chose s'est mal passé lorsque j'ai essayé d'obtenir le point d'apparition. Voyons donc ce que j'ai fait de mal ici. De retour dans un instant. Et bien sûr, la réponse était que je n'avais pas le bon nom pour le nœud NavPoints de l'arène Donc, dans ma version originale du jeu, je l'avais appelé NavPoints Et donc, bien sûr, c'est là que se trouvait mon cerveau. Mais dans cette version, pour la leçon, je l'avais appelé Path nodes. J'ai donc simplement renommé le nœud, et la vie était belle. Nous avons donc encore une chose à faire sur GameStart pour éviter que le jeu ne plante et ne soit pas en colère contre nous GameStart pour éviter que le jeu plante et ne soit pas en colère contre Il s'agit, bien entendu, de définir la cible de notre caméra espion, car si vous vous souvenez bien, notre mini-carte utilise une caméra secondaire attachée au joueur Donc, comme nous avons retiré le joueur de la scène, nous devons le réajouter à la caméra espion. Donc, la caméra espion c'est que nous n'avons pas référence à la caméra espion parce que nous n'en avons jamais eu besoin auparavant Nous allons donc en ajouter une également. Et si vous vous grattez la tête en vous demandant : Est-ce vraiment si courant d'avoir autant d'exportations dans une classe ? Oui, oui, ça l'est. Dans certains des anciens studios professionnels dans lesquels j'ai travaillé et qui utilisaient Godot Oh, vous seriez surpris du nombre d'exportations que nous avons effectuées, en particulier en ce qui concerne les interfaces utilisateur. C'était à l'époque des trois points O de Godot où il n'était pas possible de glisser-déposer Donc, même si nous avions les variables exportables, nous devions toujours faire comme GetObject basé sur le nœud au-dessus C'était donc en fait encore pire. Il existe d'autres moyens d' accéder directement aux nœuds, exemple en utilisant le nom unique. Mais dans la pratique, j'ai découvert que le nom unique se cassait le plus souvent. est donc le moyen le plus fiable d' obtenir un objet, où qu'il se trouve, car vous allez beaucoup déplacer vos objets, en particulier lorsque vous développez votre hiérarchie . Il n'est donc généralement pas bon d'utiliser chemins d' objets comme nous le faisons avec cette méthode de génération pour obtenir l'objet, car les références aux objets sont mises à jour lorsque l'objet car les références aux objets sont mises à jour lorsque l'objet se déplace, ce qui n'est pas le cas des chemins codés en dur C'est donc généralement le cas du bon outil pour le bon travail. Quoi qu'il en soit, notre espion Cam et moi n'avons jamais vraiment donné de nom de classe au Spicam Allons-y. Jeu. Caméra espion. Jeu. Oh, bien sûr, maintenant que nous avons une erreur, ça va poser problème ? Eh bien, oui, ça va être un problème. Bien, laissez-moi recharger le projet, et je reviendrai dans une seconde OK, grâce à la magie du post-traitement, nous sommes de retour. Nous revenons maintenant au conteneur de ports de sous-visualisation de l'interface utilisateur SpyCam. Nous le faisons glisser ici pour avoir notre SpyCam et nous pouvons les supprimer maintenant Et puis, maintenant que le joueur a été ajouté, SpyCamt Target est équivalent à un joueur, et maintenant tout devrait parfaitement se passer du point de vue du joueur Et ça l'est. Nous avons un joueur. Cependant, je ne suis pas sûr que le joueur apparaisse réellement là où il devrait être OK, alors j'ai commencé à regarder ces deux objets. Eh bien, il y a une façon de le savoir. Si je fais une rotation complète, je peux voir si je suis réellement au coin de la carte, mais ce n'est pas le cas. On dirait que je suis au centre de la carte. Retournons donc dans l'arène, et nous allons vérifier où se trouve le spawn de nos joueurs Et nous l'avons mis là. Vérifiez la transformation. Bien, revenons au générateur. Et au lieu de le positionner, nous le mettrons en position globale. C'est peut-être l'un de ces cas où c'est vraiment important. Oh, je vois le problème. La position globale du joueur est égale à la position du joueur. Il a la même forme que lui-même, comme dirait Shakespeare. Nous voulons connaître la position du point d'origine en plus de la rotation du point d'origine Cela devrait régler le problème. C'est bien mieux. Maintenant, les joueurs sont en fait au bord de la carte, là où ils doivent être. Mais on dirait qu'ils font face dans la mauvaise direction. Très bien, joue à ton spawn. Rotation jaune. Nous voulons qu'il en soit ainsi. C'est probablement dû au fait que la rotation en Y se déroule dans ce sens, mais le réservoir a pivoté latéralement Nous allons donc simplement faire pivoter le réservoir dans le sens opposé. Nous pourrions également inverser le signe de la rotation. Euh, d'accord. Je ne sais pas pourquoi ça ne marche pas. Laissez-le à zéro, disons 180. OK, c'est mieux. Quoi qu'il en soit, tu as compris. Vous pouvez ajouter des données au spawn du joueur afin de modifier le mode d'apparition du joueur Maintenant, le joueur fait son travail. Il peut à nouveau tirer des obus. Mais en fait, en parlant de tirer des obus, nous devons changer une chose, à savoir que lorsque l'obus est tiré, nous l'ajoutons toujours au jeu, mais nous ne voulons pas le faire. Nous voulons l'ajouter à Playfield. Et le terrain de jeu s' appelle Oh, on ne l'a pas fait, euh, hein Nous n'avons pas ajouté de référence au terrain de jeu. Techniquement, nous n'en avons donc pas besoin puisque nous savons déjà que le terrain de jeu existe, nous pouvons donc simplement faire Gende Playfield Ad child, puis ajoutez-le pour placer le shell au bon endroit Mais vous pouvez aussi évidemment exporter une variable de type node , puis y faire glisser le terrain de jeu En fait, ce serait légèrement mieux. Ce serait plus efficace car il y a encore une certaine surcharge lorsque vous obtenez un nœud. C'est ce que nous allons faire. O. D'accord. Et ce n'est pas le bon script. Allons-y. Maintenant, nous devons faire apparaître les chars ennemis Pour ce faire, nous devons savoir combien de chars nous devons faire apparaître Et si vous vous souvenez, nous avons mis une boîte de rotation pour gérer une telle chose dans notre menu de démarrage. Juste ici. Nous devons donc connecter cette boîte de rotation, et nous le faisons en passant sous le conteneur HBox C'est pourquoi vous devez étiqueter vos nœuds de manière plus intelligente. C'est donc ce que je vais faire. Ainsi, chaque fois que vous modifiez la valeur de la boîte de rotation, soit en la saisissant directement, soit en utilisant les flèches, elle déclenche un signal appelé valeur modifiée Nous voulons donc le connecter et nous l'associerons à notre menu de démarrage. Et nous voulons que cette valeur aille pratiquement partout où elle doit aller. Nous allons donc fournir un autre signal dans notre messager. Mais c'est un peu trop verbeux D'accord, et bien sûr, nous devons fournir une valeur du montant que cela a changé à personne qui se connecte à ce signal. Donc, dans notre menu de démarrage, nous descendons ici et nous disons Messenger, et le nombre de spas a changé et nous transmettons la valeur transmise à la méthode. Et nous l'avons mal fait. En fait, il émet, ce que je ne peux pas épeler. Allons-y. Très bien, maintenant, tous ceux qui ont besoin de savoir si le nombre d'apparitions de l'ennemi a changé ou non nombre d'apparitions de l'ennemi a seront abonnés à ce message Et cela inclut bien sûr notre générateur. Donc, prêt, le nombre d'apparitions de Messenger Dot Enemy a changé. Connectez. Et c'est un autre cas où la fonction est si petite que nous pouvons utiliser un Lambda Nous allons donc simplement dire que le nombre de chars ennemis est égal à la quantité Cela signifie que chaque fois que cette valeur change, le générateur en sera informé Maintenant, chaque fois que nous faisons apparaître des chars ennemis, la première chose à faire est fournir deux variables L'un d'eux sera destiné au tank ennemi que nous avons créé. Et ce sera un tank à intelligence artificielle, bien sûr. Ensuite, nous aurons également besoin d'une variable de point d'apparition. Et nous allons avoir besoin d' une variable de point d'apparition car chaque tank sera assigné à un point d'apparition de manière aléatoire sur la carte, exception du point du joueur, évidemment Maintenant, ce serait une bonne idée de mettre cette valeur en cache. Et par là, je veux dire que nous allons devoir dupliquer le tableau de toute façon, mais nous n'avons pas besoin de le récupérer deux fois, même si cela ne sera fait qu'une fois, donc ce n'est pas très inefficace si nous ne le faisons pas oui, nous allons juste le mettre ici Et les points d'apparition seront un ensemble de nœuds à trois D. Et ce sera notre terrain de jeu. Va chercher un parent. Attendez, non, ne devenez pas parent parce que le terrain de jeu est en fait l'arène dans laquelle se trouvent directement les points de navigation Ouais Donc, ce que nous allons simplement faire, c'est obtenir des points Node NAV. Et nous ne voulons pas obtenir le nœud NavPoints lui-même. Ce que nous voulons, ce sont les enfants, c'est-à-dire un ensemble qui inclut tous ces NavPoints Nous voulons donc que les enfants soient dupliqués. Et la raison pour laquelle nous voulons la dupliquer est que nous voulons modifier la liste que nous obtenons, et cela deviendra clair dans un instant. Et nous pouvons probablement aussi faire une prévision ici sous forme tableau Node three D, pas que cela compte vraiment, mais ça devrait aller. D'accord, et nous allons également devoir fournir ce que j' appelle le rappel Je ne sais pas si cela compte techniquement comme un rappel, mais il s'agit essentiellement d'une méthode que nous devons associer à tous les chars ennemis, et c'est, bien sûr, la méthode des tirs d' obus utilisée dans notre jeu Donc, si vous vous souvenez, nous montons ici, chaque char ennemi qui apparaît, ou du moins le char ennemi que nous avons fait apparaître, devait se connecter à la méthode de tir unique du jeu Heureusement pour nous, dans Godot, les fonctions sont des objets, et ce sont des objets de type appelable Nous pouvons donc transmettre la fonction directement ici. Appelons-le donc simplement gestionnaire de shell, je suppose, gestionnaire de shell de type appelable et maintenant nous serons en mesure de le connecter correctement Très bien, nous avons donc nos points d'apparition, et nous avons nos chars ennemis Donc, la première chose que nous allons faire, que nous pourrions le faire d'une manière légèrement différente. C'est peut-être un peu plus efficace de procéder de cette façon, mais nous allons le faire de cette façon quand même Avant de faire apparaître les chars, nous voulons nous assurer que le nombre de chars ennemis que nous allons faire apparaître est inférieur au nombre de NavPoints sur la Et nous aurions également dû plafonner la valeur maximale du spinner, car elle est actuellement fixée à sept Et, je veux dire, nous avons plus de NavPoints que cela, mais que se passerait-il si nous créions une carte contenant moins de NavPoints Et, par exemple, si vous êtes un développeur solo, il est facile de garder ce genre de choses à l'esprit, mais parfois vous avez juste besoin de garanties supplémentaires. Ce serait probablement une bonne idée, par exemple, dès le démarrage du jeu, d'interroger la carte et de définir automatiquement cette valeur. Et plus j' y pense, plus c'est une bonne idée. Voyons à quelle vitesse cela pourrait être fait. Nous avons déjà notre menu de démarrage. Nous avons déjà notre générateur. Alors oui, faisons-le ici. Oh, oui, ils sont accessibles car sinon, nous ne pourrions pas afficher Start ici. Alors, montons ici, et nous allons définir le menu de démarrage. Et nous allons avoir besoin du bon nœud. Nous allons donc avoir besoin du chemin accès au nœud, et nous ne le savons pas. Donc, si nous allons dans le jeu, dans le menu Démarrer, dans la boîte de dialogue, cliquant avec le bouton droit de la souris, où est-il ? Copiez le chemin du nœud. Nous pouvons donc supprimer le menu Démarrer, car c'est là que nous commençons. Menu Démarrer, spin boox et valeur maximale des spin Boxes, la propriété est appelée valeur maximale du soulignement Donc, disons simplement que la valeur maximale est égale à playfield dot get Node Oops Tu l'as déjà mis entre guillemets. J'ai des points comptent pas pour les enfants parce que je vais calculer combien il reste moins un pour tenir compte du nœud joueur, car nous ne voulons pas pouvoir apparaître sur le nœud joueur C'est donc un bout de code long et moche. Vous ne devriez probablement pas faire ça dans un vrai jeu, mais juste pour que les choses soient opérationnelles avec un minimum de douleur, nous allons le faire comme ça. Donc, de retour dans notre générateur, nous avons une erreur. Quelle est notre erreur ? C'est notre erreur car nous n'avons pas terminé cette ligne. Donc, tout d'abord, assurons-nous que cela fonctionne réellement. Et bien sûr, Child Count prend une valeur nulle. Aréna Playfield. Points de navigation. Le problème, c'est que nous avons ici un chemin redondant. Nous n'avons pas besoin de commencer par le terrain de jeu parce que nous sommes sur le terrain de jeu Nous avons juste besoin de points Ana Nav. Maintenant, cela devrait fonctionner. Et nous y voilà. Nous devrions donc maintenant être en mesure de le remplacer par dix, soit le nombre de NAPpoints dont nous disposons Parfait Maintenant, nous ne dépasserons jamais, ce qui signifie que dans le générateur, nous pouvons ignorer cette ligne. Nous n'en aurons pas besoin. Et juste pour que nous puissions valider cela, nous allons simplement le mettre ici pour le moment. Nous voulons donc calculer le nombre de chars ennemis que nous allons faire apparaître C'est ce que nous allons faire avec Tank. Nous allons définir une boucle à quatre boucles. La variable s'appelle Tank index, elle se trouve dans et il existe une fonction très pratique appelée range. Et si nous fournissons la valeur, nous fournissons une quantité singulière en tant que valeur, cela nous donnera un tableau de nombres allant de zéro à ce nombre moins un, ce qui est incroyablement utile pour parcourir des tableaux en boucle Donc, si nos chars ennemis sont réellement égaux à 11, portée nous donnera de zéro à dix, c'est exactement ce que nous voulons. Ou du moins assez près. C'est le bon nombre de valeurs. Donc, le tank ennemi est égal à, et c'est la même chose que nous avons faite pour le joueur. Donc, le préfabriqué des chars ennemis n'est pas instancié. En tant que tank AI. Et, bien sûr, tu dois épeler le mot comme il faut. Je pense que c'est un nouveau record pour moi en orthographiant un mot de deux lettres Hé ! Eh bien, c'est pourquoi je suis informaticien et non professeur d'anglais. D'accord. Et une fois que nous avons un char ennemi, nous devons configurer certains de ses détails. Et, bien entendu, ces détails sont le nom, le nom du nœud et le point d'apparition Et comme nous avons déjà une référence au terrain de jeu, oui, d'accord. Donc, au strict minimum, nous pouvons simplement dire jouer sur un terrain, trouver un parent, ajouter char ennemi enfant, et ce serait génial. Mais cela ne suffit pas. Donc, la première chose à faire, évidemment, c'est de joindre le signal tiré par l'obus à notre appel, puis de renommer le char ennemi Le nom du point du tank ennemi est égal à. Et nous allons l' appeler « sous-marin ennemi ou « ennemi » avec ce jeton. Et, bien sûr, nous avons vu dans une leçon précédente que ce jeton nous permet de remplacer des chaînes de caractères. Donc, puisque nous essayons de le remplacer par un chiffre , en fait, il devrait fonctionner sans lancer de cordes. Essayons-le. Et le nombre d'ennemis est simplement l'indice des chars plus un, parce que nous voulons qu' ils soient compris entre un et un et non zéro. Ensuite, nous allons faire de même pour Well, donc le tank ennemi que nous appellerons tank ennemi avec ça. Mais le nom d'affichage Nous ne serons que le numéro ennemi. Et elles sont arbitraires. C'est juste moi qui décide que c'est ce que c'est. Tu peux en faire ce que tu veux. Et maintenant, bien sûr, nous devons trouver un point d'apparition Mais avant cela, ce serait en fait un peu plus efficace ou du moins plus, je suppose, moins compliqué parce que le générateur et le terrain de ou le terrain de jeu ont exactement le même parent. Nous pouvons donc simplement dire «   avoir un parent, un enfant Bien, maintenant que le tank a été ajouté au terrain de jeu, nous pouvons définir un point d'apparition Et bien sûr, lorsque le tank apparaît pour la première fois dans le monde, sa position est égale au point vectoriel zéro, qui est une constante qui indique que le vecteur est zéro, zéro, zéro Donc, tant que c'est le cas. Donc, tant que position de l'ennemi est égale au vecteur 30, cela signifie qu'elle n'est pas assignée Et ce que nous voulons faire ici, c'est continuer à sélectionner de nouveaux points d'apparition jusqu'à ce que nous en obtenions un valide Et le seul moment où le point d' apparition ne sera pas valide, c'est s'il s'agit du point d'apparition du joueur. Donc, point d'apparition Whoops. Curt Curse que vous complétez automatiquement. Le point d'apparition est égal à, et nous avons déjà notre tableau de points d'apparition Cela équivaut donc à des points d'apparition dont l'indice d'un nombre aléatoire est compris entre zéro et la taille des points d' apparition moins un Cela nous donnera donc n'importe quel indice compris entre zéro et la fin du point d' apparition, car le maximum de points d'apparition ou l'indice maximum d'un tableau est toujours égal à sa taille moins Donc, une fois que nous avons défini un point d' apparition, nous voulons le supprimer du tableau des points d'apparition car nous l'avons déjà sélectionné Nous disons donc simplement points d'apparition, effacons les points d'apparition. Nous voulons l'effacer, qu'il soit valide ou non, car comme nous sommes déjà en train de chercher les chars, fois ce point d'apparition défini, nous allons revenir en haut, créer un nouveau tank, puis choisir parmi les points d'apparition restants Et nous ne voulons pas inclure celui que nous venons de choisir. Donc, si nous supprimons toujours le point d'apparition que nous venons de sélectionner, nous n'aurons jamais de point d'apparition dupliqué. C'est pourquoi nous avons dupliqué le tableau G children du nœud NavPoints car nous allons en supprimer des éléments Et si nous utilisions le tableau original des enfants d'origine, nous supprimerions des points des NavPoints de notre carte, ce que nous ne voulons pas faire Donc, pour quelque chose comme ça, travaillez toujours sur un double exemplaire. Les points d'apparition s'effacent donc. Et nous voulons vérifier le point d' apparition si le nom du point d' apparition est égal au point de départ des joueurs, car je ne m'en souviens pas si c'est le cas ou si c'est le joueur qui apparaît Regardons. Apparition du joueur. Euh, on dit que la mémoire est la première chose qui disparaît quand on vieillit. Du moins, je pense qu'ils le font. J'oublie. D'accord, donc si le nom du point d'apparition n' est pas égal à celui du joueur, alors nous faisons en sorte que la position du tank ennemi soit égale à la position du point d'apparition Et cela devrait nous suffire. Allons y jeter un coup d'œil. Eh bien, en fait, non. Nous ne pourrons pas tester car au début du jeu, nous ne produisons aucun tank Nous devons donc retourner au jeu. Maintenant qu' ils ont été traités, nous pouvons les supprimer. Ensuite, nous redescendons au début du jeu. Nous avons donc créé notre joueur. Nous avons installé notre caméra espion. Maintenant, nous devons demander au générateur de faire apparaître des chars ennemis, et nous devons transmettre la fonction que nous allons attacher, qui concerne, bien entendu, les tirs d' Et maintenant, nous devrions être en mesure de faire apparaître un certain nombre de chars dans notre monde. Commençons par deux et nous avons une erreur. C'est bon. J' essaie d'attribuer un type, bla, bla, bla, tapez Oh, d'accord Le problème ici est donc qu'il essaie d'attribuer un type de nœud de tableau à une variable de type nœud trois D. Nous avons spécifié notre tableau de points d'apparition comme un nœud trois D, mais à cause de la magie du polymorphisme, il essaie en fait de renvoyer un nœud et vous ne pouvez pas le lancer vers le haut Donc, si nous changeons cela de telle sorte que, eh bien, nous n'avons pas à dire qu'il s'agit d'un nœud trois D, nous pouvons le supprimer et nous le remplacerons simplement nœud. Maintenant, essayons à nouveau. Faites apparaître deux chars, lancez le jeu. C'est bon. Nous avons un joueur et deux chars. Et bien sûr, ils se déplacent individuellement. Et comme vous pouvez le constater, Godot s'occupe de la physique pour eux. Vous n'avez donc même pas à vous inquiéter qu'ils se contournent l'un l'autre, même s'ils essaient tous les deux de le faire au même moment, ils vont simplement entrer en collision Nous avons donc un jeu qui fonctionne. La seule chose qui nous manque, c'est une condition de fin de partie, une condition de victoire pour le joueur. C'est donc très facile et rapide à ajouter étant donné tout ce que nous avons déjà configuré. Je vous mets au défi de le faire en complément de cette leçon. Mais vous faites une pause si vous le souhaitez, vous mettez la vidéo , vous l' essayez vous-même, puis vous continuez à regarder la vidéo, et je vais vous montrer comment je l'ai fait. D'accord. Mais avant d'entrer dans le vif du sujet, nous avons un énorme bogue qui doit être corrigé, sauf si vous aimez que votre jeu soit vraiment difficile. Donc, si vous le remarquez ou si vous l'avez peut-être remarqué si vous jouez avec ça, si vous commencez une partie et que vous mourez, puis que vous en commencez une autre, il y aura plus de tanks que vous ne lui avez dit d'apparaître Et c'est parce qu'aucun des objets du jeu précédent n'est supprimé par le générateur avant que nous ne commencions le Donc, le moyen le plus rapide de le faire est soit de demander au sponsor de le faire, soit de laisser le jeu le faire Nous pouvons simplement le faire dans le jeu. C'est assez simple. Tous nos objets, tous nos chars sont donc attachés au terrain de jeu Nous voulons donc passer par le terrain de jeu. Et ce n'est pas ce que nous voulons faire. Donc, quatre enfants sur le terrain de jeu. Trouve des enfants. Cela fera une boucle entre tous les enfants du terrain de jeu et les placera dans la variable child pour que nous puissions faire quelque chose avec Et tout ce que nous avons à faire, c'est de voir si l'enfant fait partie du groupe vendable, car nous mettons tous les objets qui peuvent être retirés du jeu dans ce groupe car ils peuvent être détruits Donc, si child point est dans le groupe, Shellable child point free. Et cela devrait régler notre problème. C'est bon. Maintenant, configurons notre jeu en fonction des conditions. La première chose à faire est donc suivre le nombre de chars qui ont été tués par rapport au nombre de chars qui restent. Et le moyen le plus rapide et le plus simple d'y parvenir est de revenir sous l'interface utilisateur, car celle-ci enregistre déjà le nombre de victimes nous suffit donc Il nous suffit donc de suivre la valeur du générateur. Et le moyen le plus simple de le faire est d'ajouter une autre variable appelée Kill count target. Qui est également un entier. Et comme nous avons déjà configuré le signal, nous pouvons simplement vérifier si le nombre d'apparitions de l'ennemi a changé Et encore une fois, nous pouvons utiliser une fonction Lambda, qui indiquera simplement que le nombre de victimes cibles est égal au nouveau montant Et maintenant, chaque fois que le nombre de victimes change, nous voulons vérifier cette valeur. Et si le nombre de victimes est égal à cette valeur cible, alors nous avons gagné. De toute évidence, nous allons changer cela dans un instant. Mais la prochaine chose que nous devons faire, évidemment, est de fournir un état de fin de partie au joueur qui a gagné, et nous devons également être en mesure de signaler au joueur qu'il a gagné. Nous allons donc changer un peu les choses. Nous avons également un vieux bogue. Je vais voir si je peux le trouver. Le problème, c'est que chaque fois qu'un char est touché, qu'il ait été détruit ou non, il émet le signal de destruction du char ennemi, ce qui est dommage car cela signifie que vous pouvez simplement continuer à accumuler des victimes en tirant sur le même char Donc, si nous retournons à notre carapace, si le corps est en groupe et que le corps n'est pas détruit, alors nous pouvons appeler « hit hit Pour indiquer que l' obus a touché le réservoir. Je veux dire, ça frappe quand même. C'est un peu un abus de langage, je suppose. Il est déjà en train de vérifier et de tirer s'il y a une collision. C'est juste que c'est essentiellement la comptabilité qui a lieu lorsque le tank est touché Et nous n'avons pas à le refaire encore et encore si le char a déjà été détruit. Cela va donc résoudre ce problème. Il ne reste plus qu'à aj 32. Angles de caméra multiples: Mm. Bon retour. Nous allons envisager de créer un système de caméra dynamique, ou je pense que la meilleure façon de le dire serait un système à caméras multiples. donc arrivés au point où nous avons étendu les fonctionnalités de nos chars suffisamment étendu les fonctionnalités de nos chars pour qu'un simple char ne soit plus car nous voulons ajouter un système de caméra à notre char, mais nous ne voulons pas l'ajouter au char ennemi dérivé d'un tank. Nous allons donc devoir créer une nouvelle scène héritée, et nous allons hériter de Tank et nous allons enregistrer celle-ci , et nous allons l'appeler joueur tank et joueur tank c' est, eh bien, nous devons revenir à notre générateur et mettre à jour notre préfabriqué de tank joueur pour qu'il utilise réellement le tank joueur au lieu jour notre préfabriqué de tank joueur pour qu'il utilise réellement le tank joueur au du tank maintenant Et pour le moment, rien ne va changer parce qu'ils appartiennent exactement à la même classe. Mais dans le tank des joueurs, nous voulons ajouter un appareil photo. Nous avons donc notre appareil photo tridimensionnel existant , mais nous en voulons plus. Nous allons donc revenir ici et nous allons changer ou plutôt nous allons ajouter un nœud, et ce sera un nœud trois D. Nous allons l'appeler. Caméras. Et nous allons déplacer la caméra existante sous les caméras, mais ça ne marchera pas. Et il y a une raison à cela. Nous allons donc simplement ajouter des caméras supplémentaires directement ici au lieu de nous soucier de le rendre sophistiqué et d'ajouter un équipement supplémentaire. Puis-je renommer l'appareil photo ? Non. OK. Et tout cela a du sens. Vous ne voulez pas, vous ne pouvez pas réellement modifier les informations sous-jacentes du nœud. Donc c'est bon. Nous allons donc simplement ajouter quelques caméras supplémentaires. Eh bien, j'ajoute trois autres caméras D. Et ce nom donnera un nom à ou plutôt, nous allons donner un index deux supplémentaire. Nous avons donc obtenu la caméra trois D deux et la caméra trois D trois. Donc, caméra trois et deux, j'ai toujours voulu avoir une caméra sur la tourelle pour que vous puissiez voir où la caméra tourne réellement, même si cela ne nous fera pas vraiment de bien, n'est-ce En fait, non, nous pouvons associer la caméra à la tourelle Nous l'avons fait avec le marqueur trois D plus tôt. Ajoutez-y donc la caméra 3D. Ensuite, nous nous assurerons qu'il est orienté dans la bonne direction. Oui, ça a l'air bien. Aperçu. Oh, c'est à l'envers. Et pour info, c'est à cela que sert cette flèche violette pour vous indiquer l'orientation correcte du réservoir. Donc, dans ce cas, nous voulons qu'il soit à zéro. Maintenant, nous pouvons voir notre tourelle sur notre tourelle. Et nous voulons que le troisième soit, disons : « Eh bien, c'est bon où il est. C'est une caméra arrière. Et en fait, tu sais quoi ? Nous pouvons ajouter , nous devrons donc le faire légèrement différemment de la façon dont je l'avais initialement prévu. Mais ajoutons un nœud au lieu d'un nœud en trois D, et ce sera un appareil photo. Et il y aura littéralement un script avec des références à nos caméras existantes. Et pour le moment, nous ne créons pas de nouveau nœud. Nous ajoutons un script. Et nous allons exporter des caméras de voiture. Et les caméras seront un ensemble de caméras à trois D. Et oui, cela aide si vous n'ajoutez pas votre propre petite notation stupide Bon, maintenant nous avons un tableau, et nous pouvons indiquer la taille du tableau. Nous avons donc trois caméras au total. Un, deux, trois. Nous pouvons maintenant faire glisser les références à nos caméras existantes dans cette matrice. Et tout ce dont nous avons besoin, c'est d'une méthode unique capable de traiter les entrées clés non gérées Et nous allons vérifier si une, deux ou trois touches ont été pressées. Et si c'est le cas, nous passerons à la bonne caméra. touche physique est-elle enfoncée. Clé numéro un. Et nous allons créer une méthode appelée switch to camera, et nous allons lui fournir le bon index. Donc, dans ce cas, nous pouvons l'appeler, nous pouvons utiliser le même index que la caméra, mais nous allons devoir changer les indices car il va être décalé d'un. Ensuite, nous ferons simplement autre chose. Mm. En fait, choisissons-y un LF. F. Très bien. L F. Caméra 1, Caméra 2, Caméra 3, Caméra 3. Et nous avons un identifiant redondant là-dedans. Supprimer. D'accord. Et bien sûr, nous n'avons pas besoin de passer à la caméra. Tellement funk Whoops Et c'est assez simple. Tout ce que nous avons à faire, c'est de dire «  caméra index » moins un, parce que nous devons compenser le fait que les indices commencent à zéro, mais nous partons de un ici, et nous pourrions tout aussi bien porter ce chiffre à zéro. Je veux dire, non, pourquoi pas ? C'est moins confus comme ça, je suppose. OK. Le courant est égal à vrai. Et comme Godot ne se souciera que de la dernière caméra réglée sur courant, nous ne devrions pas avoir à soucier de savoir quelle caméra est à jour Voyons donc si cela fonctionne réellement. Et si ce n'est pas le cas, nous apporterons quelques modifications. Game Player Et voilà. Nous disposons désormais d'un système multi-caméras. Et c'était vraiment facile. OK, nous avons fini de coder pour le moment, alors passons au chapitre suivant, et nous allons commencer à parler des améliorations graphiques. Nous allons revoir les matériaux et examiner les maillages et toutes ces autres bonnes choses On se voit là-bas. 33. De meilleures explosions avec des effets de particules: Bon retour. Dans cette leçon, nous allons remédier au fait que lorsqu'un tank est abattu, il s'arrête en quelque sorte. Il se trouve juste là. Ça fait du bruit et c'est vraiment ennuyeux. Nous allons donc embellir explosions de nos réservoirs avec des systèmes de particules L'avantage des systèmes de particules, c' est qu'ils ont l'air compliqués à première vue, mais une fois que vous aurez appris une ou deux astuces à leur sujet, vous pourrez jouer avec eux à votre guise sans même vraiment comprendre quoi servent la grande majorité de leurs fonctionnalités. Et comme tout est mis à jour en temps réel dans la fenêtre de GadoEditor, vous pouvez simplement jouer avec tous les paramètres, et lorsque vous obtenez quelque chose que vous aimez, vous pouvez vous en servir Un système de particules est donc un nœud, comme n'importe quel autre nœud de GADO Nous allons donc ajouter une nouvelle scène. Nous allons sélectionner un autre nœud, et nous allons utiliser les particules GPU Three D. Maintenant, il y a une différence entre les particules GPU et les particules CPU. Les particules du GPU sont traitées sur votre carte graphique dans votre GPU. Les particules du processeur sont traitées par le processeur principal de votre ordinateur. La différence entre les deux est que les particules du GPU sont plus performantes sur un système accéléré en trois D. De plus, et c' est un peu quelque chose qui se passe dans les coulisses, l'équipe Godot laisse de côté les particules du processeur , dans le sens où elle ne les priorise pas par rapport aux particules du GPU Ils n'y ajoutent donc aucune nouvelle fonctionnalité, mais ils sont prêts à laisser utilisateurs le mettre au même niveau que les particules du GPU. Donc, en gros, optez pour les particules du GPU à moins qu'elles ne fonctionnent tout simplement pas sur le matériel que vous essayez de cibler. C'est une bonne règle de base. Créons donc un nouveau GPU (particules en trois D), et bien sûr, cela ne fait rien. Parce que nous n'avons encore rien configuré. Donc, les deux choses principales, et vous verrez un peu, vous verrez un avertissement et vous verrez une erreur ici. Il indique que rien n'est visible car maillage n'a été affecté aux passes de dessin et aucun matériau n'est attribué pour traiter les particules Aucun comportement n'est donc imprimé Cela signifie que nous devons attribuer ces deux éléments pour nos particules puissent faire quoi que ce soit. La première chose que nous allons ajouter, ce sont les passes de tirage. Le tirage passe, et vous devez en ajouter au moins un pour déterminer l'apparence de vos particules. Nous devons donc lui donner un nouveau maillage quelconque. Et nous allons utiliser des particules texturées bitmap Allons-y donc avec un quad mesh. Et maintenant, vous pouvez voir que nous avons en fait une particule ici. En fait, nous avons un tas de particules ici, mais comme elles n'ont aucun comportement, elles ne bougent pas réellement. Notez également que j'ai réorganisé le projet. J'ai apporté deux modifications au projet dans cette leçon Je l'ai réorganisé de manière à ce que nous ayons un tas de sous-dossiers, nous en arrivons au point où nous allons ajouter beaucoup plus de ressources à notre projet, et nous ne voulons pas que les choses s'encombrent J'ai donc mis toutes les polices, les graphismes, les scènes et les effets sonores dans leurs propres dossiers. En parlant de cela, j'ai ajouté quelques textures de particules au projet pour que vous puissiez les utiliser lorsque vous créez vos propres systèmes de particules. Ils sont tous disponibles gratuitement sur opengameart.org Il existe d'autres endroits où vous pouvez les obtenir sur Internet ou même créer les vôtres si vous le souhaitez. Une fois que nous avons cliqué sur la passe et le maillage et que nous l'avons étendu, nous avons désormais la possibilité de modifier son apparence, comme nous le ferions pour les autres maillages avec lesquels nous avons travaillé En fait, comme vous pouvez le constater, nous pouvons utiliser n'importe quel type de maillage que nous voulons. Donc, si nous voulions une boîte, une capsule ou autre, pour donner un aspect plus tridimensionnel à nos particules, nous pourrions le faire. Mais nous allons opter pour un quad mesh, puis nous devons fournir un matériau, et nous devrions être des experts en la matière à ce stade. Nous allons donc utiliser un nouveau matériau standard, et nous pouvons l'ouvrir. Il existe maintenant un certain nombre de réglages supplémentaires pour un matériau particulaire par rapport aux matériaux ordinaires. Et il existe également quelques commutateurs supplémentaires qui, si vous ne les actionnez pas, les trois quarts des réglages de votre système de particules ne fonctionneront pas, et vous passerez deux ou trois heures à vous cogner la tête contre le mur en vous demandant pourquoi aucun de vos réglages n'est effectué Et je ne parle certainement pas par expérience sur ce point. Donc, la première chose que nous allons faire est d'aller à Albedo, bien sûr, et nous allons ajouter l'une de nos textures Je vais donc vous montrer comment créer deux systèmes de particules différents, un système explosif et un système constant. J'ai également fourni le système de particules que j'ai créé pour le réservoir et que j'ai fixé au réservoir dans le cadre de ce projet. Vous pouvez donc suivre cette leçon pour voir comment fonctionnent tous ces paramètres, puis vous pouvez essayer de créer les vôtres, puis vous pouvez également inspecter ceux que j'ai créés pour le tank. Je vais également vous montrer comment utiliser les scripts pour déclencher les explosions ou utiliser script GD pour déclencher les explosions à la fin de la leçon Maintenant que nous revenons ici, nous avons encore une fois besoin d'une texture. Ce sera donc une sorte de feu, oui, sorte de texture ardente ou plutôt un système de particules enflammées Nous allons donc utiliser la texture Explosion Oh Eight et l' intégrer ici. Maintenant, comme vous pouvez le constater, il n'y a pas de transparence Nous devons donc permettre la transparence. Et nous devons également étendre la couleur des sommets, et nous devons cliquer et activer l'option Utiliser comme albédo Et c'est ce qui nous permet de changer les couleurs la transparence et toutes ces bonnes choses de notre texture. Et comme il s'agit d'une texture en trois D, mais que nous utilisons une texture, vous pouvez constater que lorsque vous faites pivoter, la texture s'incline et disparaît parce qu'elle est mappée sur un objet dans un espace en trois D. Donc, pour changer cela, nous devons afficher la texture, et nous allons activer le panneau d'affichage à particules Et ce que cela fait, c'est que la texture nous fait toujours face quelle que soit l'orientation de la caméra. Et dans ce cas, c'est exactement ce que nous voulons. Et nous avons également besoin d'un puits, nous n'en avons pas besoin, mais ce serait une bonne idée cliquer sur conserver l'échelle de cette façon, si nous voulons modifier l' échelle des particules, nous faisons très probablement, ce que nous faisons très probablement, cela permettra également à cela de se produire. Si ce n'est pas le cas, et si nous avons modifié l'une des courbes d'échelle, rien de tout cela ne prendrait effet. Très bien, nous avons donc du matériel. Nous avons un laissez-passer. Nous passons maintenant au matériel de traitement. Le matériau de traitement détermine ce qu' il advient réellement des particules au fil du temps et bien d'autres choses Nous avons donc besoin d'un nouveau matériau pour le traitement des particules. Maintenant que nous en avons une, vous pouvez voir par défaut nos particules apparaissent et tombent vers le bas Et cela s'explique par le fait que la fonctionnalité par défaut du traitement des particules consiste simplement à consiste simplement à appliquer la gravité et à arrêter. Mais ce n'est pas ce que nous voulons. Ce que nous voulons réellement, c'est deux choses. Revenons donc à la section 3D des particules du GPU, et nous allons continuer à émettre pour le moment. Mais ce que nous allons faire un jour, c'est activer un seul tir, car un seul tir signifie essentiellement qu'un ensemble de particules va émettre, et puis ce sera tout. C'est exactement ce que nous voulons pour une explosion. Nous allons donc le désactiver pour le moment , juste pour voir ce qui se passe. Ensuite, il y a ce que l' on appelle l'explosivité, et c'est exactement ce qui est écrit sur la boîte Plus il est explosif, plus les particules apparaîtront instantanément Et c'est assez difficile à voir en ce moment parce que, encore une fois, ils apparaissent tous à la même vitesse et ils sont tous affectés par la même direction Augmentons donc le nombre de particules à 25. Et l'explosivité, c'est bien, et le hasard ne doit pas nous inquiéter Si nous n' utilisions pas l'explosivité, aléatoire déterminerait le caractère aléatoire de la fréquence d'émission des fréquence d'émission Nous n'avons donc pas à nous soucier des collisions, des tracés ou des traînées. Ce sont des options sophistiquées que nous n' allons pas aborder. Donc, normalement, les particules n'entrent pas en collision avec l'environnement. Si vous le vouliez, vous devrez ajouter un nœud spécial appelé collisionneur de particules GPU à votre système de particules Et cela est lié à cela. Et nous n'avons pas du tout besoin de nous soucier du dessin. L'un des avantages des systèmes de particules, c'est qu' ils sont extrêmement ringards et qu'il existe de nombreux paramètres dont vous n' aurez jamais besoin à moins savoir absolument que vous en aurez besoin. Donc, si vous regardez un paramètre en particulier, vous vous demandez pourquoi je l'utiliserais ? Alors tu n'es pas obligée. C'est génial Ainsi, dans le cadre du traitement des matériaux, c'est là que nous pouvons commencer à faire agir nos particules. Nous passons donc sous le drapeau des particules. Et nous n'avons pas vraiment à nous soucier de tout cela. Ils dicteront donc la manière dont la particule s'aligne dans ses différentes directions Nous pouvons également ajouter un amortissement sous forme de friction, ce qui ralentit les particules au fil du temps jusqu'à ce qu'elles s'arrêtent La vitesse et l'affichage de la vitesse d'apparition sont parmi les trois plus intéressants Donc, si nous passons en position, vous pouvez voir que nous avons la possibilité de définir la forme à partir de laquelle les particules apparaissent heure actuelle, ils partent d'un point, ce qui signifie qu'ils apparaissent tous exactement au même point dans le monde, mais nous pouvons le modifier pour qu' ils apparaissent dans une sphère ce qui signifie qu'ils apparaissent tous exactement au même point dans le monde, mais nous pouvons le modifier pour qu' ils apparaissent Maintenant, vous pouvez le voir apparaître dans une zone circulaire ici, et nous pouvons modifier la taille de la sphère pour obtenir des particules beaucoup plus étalées ou une boîte, etc., et ainsi de suite, même un anneau La bague peut être amusante, surtout pour le feu. est un peu difficile, puis vous pouvez changer l'axe de l'anneau pour changer la taille de l'anneau, la hauteur de l' anneau, le rayon de l'anneau, l'erratus de l'anneau Oui, je ne sais pas si je veux vraiment le faire. Laissons les choses comme un. Ensuite, nous avons l'angle et la vélocité, et ces deux éléments sont extrêmement importants. Vous allez donc vous habituer à ce contrôle dans Gadot moins lorsque vous utiliserez les systèmes de particules C'est le seul endroit où je l' ai vu utilisé dans Gdo, et il fournit essentiellement une gamme que vous pouvez étendre en faisant glisser ces petites choses en particulier C'est le mot que je recherche. Et vous pouvez également modifier l'ensemble de la plage elle-même en cliquant et en faisant glisser le pointeur sur le rectangle Et cela indique la plage, minimale et maximale que peuvent avoir les différents paramètres. Ainsi, dans le cas d'un angle, lorsqu'une particule apparaît, elle peut avoir un angle compris entre cette valeur et cette valeur Mais nous ne voulons pas être aussi particuliers ou fous, alors définissons-le simplement de 0 à 360, et c'est très bien Cela signifie que la particule peut potentiellement apparaître dans n'importe quelle orientation angulaire Ce qui est amusant, c'est la vélocité. La vélocité détermine la vitesse à laquelle vos particules vont exploser à partir de l'endroit où elles se trouvent, et la propagation détermine leur direction Dans un angle autour de lui. Donc, si vous voulez un objet qui ressemble plus à une fontaine , vous réduirez l' écart, et si vous voulez un objet qui ressemble plus à une explosion, vous pouvez l'augmenter. Malheureusement, pour le moment, cela ne ressemble à rien car, encore une fois, nous n' avons aucune vélocité. Ajoutons donc un peu de vélocité. Faisons en sorte que notre vitesse soit égale à deux. Maintenant, vous pouvez voir que nous en avons un peu plus. Et maintenant, si je devais modifier l'écart, vous verrez qu' ils explosent dans un angle plus large OK, donc nous ne voulons pas que nos particules descendent parce que ce n'est pas ainsi que fonctionne une explosion. C'est donc sous-animé ? Non, il est en phase d' accélération. OK. Donc, pour empêcher les particules de simplement tomber vers le bas, nous devons désactiver la gravité. Et la gravité subit des accélérations. Et comme vous pouvez le constater, il est déjà réglé à moins 9,8, ce qui correspond, bien entendu, à la gravité de la Terre qui tire vers le bas Si on le met à zéro, Boom. Nous avons maintenant des particules qui explosent dans n'importe quelle direction. Vous pouvez maintenant voir comment le spread fonctionne un peu mieux grâce au fait que la gravité est désactivée. Nous allons donc le laisser à 180, et maintenant nous avons une explosion qui se propage vers l'extérieur Cependant, les particules elles-mêmes ne sont pas très belles. Nous avons donc deux problèmes. L'explosion disparaît trop rapidement, alors augmentons la durée de vie de chaque particule à 2 secondes. Et un autre avantage de ce système est que presque toutes les propriétés d'un système de particules, ainsi que toutes les propriétés qui existent dans Godot en général, ont une infobulle très instructive Donc, si vous ne savez pas à quoi sert un paramètre en particulier, simplement le curseur dessus et il vous le dira Malheureusement, lorsque vous commencez à vous lancer dans ce genre de choses, vous n'obtiendrez rien. Cela va simplement dire que cette propriété ne peut être définie que dans l'inspecteur. Eh bien, je suis inspecteur, alors laissez-moi m'en occuper. Donc, il faut en quelque sorte jouer avec certains d'entre eux. Mais Godot possède en fait une documentation incroyablement bonne sur les systèmes de particules, et je vais la relier aux documents supplémentaires de ce cours Nous avons donc la gravité, et nous avons également la possibilité de modifier les accélérations linéaires radiales et tangentielles des particules, mais nous ne les utiliserons pas Cependant, nous le pourrions. Nous pourrions simplement augmenter cela, et cela changerait la façon dont les particules accélèrent réellement. Je ne sais pas, j' aime bien celui-ci. Laissons les choses comme ça. L'accélération radiale détermine essentiellement la façon dont les particules accéléreront à partir de leur rayon, ce qui n'a pas beaucoup de sens à moins de la voir en action. Alors, c'est ici. Et augmentons un peu l'amortissement pour voir ce qui va se passer En gros, l'amortissement ralentira progressivement vos particules jusqu'à ce qu'elles s'arrêtent Oui, je ne suis pas fan, pas fan de ça, en fait. Je vais arrêter l'humidification. Hausse. Maintenant, le plus amusant, c'est l'affichage. L'affichage vous permet de modifier et peaufiner l'apparence générale de vos particules Je vais donc vous montrer comment fonctionnent essentiellement les courbes de couleur et les échelles, puis vous pouvez les appliquer à la majeure partie de toutes les autres. Ainsi, d'une manière générale, les particules seront contrôlées par une gamme individuelle. Dans ce cas, l'échelle signifie l' échelle littérale de la texture Donc, si nous soulevons ce point, alors une partie du Whoo, c'est trop gros. Certaines particules peuvent être plus grosses que d'autres car elles apparaîtront avec une valeur d'échelle comprise entre cette valeur et cette plage Faisons donc en sorte que ce soit 0,25. Alors maintenant, nous pouvons en avoir de plus petits. Peut fleurir. Ensuite, nous avons aussi ce qu'on appelle une courbe, et les courbes sont amusantes. Ce n'est pas très illustratif de faire la courbe d'échelle, je vais donc vous montrer la couleur Je vais vous montrer les courbes de couleurs. Plus précisément, la courbe Alpha. Et encore une fois, rien de tout cela ne fonctionnera moins que vous n'activiez la couleur de l'albédo ou que vous n'utilisiez un albédo et la couleur du sommet dans les paramètres du matériau Donc, si nous passons à la courbe Alpha, nous pouvons sélectionner une nouvelle texture de courbe. Et, bien sûr, pour une raison ou une autre, mon inspecteur fait défiler la page jusqu'en haut chaque fois que je développe l' mon inspecteur fait défiler la page jusqu'en haut chaque fois que je développe l'un de ces éléments Je ne sais pas pourquoi. Mais ensuite, si nous cliquons dessus, nous avons maintenant la possibilité de définir une courbe. Donc, si vous remplacez cela par une nouvelle courbe, nous avons maintenant une courbe, et nous cliquons sur une courbe, et nous pouvons voir la courbe. Au fil du temps, le réglage normal de la texture pour cette valeur sera multiplié par la valeur de cette courbe. Maintenant, bien sûr, étant donné que je viens d'ajouter une courbe, vous ne pouvez plus voir mes textures parce qu'elles sont toutes multipliées. L'Alpha est multiplié par zéro pendant la durée de vie de la texture, et ce n'est pas ce que nous avons fait. Si nous le faisons glisser jusqu'à un, nous revenons à ce que nous étions avant, ce qui signifie que l' alpha de base de la texture, qui est, bien sûr, un, est multiplié par, encore une fois, un au cours de la durée de vie. C'est donc ici que tout commence. C'est là que naît la particule. C'est là que la particule meurt. Il n'y a aucune métaphore là-dedans. Donc, si nous changeons cela, si nous cliquons ici et que nous ajoutons un autre point, puis que nous le faisons glisser vers le bas jusqu'à zéro, vous pouvez maintenant voir qu'au fil du temps, les particules disparaîtront. Ainsi, au cours de leur durée de vie, l'Alpha diminuera progressivement jusqu'à ce qu'il disparaisse. Et nous pouvons même ajouter des points. Donc, ce que j'aime faire pour que les textures n' apparaissent pas si rapidement, c'est de ramener ma valeur initiale à zéro, puis de faire glisser ce point central jusqu' ici pour qu' elles s'estompent au fil du temps, puis qu'elles s'estompent progressivement au fil du temps. Et c'est vraiment chouette. Et vous pouvez même le faire avec les couleurs. Donc, si vous voulez changer la couleur de la texture, vous pouvez ajouter un puits, vous devez ajouter un dégradé au dégradé de couleurs. Faisons donc en sorte que les dégradés soient légèrement différents des courbes Mais bon nombre de ces fonctionnalités sont dotées de courbes. Comme vous pouvez le voir ici, nous avons une courbe angulaire et ainsi de suite. Alors d'accord, fermons-le. Où en étions-nous ? OK, nous avons un dégradé de couleurs. Boum, nous l'ouvrons, et maintenant nous avons un dégradé. Et si vous n'avez jamais travaillé avec des dégradés dans Godot auparavant, vous pouvez simplement ajouter des points dans le dégradé, et nous allons le faire, puis modifier la valeur, la valeur de couleur à chaque point, afin que les couleurs se mélangent harmonieusement entre elles sur toute la distance du Ici, nous avons du noir à une extrémité et du blanc à l'autre, ce qui nous donne une belle touche de propriété. C'est pourquoi vous pouvez maintenant constater que la texture commence par devenir noire, puis passe au blanc au cours de sa durée de vie Ajoutons donc quelques points supplémentaires ici, et nous double-cliquons sur celui-ci. Et je n'ai fait que cliquer ici avec le bouton gauche de la souris pour ajouter ces points. Maintenant, si je change ce noir pour dire jaune, cela signifie que la texture commencera au jaune puis se fanera pour devenir un peu noirâtre. Et puis changeons cela en orange en orange vif. Et puis celui-ci est passé au rouge. Maintenant, vous pouvez voir que les textures sont en fait en commençant par une teinte jaune, puis en passant à une teinte orange , puis en passant à une teinte rouge, puis en fait en commençant par une teinte jaune, puis en passant à une teinte orange , puis en passant à une teinte rouge, puis en passant à la couleur d'origine de la texture Maintenant, pour une explosion, nous n'avons pas vraiment envie de le faire, mais si nous faisions du feu, ce que je vais vous montrer dans un instant, quelque chose comme ça s'avère très pratique. C'est donc en fait une texture un peu pourrie pour une explosion Alors laisse-moi t'en donner une meilleure. En fait, j'ai réussi à trouver quelques réglages pour que cette bouffée ressemble un peu à une véritable explosion, mais cela a pris une éternité, et je ne me souviens pas quels sont les réglages Euh, je pourrais les vérifier, mais il vaudrait mieux que je change le matériau parce que je veux vous montrer nous allons transformer celui-ci en fumée et ensuite je ferai l'explosion. Nous allons donc modifier à nouveau la texture. Changeons-le en fumée noire. Oups, il faut d'abord l'ouvrir. Nous y voilà, matériel. Texture fumée noire. Boum. Et nous allons effacer cela en allant simplement dans le menu déroulant et en appuyant sur Effacer. Nous allons passer aux courbes Alpha. Nous allons désactiver l'explosivité. Nous augmenterons le montant à environ 1:50 et nous changerons l'angle d'écart à 20, et nous changerons la direction de X à zéro à Y un, ce qui signifie que maintenant il va augmenter Nous avons donc maintenant de belles particules de fumée furieuses. Ils augmentent un peu trop. Passons donc à la vitesse initiale de 0,5. À quoi ça ressemble ? C'est en quelque sorte mieux. Oh. OK, ça pourrait être pire. Pas mal Et maintenant, nous allons en faire une deuxième qui est un peu explosive. Et je vais vraiment m' en occuper. Non, non, je ne le suis pas. Je vais ajouter un nœud enfant, et je vais ajouter un nœud en trois D parce que c'est ainsi que j'ai créé le système de particules d'origine. J'avais donc un nœud en trois D, et oups. Tu ne peux pas le faire de cette façon. Ce que vous devez faire c'est changer ce numéro. Nœud 3 D, cliquez avec le bouton droit de la souris sur Make scene root. Allons-y. Cela les renverse. Maintenant, nous ajoutons un afin que celui-ci soit toujours actif. Ensuite, nous ajoutons un autre système de particules GPU. Et celui-ci va produire des débris en cas d'explosion lorsque le réservoir explosera Nous pouvons donc revenir dans le temps, et nous finirons par prendre une photo. Mais nous voulons que notre explosivité soit réduite à un. Nous voulons le désactiver pour le moment afin de pouvoir voir ce que nous faisons. Le hasard, c'est bien. Ensuite, bien entendu, nous avons besoin d' un autre matériau de traitement et d'une passe de tirage avec un nouveau matériau. Nous allons utiliser ce matériau comme un prisme parce qu'il ressemble à des éclats d'obus Nous allons donc changer ce à quoi ça ressemble. Nous allons réduire la taille juste pour que ce ne soit pas un bloc géant. Alors, bien sûr, nous avons besoin d'un matériau. Maintenant, dans ce cas, nous n'allons pas utiliser de transparence, de couleurs délirantes ou quoi que ce soit d'autre, nous utilisons simplement un albédo Je ne vais pas lui donner de texture, mais je vais le rendre gris pour qu'il ressemble à un morceau de métal lancé par le tank, sans qu'ils aient besoin d' un panneau publicitaire ou quoi que ce soit Passons maintenant à notre processeur de particules. Les drapeaux de particules sont bons, position d'apparition. Nous les ferons émettre à partir d'un point. L'angle va être une bonne question, en fait. Quel sera l'angle ? Eh bien, la direction sera à nouveau ascendante. Et nous allons faire un spread d'environ 75. Et donnons-lui une vitesse initiale. Disons la vélocité. Nous ne voulons pas qu'aucun d'entre eux n'ait de vélocité. Alors passons de 5 à 20. Et maintenant, sans aucun changement, nous avons en fait une explosion plutôt décente. Nous allons donc légèrement modifier cela. Nous voulons en modifier les angles potentiels. Nous allons donc passer à 0-360. Ainsi, chaque fois qu'ils apparaissent, ils apparaissent sous un angle aléatoire Et nous pouvons aligner l'axe Y de la particule sur sa direction, ce qui est également très cool. En fait, maintenant, ils se retournent en plein vol, en quelque sorte. D'accord, donc si je recommence à émettre et que j' active un seul shot, vous pouvez voir que l'émission sera désactivée. Et c'est parce qu'un one-shot est exactement ce que cela signifie. Il s'agit d'un one-shot. Augmentons le nombre de particules ici. Boum. Allons-y. Maintenant, un one-shot va littéralement déclencher toutes ses particules en une seule fois , puis arrêter. Donc, si vous indiquez, disons, 200 particules ici, et que l'explosivité n'est pas réduite à une seule comme je le fais, cela produirait simplement ces 200 particules, une, deux, trois, quatre, cinq, six, sept Et puis, une fois qu'ils auraient tous terminé, ce serait fini. l' explosivité augmente, comme nous l'avons fait, ils tirent tous en même temps, puis ils ne tirent plus. C'est donc ce qui va nous permettre en mélangeant tous ces différents effets ou ces différents systèmes de particules, c'est ce qui nous permet de créer des effets d'explosion. Alors laissez-moi vous montrer celui que j'ai fait pour le tank. Donc, en émettant, voici l'explosion initiale, Kaboom. Et puis voici les débris. Oups. Kaboom. Littéralement celui que je viens de te montrer. Fumez également de la même manière. Et puis j'en ai ajouté un pour le feu qui n'a pas vraiment de texture. Ce ne sont littéralement que des particules carrées. Et c'est parce que je n'ai pas une texture de feu décente sous la main. Quoi qu'il en soit, je les ai tous désactivés parce que nous voulons qu' soient tous activés et fassent leur travail que lorsque le char explose J'ai donc ajouté ce système de particules à mon tank, et dans le script du tank dans notre fonction hit, je trouve une référence aux particules de l'explosion, les enfants parce que nous voulons les enfants, qui sont les véritables systèmes de particules et non le nœud lui-même. Ensuite, nous passons en revue chaque enfant et nous disons qu'il émet une propriété qui devient vraie. Et puis une fois que nous l'aurons fait, nous aurons une belle explosion. Et je vais vous montrer à quoi ça ressemble en action parce que je l'adore vraiment. Ajoutez donc quelques ennemis supplémentaires, sinon nous ne pourrons pas vraiment assister à l'explosion avant la fin du jeu. Alors maintenant, si je surprends ce type ici, c'est très chouette. Et c'est bien plus gratifiant que de simplement regarder les chars s'arrêter. Et maintenant, il va brûler et fumer pour l'éternité, au moins jusqu'à la fin du jeu. OK, c'était des systèmes de particules. Et dans la prochaine leçon, nous allons faire une autre plongée en profondeur ou une meilleure plongée dans ou une meilleure plongée dans les matériaux pour que nos réservoirs n'aient pas l'air si plats. Je t'y verrai. 34. Re-texturer vos réservoirs : matériaux revisités: Bon retour. Dans cette leçon, nous allons examiner les options supplémentaires qui s' offrent à vous lorsque vous créez un matériau pour les différentes parties de votre réservoir ou pour tout autre maillage ou matériau disponible dans votre projet. J'ai fourni tous les fichiers pertinents dans le fichier de projet dans le répertoire graphics slash Metal Textures, mais je fournirai également des liens dans les documents supplémentaires ce cours afin d'en obtenir les documents supplémentaires de ce cours afin d'en obtenir vous-même, car vous pouvez soit créer ces cartes vous-même si vous savez comment faire, soit vous ne pouvez pas les obtenir dans les différents référentiels sur le Web ou même utiliser des outils en ligne pour les fabriquer. Donc, un bon endroit pour obtenir ces textures serait ambientcg.com Encore une fois, j'ai fourni un lien vers ce document pour les documents supplémentaires. Et si vous souhaitez les créer vous-même à partir d'une texture individuelle que vous avez créée, vous pouvez également vous rendre sur normalmpline.com Et encore une fois, j'ai fourni un lien vers cela dans les documents supplémentaires. Oh, comme vous pouvez le voir, j'ai déjà commencé à jouer avec certains matériaux, mais nous allons en créer un ou plutôt en modifier un directement. Passons donc à l'avant de notre réservoir, qui est, bien sûr, maillé depuis 387, et nous élargirons le maillage, et nous élargirons le matériau. Maintenant, pour le moment, c'est un peu ennuyeux parce que ce n'est littéralement qu'une couleur unique. Nous voulons donc changer cela. Nous allons donc passer à l'albédo, et nous avons un emplacement pour la texture ici Faisons donc glisser une texture là-dedans. Nous allons faire glisser le fichier couleur à partir de ceux fournis. Et maintenant, vous pouvez voir que cela remplace ou superpose une texture sur notre matériau teintant avec la couleur que Alors laisse-moi juste prendre cette couleur. Si nous devions changer cela et remettre complètement au blanc, vous pourriez voir que la texture elle-même n'est pas vraiment affectée. Et puis si nous voulons le teinter, il suffit de lui redonner sa couleur. Mais nous pouvons faire plus que cela parce que nous avons un tas de fichiers ici. Nous pouvons changer la métallisation. Et, bien sûr, cela a aussi une texture. Donc, si nous fournissons la texture métallique, cela peut changer l' aspect métallique du matériau Nous pouvons également modifier la rugosité, qui est la texture de rugosité. Et vous pouvez voir maintenant que cela donne un peu plus de profondeur et de sensation à la texture. Donc, avant que ces bosses soient pas vraiment, elles n'avaient pas vraiment l'air en trois D, et elles n'existaient pas vraiment du tout En fait, laissez-moi clarifier cette texture, et je vais vous montrer que la différence est que, accord, cela ressemble juste à un tas de taches colorées. Et maintenant, si nous remettons la rugosité ici, vous pouvez voir que cela ressemble vraiment à quelque chose, vous savez, que vous pourriez toucher en passant votre main dessus Ensuite, nous avons également des cartes normales. Il existe maintenant deux types de cartes normales, des cartes normales, au format DX ou au format GL Godot fonctionne avec le format GL. Nous allons donc utiliser le GL normal. Et celui-ci est un peu confus. Godot prend donc en charge une carte de hauteur, et dans d'autres moteurs et d'autres types d'outils, cela est généralement appelé carte de déplacement Et vous ne pouvez pas vraiment voir de différence avec cette configuration d'éclairage particulière, mais elle existe. Maintenant, si vous n' aimez pas la façon dont la texture s'étire sur l'objet sur lequel vous travaillez, vous pouvez passer à nouveau, sous le matériau, et passer à l'option d'échelle UV. Et laissez-moi réinitialiser celui-ci juste pour que vous puissiez voir la différence. Parce que parfois, parce que nous n'utilisons pas réellement, par exemple, de véritables modèles dont la cartographie UV est effectuée dans le logiciel de modélisation en trois dimensions, Godot étend simplement la texture sur toute la surface de l'objet, comme véritables modèles dont la cartographie UV est effectuée dans le logiciel de modélisation en trois dimensions, Godot étend simplement la texture sur toute la surface bon lui semble, mais cela peut ne pas fonctionner pour nous Nous pouvons donc la réduire en modifiant le zoom de la Bien, maintenant que nous avons un puits, nous avons un tank bien différent, d'apparence plus texturée Et si nous abordons notre jeu, vous pouvez certainement voir la différence, en particulier la façon dont la lumière joue dessus et à quel point il est différent. Et bien sûr, comme nous l'avons fait dans notre scène de chars de base, les chars ennemis ont exactement la même apparence. Et vous pouvez également voir la façon dont la lumière change en raison de la réflectivité des réservoirs Oh, nous avons une erreur. C'est bon. J'ai cassé quelque chose. C'est donc quelque chose qui sera corrigé pour la prochaine leçon, mais quoi qu'il en soit, je vous garantis que cela n' aucun rapport avec cette leçon en particulier, donc nous ne nous en inquiéterons pas. Quoi qu'il en soit, il s'agissait de matériaux et de leurs différentes cartes. Nous vous verrons dans la prochaine leçon. 35. Décals: Bon retour. Nous sommes dans la dernière ligne droite. Avant de continuer, je tiens simplement à mentionner que, oui, j'ai corrigé l'erreur survenue à la fin de la dernière leçon. En gros, lorsque nous avons réorganisé le chapitre où nous avons créé le générateur d'ennemis, le char ennemi de base ne possédait pas de kit préfabriqué d'obus, car le char que nous avions intégré directement dans le jeu était l'endroit où nous avions installé était l'endroit où nous avions Donc, pour une raison ou une autre, cela ne s'est jamais propagé. Et puis quand nous l'avons déplacé dans le générateur, bien sûr, puisque nous travaillions à partir du modèle et que le préfabriqué du shell était nul. Et puis, bien sûr, je n'ai jamais vraiment laissé aucun des chars et les leçons qui ont suivi me tirer dessus, donc cela ne s'est jamais produit. Bref, en résumé , je suis revenu en arrière et j'ai corrigé la scène des chars ennemis pour toutes les leçons tirées, je crois, du chapitre 104, chapitre 10, leçon 4 et suivantes. L'erreur doit donc être corrigée rétroactivement, même si elle apparaît dans la vidéo Hey, passons à des choses plus intéressantes. Parlons des décalcomanies. Les décalcomanies sont vraiment cool. Ils vous permettent d'ajouter des détails de texture supplémentaires à votre jeu sans avoir à les intégrer à vos modèles. Ainsi, par exemple, j'ai créé un petit cratère d'obus qui apparaît sous la forme d'un autocollant sur le sol à l'endroit où l'obus tombe. Maintenant, je n'étais pas assez chic pour le mettre sur des arbres ou quoi que ce soit d'autre. Donc, si vous tuez un arbre, vous ne le verrez pas. Mais c'est de l'autocollant dans sa forme la plus élémentaire. Et voyons comment en fabriquer un. Les décalcomanies sont des nœuds, dans Gado. Donc, si vous créez une nouvelle scène et que vous lui donnez une base de type décalcomanie, nous en créerons une nouvelle très rapidement pour que vous puissiez voir comment cela se fait, autre nœud, décalcomanie Donc, si vous créez un nouvel autocollant, débarrassez-vous de celui-ci. Et tu lui donnes une texture pour son albédo. Au minimum, c'est tout ce dont vous avez besoin. Dans notre cas, nous n'avons donc rien d'autre à faire. Ce que nous ferions normalement, c'est faire pivoter l' orientation des décalcomanies ce qu'elle corresponde à la surface normale du maillage auquel nous les fixons Mais nous n'avons pas besoin de le faire car nous le fixons uniquement au sol Son orientation de surface par défaut est donc parfaitement correcte. Nous passons donc à notre script shell, et bien sûr, dans notre shell, comme nous l'avons déjà fait pour d'autres choses similaires, nous avons ajouté une variable d'exportation de type scene pour le decal prefab, puis nous avons fait glisser le shell cratère que nous shell cratère que Et puis, lorsque la coque entre en contact avec quelque chose, nous instancions une copie de l'autocollant Nous l'ajoutons au parent de la coque lorsque nous étions enfants, car le parent de la coque est le terrain de jeu, puis nous définissons le cratère, l'autocollant, qui est le cratère, de la position globale du cratère à la position globale de Et nous devons évidemment faire dans cet ordre, car si nous devions définir la position globale avant d'ajouter l'enfant, nous recevrions un message d'erreur. Mais oui, ce sont des décalcomanies. Vous pouvez utiliser des autocollants pour des objets tels que des éclaboussures de sang, de la saleté, toutes sortes de choses de ce genre. Hum, nous le faisons de manière dynamique ici raison de la façon dont les coques fonctionnent, mais vous pouvez également l'utiliser pour ajouter de la texture à votre terrain. Et lorsque nous améliorons notre terrain dans une leçon ultérieure, qui peut en fait être la prochaine, c'est fini. Quoi qu'il en soit, une fois que nous aurons amélioré le terrain, nous le ferons pour voir comment ajouter de la variété. Bref, ce sont des décalcomanies. Je vous verrai lors de la prochaine leçon. 36. Importer des modèles externes: Bon retour. Dans cette leçon, je vais vous montrer quelques façons d'importer des modèles externes dans votre Godot Malheureusement, étant donné que Godot prend en charge un assez large éventail de formats de modèles, et étant donné que la plupart du temps, si vous voulez des modèles gratuits sur Internet, ce que je peux presque garantir que vous ferez pour vos deux premiers jeux, à moins que vous ne soyez ou ne connaissiez un modélisateur en trois dimensions, vous aurez souvent des problèmes À ce stade, pour GaDo 43, il est presque toujours possible d' importer sans difficulté les types de fichiers GLTF Mais parfois, les ressources que vous recherchez ne sont pas dans ces formats ou, même si elles le sont, l'artiste n'a pas pris toutes les mesures nécessaires pour rendre la ressource disponible correctement dans GADO Nous allons donc importer des actifs, et je vais vous montrer quelques méthodes courantes pour corriger certaines erreurs de base qui peuvent survenir lors de vos importations Toutes les ressources seront donc fournies dans le cadre de ce projet de leçons. De plus, je vous ai fourni des actifs non immobilisés avec lesquels vous pourrez jouer et essayer de vous réparer une fois que je vous ai montré ce qu'il faut faire Alors d'abord, permettez-moi de clore tout un tas de ces scènes parce que nous n'allons pas les utiliser. Et la première chose que nous allons faire est de réparer notre pierre parce qu'elle a l'air très ronde. Nous avons donc un ensemble de pierres à notre disposition, et celles-ci ont été téléchargées depuis Open Game Art. Et comme vous pouvez le constater, ils étaient fournis dans un certain nombre de formats compatibles, notamment Kalata, qui est un DAE OBJ et même un Mais si vous ouvrez le Godot, vous verrez qu'il manque des dépendances et d'autres choses pour diverses raisons Nous n'allons donc pas réparer cette dépendance rompue. Ce que nous allons faire, c'est créer une nouvelle scène à partir d'un fichier existant. Nous avons donc notre fichier DAE ici, et nous allons cliquer dessus avec le bouton droit de la souris et créer une nouvelle scène héritée. Cela nous donnera donc un nouveau Godot avec ce maillage en tant qu' instance de maillage à l'intérieur Et en fait, tu sais, c'est bien. Copions donc l'instance de maillage. Et en fait, laissez-moi voir si cela fonctionnera. Permettez-moi d'en revenir au rocher. Nous avons déjà un maillage. Et nous avons un OBJ voyons si nous pouvons l'intégrer Est-ce que ça va marcher ? Non Que diriez-vous de ça ? Oui, ça va marcher. Ainsi, l'instance de maillage Three D prendra des points OBJ comme ressource de maillage Et si vous n'avez pas d'OBJ, si vous avez juste un DAE ou autre, alors vous pouvez simplement faire ce que j'ai fait faire un clic droit et obtenir une scène héritée, puis vous pouvez copier cette instance de maillage trois D. Quel est le chemin ici ? Oui, c'est toujours le DAE. Intéressant Quoi qu'il en soit, Godot effectuera quelques importations dans les coulisses Quoi qu'il en soit, nous pouvons cliquer avec le bouton droit de la souris et copier ce nœud. Et revenons à notre pierre, même si nous n'en avons pas vraiment besoin puisque nous l'avons déjà importée. Donc oui, nous avons donc notre maillage. Le problème est que les textures du maillage n'étaient pas liées. Heureusement, les textures nous ont été fournies, ce qui nous a permis de définir manuellement le matériau de notre maille. Malheureusement, pour un boîtier DAE, il n'indique pas spécifiquement la ressource de maillage, mais le contenu de nombreux formats de fichiers de maillage importés sera masqué sous ce que l' on appelle une surface. Vous pouvez également fournir un matériau existant ou nouveau sous le remplacement du matériau de surface. La surface est donc le véritable matériau de la roche. Maintenant, ce que nous pouvons faire, c'est rendre notre maillage unique, puis dire unique récursif, ce qui nous permettra de changer le matériau Et dans ce cas, ils ont déjà fourni un document, nous pouvons donc simplement le faire glisser. Et pour une raison ou une autre, cela n'a pas mis à jour les textures. Donc, d'accord. Mais cela nous a fourni certains réglages matériels, et nous avons les textures nous-mêmes. Faisons donc glisser notre roche PNG dans l'albédo, et elle est déjà plus belle Et maintenant, nous avons une, on dirait que nous n'avons pas de métal ici, mais nous avons une rugosité et nous avons une carte normale Et nous avons un spéculaire, qui peut en fait passer au métal Essayons ça. Ça a l'air plutôt bien. Maintenant, nous avons une jolie pierre ici, et nous pouvons la fermer . Ne sauvegardez pas. Maintenant, si nous conservons notre pierre et que nous revenons à notre scène d'aréna, nous devrions voir des pierres bien plus belles ici. Et nous y voilà. Nous avons de belles pierres. Nous allons donc faire de même pour les arbres. Et dans ce cas, les arbres. Encore une fois, je vous ai fourni plusieurs types de pierres avec lesquelles vous pouvez jouer pour faire la même chose. Maintenant, pour les arbres, nous avons un problème similaire dans la mesure où les arbres fournis sont au format FBX Désormais, à partir de Godot quatre points trois, vous pouvez importer des fichiers FBX directement dans Godot pour ce qui est de l'ère des quatre points deux Et si vous travaillez en quatre points deux, vous devrez peut-être toujours le faire. Mais il existe un convertisseur FBX externe que Godot utilise. Et par exemple, si je double-clique dessus, donc si vous double-cliquez dessus , vous pouvez voir que son contenu n'a pas été configuré correctement. Et vous pouvez également voir que vous aviez la possibilité d'utiliser un importateur spécifique. Maintenant, UFBX est, bien sûr, l'importateur qui est désormais intégré à Godot à partir de 43 ans, vous devriez donc simplement pouvoir Le problème ici, c'est que, encore une fois, le matériau, même s'ils ont fourni un matériau, n'a pas de texture, mais c'est eux qui nous l'ont fournie. Donc, ce que j'ai déjà fait, c'est que j'ai créé un nouveau matériau standard. Pour ce faire, il vous suffit de cliquer avec le bouton droit de la souris sur créer une nouvelle ressource, puis de cliquer sur du matériel standard. Nous avons donc créé des fichiers de matériaux standard dans nos modèles existants jusqu'à présent. C'est donc la première fois que nous utilisons un fichier matériel externe. Mais ce que j'ai fait, c'est prendre la peau existante fournie et je l'ai traînée ici dans l'albédo Heureusement, l'arbre lui-même était correctement cartographié, il suffisait donc de le relier à nouveau Donc, si nous allons à Young Tree et que nous créons une nouvelle scène héritée, et que nous effectuons une sélection multiple pour obtenir toutes ces scènes. Et puis nous ouvrons les mailles, nous pouvons Encore une fois, nous avons un matériau sous la surface, qui n'est pas ce que nous voulons Nous pouvons donc les configurer pour les rendre à nouveau uniques et récursifs. Et puis sous la surface, nous pouvons remplacer le matériau par notre nouveau matériau standard. Et maintenant OK, il semble que ce modèle en particulier ne fonctionne pas bien. Quoi qu'il en soit, en voici un dont j'ai suivi tout le processus plus tôt avec l'un des autres modèles, et le voici. Cela a donc vraiment fonctionné. La morale de l' histoire est donc que, malheureusement, vous devrez parfois faire un peu de massage pour modèles disponibles gratuitement puissent fonctionner dans Godot Mais les problèmes les plus courants sont les matériaux cassés ou les textures cassées, et je viens de vous montrer deux façons de résoudre ce problème. Alors bonne chance. Laissez-nous, euh, cet arbre qui fonctionne actuellement dans notre scène arborescente. Nous allons donc double-cliquer dessus pour l'ouvrir. Nous allons nous débarrasser de ces deux instances de maillage. Et puis nous allons Où était notre arbre ? Faisons glisser cet arbre ici maintenant que nous en avons un. Donc, si nous conservons cela et que nous retournons dans notre aréna, encore une fois, les arbres auront l' air plutôt géniaux. Débarrassons-nous donc de cette cause qui ne fonctionne pas. D'accord, voici comment exporter ou importer des modèles dans Godot Et dans notre prochaine leçon, nous allons embellir un peu l'arène, et ce sera la fin du cours. Je t'y verrai donc. 37. Améliorer le niveau du terrain: Mmm, hum. Mmm, hum. Bon retour. Dans cette leçon, notre dernière leçon, nous allons faire plusieurs choses. La première chose que nous allons faire est changer notre Skybox. Vous vous souvenez peut-être, et je l'ai déjà supprimé ici, que nous avions une skybox qui provenait des paramètres de ciel par défaut produits par le Godot Nous pouvons changer cela. Donc, si nous retournons dans notre arène et que nous au nœud Environnement mondial que nous avons créé il y a de très nombreuses leçons, nous pouvons cliquer dessus pour l'agrandir, puis cliquer sur le ciel. Et je l'ai déjà développé ici. Avant, il y avait une texture de ciel procédurale dans cette boîte, que j'ai déjà effacée. Nous pouvons changer cela pour un certain nombre de choses. Donnons-lui donc un autre ciel, et nous l'ouvrirons. Et maintenant, nous avons la possibilité de définir un matériau du ciel. Maintenant, avant que cela ne soit réglé sur un matériau du ciel procédural, et c'est ainsi que nous en sommes arrivés là. Mais nous pouvons également fournir ce que l' on appelle un matériau du ciel panoramique. Et les ciels panoramiques sont la façon dont vous ajoutez de véritables boîtes de ciel graphiques. Maintenant, créer une texture panoramique dépasse le cadre de ce que nous essayons de faire ici, mais oui, j'en ai fourni une du pack All Sky de Richard Whitlock, qui est disponible dans la bibliothèque d'actifs Godot Il fournit un tas de scènes Godot Skybox existantes et dix textures de skybox différentes J'en ai donc fourni un ici. Et si vous cliquez sur la Skybox pour l'ouvrir, vous verrez que vous avez la possibilité fournir un panorama Maintenant, pour une raison ou une autre, eh bien, d' accord, maintenant ça va marcher. Génial. Mais avant, j'ai eu du mal à le faire glisser Ainsi, si vous faites glisser la texture dans cet emplacement , vous obtiendrez une skybox. L'autre option, bien sûr, consiste à cliquer et à charger ou à charger rapidement. Mais une fois que vous l'avez fait, pouvez voir que vous avez un magnifique ciel panoramique, et je dois y aller Magnifique. Allons-y. Eh bien, tu as compris l'idée. Quoi qu'il en soit, oui, ce ciel couvre maintenant l'intégralité de notre scène environnementale, et il est vraiment beau. Ça a l'air bien mieux que l'original. Alors, ensuite, réparons la Serena. La première chose que nous allons faire est ajouter des limites réelles. Donc, si vous vous souvenez du moment où vous avez probablement testé des choses et joué auparavant. Il est possible de quitter le bord de l'arène en voiture, et comme nous n' appliquons aucune gravité, nos chars vont flotter dans l'espace. Cela n'arrivera pas aux chars ennemis, car ils ne peuvent que se déplacer ou se déplacer uniquement de NavPoint à NavPoint, mais cela peut certainement arriver au joueur, et c'est Alors, réglons ça. Le moyen le plus simple résoudre ce problème est de simplement prévoir des collines de collision tout autour du bord du mont Nous allons donc prendre une colline. Nous allons cliquer avec le bouton droit de la souris et dupliquer cette colline, puis nous passerons à Editable Children Ensuite, nous devons rendre les maillages uniques. Et la collision est unique afin que nous puissions les modifier. Maintenant, renommons cette colline pour qu'elle borde la Colline Nord Et nous allons le déplacer ici. Nous allons le faire Whoa, c'est intéressant. Nous allons changer l'orientation de cette colline de telle sorte que Où est notre transformation ». Où est notre transformation ? Nous avons besoin des 90 degrés de cette façon. Ouais. OK. Et oui, parlons-en un peu plus. Avancez un peu. Et maintenant, nous pouvons changer le maillage réel. Donc, si nous allons ici, nous avons XYZ. Nous allons changer la direction X à 100, ce qui est le Whoa, ce n'est pas bien Nous allons changer le code, c'est parce qu'il est alterné. D'accord, nous allons changer la direction Z à cet endroit. Nous allons l'apporter ici. Et nous en avons un. Ensuite, nous dupliquerons le tout. Changez-le en Sud. Faites-le glisser vers le bas. Oups. Border Hill South. Et nous pouvons simplement dupliquer les deux et les faire pivoter de manière ce qu'ils soient à l'est et à l'ouest. Et j'ai oublié de modifier la collision, donc nous allons régler ce problème dans un instant. Faites cette rotation. Négatif 90. L'orientation est un peu décalée. Nous pouvons régler ce problème assez facilement. Vous pouvez également simplement les étirer pour qu' ils soient meilleurs Z un sur cinq. Ouais. Ensuite, nous ferons de même pour East Hill. Oui, d'accord, je suppose qu'ils le sont. D'accord, on dirait qu' il y a un petit écart . Ce n'est pas bien. OK. C'est mieux. Maintenant, nous devons réparer les collisions. Nous revenons donc à nos formes de collision, et heureusement, nous pouvons simplement les modifier ici. Et, bien sûr, il va falloir réinitialiser leurs transformations. Et l'orientation est un peu décalée, mais ça va. On va juste le traîner comme ça. Faites-le glisser ici et faites-le glisser ici. Ensuite, faites de même pour les trois autres . Celui-là est correct. Il ne nous reste plus qu'à le faire pivoter à nouveau. Et réoriente-le un peu. Faites de même pour les deux autres. Oui, on dirait qu'ils sont bons tous les deux. Il suffit de modifier la rotation. Zéro. Et ils sont décalés en termes de Z, nous allons donc corriger cela. OK. Maintenant, nous ne devrions plus être en mesure de partir dans l'espace. Maintenant, réparons ce terrain qui est un peu moche. Donc, comme nous le faisions auparavant, j'ai fourni un ensemble supplémentaire de textures pour ce projet dans le dossier Graphics Desert Textures. Nous pouvons donc maintenant simplement créer un nouveau matériau, créer un nouveau matériau standard standard en matière de ressources. Oui, on va l'appeler. Désert. Où est-ce que c'est passé ? Ça y est. D'accord, et maintenant nous le pouvons, nous n'aurons pas besoin d'ombrage, mais nous n'aurons pas besoin de la couleur du sommet Nous aurons besoin de notre albédo. Et ça n'entraînera pas le Rock 29 là-dedans. D'accord, tu vas me donner du chagrin. Rock 29 Albedo Rock Drag. Nous y voilà. Et non, nous n'avons pas vraiment besoin de métal. Nous avons besoin de rugosité et de rugosité normale. Voici donc notre rugosité. Pourquoi est-ce que cela continue de disparaître ? Carte normale. Activé. Et encore une fois, nous devons nous assurer d'utiliser le bon, c' est-à-dire le GL normal. Et nous en avons un pour l'occlusion ambiante, alors activons-le et voyons ce qui se passe Arrête. Les joies des logiciels libres, parfois ils veulent simplement faire des bêtises C'est bon. Et nous avons une carte des déplacements, elle permet donc d'activer la hauteur. Et je vais le faire normalement cette fois. Graphismes, textures désertiques, déplacements. OK, Dan, nous allons retourner dans notre arène, et nous voulons définir le matériau de notre treillis de sol. Instance 3 D. Ouvrez donc notre treillis et nous changerons de matériau. Pouvons-nous cliquer sur le charger ? Non. Seigneur. Des arbres du désert. Nous y voilà. OK, donc c'est plutôt grand. Et le moyen le plus rapide de résoudre ce problème est de modifier l' échelle des UV Donc, si nous ouvrons la texture et que nous passons à la texture UV, nous pouvons changer l'échelle ici. Réglons-le donc sur 0,5. Et ce n'est pas une bonne chose. Réglons-le sur 1,5. C'est un petit peu mieux. L'éclairage est un peu bizarre. Cela a probablement un rapport avec le coucher du soleil, je suppose Éteignons ça. Non, ce n'est pas le soleil. Hmm. OK, c'est pour que nous puissions voir, en fait, qu'il se passe quelque chose d' intéressant ici. Alors, qu'est-ce qu'on a ? OK, il semble donc que la texture de Rock 29 était mauvaise. Passons à la couleur Rock 29. Regarde si ça résout le problème. Oui, c'est beaucoup mieux. OK. J'aime bien ça. Bien, maintenant que cela semble bon, nous pouvons à nouveau fournir le même matériau à nos collines Et faisons-le directement dans la colline elle-même, c' est pourquoi il est merveilleux d'utiliser des scènes héritées. Nous allons donc retourner à Hill, élargir notre maillage. Et remplacez notre ressource, et maintenant nous pouvons la charger rapidement parce que nous l'avons déjà utilisée, ouvrir, boum. D'accord. Ces collines sont plus belles. Au moins pour ce qui est de la texture. Je veux dire, évidemment, nous utilisons toujours un maillage très inadapté Mais, euh, d'accord, et, bien sûr, nos maillages de bordure n'utilisent pas le même matériau parce que nous les avons rendus uniques, nous devons donc les définir Et bien sûr, ils ont l' air affreux. Nous devons donc modifier à nouveau la mise à l'échelle de notre interface utilisateur. Nous l'avons réinitialisé à un. Ça a toujours l'air nul. Passons à Non. OK, donc à ce stade, nous allons devoir modifier la mise à l'échelle de la texture dans un seul sens. Il y a donc une petite icône de lien ici. Donc, si vous cliquez dessus, cela signifie que vous devez le modifier et vous assurer qu'il est blanc. Si vous les modifiez tous, cela signifie qu' ils seront tous modifiés. Mais si vous ne voulez pas que ce soit le cas, vous cliquez à nouveau dessus pour qu'il ait l'air cassé. Et dans ce cas, je pense que nous voulons simplement changer le X et le Z. Alors, oh, ça change tout, n'est-ce pas ? Et c'est ce que nous ne voulons pas. Oh, c'est vrai, évidemment, parce que nous utilisons les mêmes textures que nous utilisions avant ou pour les autres maillages. Il va donc falloir les rendre uniques à nouveau. Et heureusement, nous pouvons le faire simplement en cliquant avec le bouton droit de la souris sur chacune d'elles, en les agrandissant, en accédant au matériau, puis en les rendant uniques. Et maintenant, nous devrions pouvoir les réparer sans tout casser. Mais revenons à notre désert d'origine. Assurez-vous que les échelles sont correctes. Oui, ils étaient 1,5 à l'origine, ce qui était bien. Et maintenant, nous pouvons changer tout cela, espérons-le. Matériau B. Maintenant, ces matériaux devraient être uniques. Un UV. Nous y voilà. C'est le numéro 5. Nous y voilà. Ça commence à paraître un peu mieux. D'accord. Ce n'est pas parfait. Peut-être que nous pouvons en faire 15 ? Oui, ça a l'air infiniment mieux. D'accord. Maintenant, lançons notre jeu et voyons à quoi il ressemble. C'est bon. Je pense qu' à ce stade, nous devrions peut-être l'éteindre du brouillard. Mais où est le tank ennemi ? Il est là. La mise à l'échelle de la texture est encore un peu compliquée. Nous le ferions pour le matériel. Très bien, désactivons le brouillard sur la caméra ou pour l' environnement. Brouillard. Oh, c'est vrai. Parce que c'est activé sur l' appareil photo. C'est ce que nous avons fait. Revenons donc à notre scène de chars d'origine passons devant la caméra et désactivons le brouillard Z. Bien, maintenant essayons à nouveau. C'est vrai. Ça a l'air bien mieux. Évidemment, nous voulons jouer avec le soleil directionnel car maintenant tout est dans l'obscurité la plus totale. Alors faisons-le. Revenons à notre scène de jeu. Et c'est en fait dans le monde de l'arène Environment Directional Light. Et nous pouvons soulever cette question , d'accord, alors où est le Oh, le voilà Voilà la petite flèche. Nous y voilà. Donc, si nous la faisons pivoter vers le bas, pour que la carte soit exposée plus directement au soleil, faisons-la glisser ici pour créer de l'ombre OK, ça devrait être infiniment mieux. Ouaip. Donc, à ce stade, vous pouvez jouer avec elle pour obtenir, j'ai l'impression que cette texture est encore assez méchante. Revenons à ici. Et nous allons changer l'échelle UV à trois. OK. Ça a l'air mieux. À ce stade, il suffit de peaufiner jusqu'à ce qu'il ressemble à ce que vous souhaitez Comme vous pouvez le constater, la texture est infiniment meilleure sur la mini-carte, mais elle est un peu aplatie et asymétrique ici à cause de la taille de l' arène Mais si vous allez vraiment dans les collines, c'est beaucoup mieux. Mais oui, c'est quand même un peu bizarre là-bas. Quoi qu'il en soit, cela nous amène à la fin de notre cours. N'hésitez pas à continuer à jouer avec les réglages des textures, de l'éclairage et tout le reste jusqu'à ce que vous obteniez quelque chose qui vous plaise, car à ce stade, comme je l'ai dit, il s'agit littéralement de peaufiner selon J'espère que vous avez apprécié ce cours et que vous vous êtes joint à moi pour découvrir les bases du développement en trois D dans Godot, et je vous verrai la prochaine fois 38. Exporter votre jeu: Voyons comment exporter votre jeu afin que d'autres personnes puissent jouer à votre chef-d'œuvre. Vous allez exporter votre jeu via Project Export, et vous devrez télécharger les préréglages appropriés pour votre système Ainsi, par exemple, si je voulais exporter vers un bureau Windows, je cliquerais sur le bouton Ajouter et je sélectionnerais Windows Desktop. Et puis, bien sûr, si aucun préréglage n'est disponible, cela nous indiquera qu' aucun modèle d'exportation n' est disponible au chemin attendu Il faudrait donc les télécharger, gérer les modèles d'exportation, télécharger et les installer depuis le meilleur miroir disponible. Et une fois cela fait, vous devriez être en mesure d' exporter votre projet. Vous pouvez modifier tous les paramètres disponibles si nécessaire. Par exemple, vous pouvez ajouter une icône ou modifier tout autre élément. Mais si vous ne savez pas réellement ce que signifie l'un de ces paramètres, vous pouvez parfaitement les laisser par défaut. 39. Projet de cours : créez votre propre jeu 3D: Il est temps de mettre en pratique tout ce que vous avez appris. Pour le projet de classe, vous allez créer votre propre version du jeu Zone Battle en utilisant les systèmes que nous avons développés tout au long de ce cours. L'objectif n'est pas de tout copier parfaitement, mais d'appliquer les concepts de base et de vous approprier le projet. Votre projet peut inclure un tank jouable avec des commandes de mouvement et de tourelle, un environnement en trois dimensions avec éclairage, des ennemis dotés d'un comportement d'IA de base, ennemis dotés d'un comportement d'IA de base effets sonores et des éléments d'interface utilisateur tels que le score ou Vous pouvez personnaliser le projet. En fait, on vous y encourage. Changez la disposition des niveaux, ajustez le comportement de l'ennemi. Expérimentez avec des matériaux ou ajoutez vos propres petites fonctionnalités. Lorsque vous êtes prêt, téléchargez des captures d'écran ou un court extrait de gameplay de votre projet dans la galerie de projets. Vous pouvez également inclure une brève description de ce que vous avez construit et des pièces que vous avez trouvées les plus intéressantes ou les plus difficiles. Je vais vérifier les projets et laisser des commentaires. J'ai hâte de voir vos matchs. 40. Félicitations ! Que faire ensuite ? ?: Félicitations. Vous avez atteint la fin du cours. Vous avez appris à travailler dans Gdo, à naviguer dans l'espace tridimensionnel, à créer des environnements, à implémenter la physique, les commandes, l'IA, le son, l'interface utilisateur et les systèmes de jeu. Certainement beaucoup. Et vous avez réuni toutes ces pièces dans un jeu complet en trois D. Plus important encore, vous comprenez maintenant comment les objets GIDOPjects sont structurés et comment les différents systèmes communiquent entre eux C'est cette base qui vous permet de continuer à apprendre et à expérimenter par vous-même. Merci d'avoir suivi ce cours et d'avoir créé à mes côtés. J'ai hâte de voir ce que vous allez faire votre futur parcours de développement de jeux vidéo. Bonne chance et bonne création.