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.