Transcription
1. Introduction: Bienvenue dans mon cours
d'introduction sur le
développement de trois jeux en D et Gada Dans ce cours, nous
aborderons tout ce que vous devez savoir sur l'utilisation
du moteur Gudo pour créer une manette de
personnage à la troisième personne ,
depuis les bases
du travail dans un espace en trois D jusqu'
au
contrôle d' un personnage et d'une
caméra dans une scène en trois D. Nous verrons comment
utiliser les mathématiques, la physique et les vecteurs pour obtenir
le
gameplay à la troisième personne que l'on attend de la
plupart des jeux 3D modernes, avec le joystick gauche
déplaçant et faisant pivoter le personnage et
le joystick droit faisant tourner la caméra autour de lui. Lorsque vous aurez terminé, vous
aurez une bonne connaissance du contrôle des
personnages à la troisième personne et d'une
implémentation entièrement fonctionnelle,
hautement personnalisable pour
n'importe quel projet en trois dimensions, qu' hautement personnalisable pour
n'importe quel projet en trois dimensions, il
s'agisse d'une plateforme
, d'une action, d'un jeu ou même d'une simulation de ferme confortable. Vous pouvez orienter le projet
dans la direction que vous souhaitez. Vous acquerrez également des compétences utiles pour travailler dans le moteur de jeu
Gada, organiser et concevoir vos projets de manière à ce qu'ils
soient plus évolutifs Vous allez
apprendre à coder dans script
GD avec tout
expliqué en détail Nos scripts
seront écrits de manière à être hautement personnalisables
et réutilisables. Tous les fichiers du projet
seront également disponibles sur GT Hub si vous devez
revoir le projet terminé. Ces vidéos ont été enregistrées
avec la version 4.2 de Gada. Ressources téléchargées depuis
HO et fabriquées par Kusberg.
2. 0-1 Introduction à la programmation: Bonjour les amis. vous devez télécharger
le GDOGameEngine sur gdongine.org Si ce
n'est pas déjà fait,
vous devez télécharger
le GDOGameEngine sur gdongine.org
. Le moteur est gratuit, mais vous pouvez faire un don pour soutenir le
projet si vous le souhaitez. Il n'y a aucun processus
d'installation. Vous pouvez simplement extraire le fichier
compressé et l'ouvrir. Veillez à déplacer le
fichier exécutable vers un meilleur emplacement. La fenêtre de lancement initiale est une liste de vos projets en cours. Mais si vous n'
avez pas encore de projet, vous serez invité à
explorer des projets de démonstration. Nous pouvons ignorer cela
et simplement créer notre propre nouveau projet
soit en cliquant sur ce bouton dans la liste des projets soit sur le bouton Créer en haut de la fenêtre. Ici, nous pouvons donner un nom à
notre projet, qui serait généralement
le nom de votre jeu. Je vais juste passer à l'introduction
à la programmation. Le projet doit être stocké sur le disque dur de notre ordinateur, et nous allons créer un nouveau dossier portant le même nom
que le projet. Par défaut, il souhaite tout
stocker dans
le dossier des documents, mais il serait préférable de créer un nouveau sous-dossier pour les projets
Godot Le moteur de rendu modifie la
façon dont certains objets en deux et trois D
sont rendus, mais nous ne
dessinerons rien Nous pouvons
donc ignorer ces options Le moteur de rendu peut également
être modifié ultérieurement. Et la
compatibilité du contrôle de version avec Github est incluse par défaut si vous souhaitez l'utiliser pour sauvegarder votre projet ou le
partager avec d'autres Lorsque vous êtes prêt à commencer,
cliquez sur Créer et modifier. La fenêtre GDOEditor
ouvrira notre projet
vide nouvellement créé. L'éditeur est
divisé en cinq docks principaux. Un aperçu de notre jeu
se trouve au centre. Le dock inférieur gauche
contient un navigateur de fichiers affichant le contenu
du dossier de projet que
nous venons de créer. Il ne
contient actuellement que l'icône Gadot. Le dock supérieur gauche
contient l'arbre des scènes, une liste de tout ce qui
se trouve dans notre scène actuelle, qui est actuellement vide Il nous demande
donc de créer une
racine pour l'arbre de scène. Nous ne dessinerons rien, nous n'avons
donc pas besoin de
préciser si cette scène est deux ou trois D ou s'il s'agit d'
une interface utilisateur. Nous pouvons donc simplement
sélectionner un autre nœud. Il existe de nombreux
nœuds différents que nous pouvons créer, mais nous voulons uniquement apprendre
à écrire des scripts Nous utiliserons
donc simplement
un nœud par défaut. Nous pouvons renommer notre nouveau nœud en
cliquant dessus une
fois qu'il a été sélectionné ou en
cliquant avec le bouton droit de la souris pour ouvrir son menu contextuel et
en sélectionnant renommer Appelons ce nœud Lesson 1. sélection d'un nœud
dans l'arbre de scène révélera ses propriétés
dans l'inspecteur, qui est ancré sur le côté
droit de la fenêtre Nous pouvons voir le nom du
nœud sélectionné et
ses propriétés organisées
en catégories extensibles,
mais aucune de ces propriétés
n'est ses propriétés organisées
en catégories extensibles, mais aucune de ces propriétés applicable à
ce que nous faisons Avant de faire quoi que ce soit d'autre, nous devons enregistrer notre nouvelle scène, soit en sélectionnant
Enregistrer la scène dans
le menu de la scène, soit en utilisant le
raccourci Control S ou Command S. Cela ouvre une boîte de
dialogue dans laquelle nous pouvons spécifier un nom pour notre
scène avec le TSCNetExtension, ainsi qu'un Créons un nouveau
dossier pour la leçon 1, puis enregistrons la scène
dans ce dossier. Nous pouvons maintenant voir dans l'onglet du système de
fichiers que notre nouveau dossier a été
créé pour la première leçon et qu'il contient la scène de la
leçon 1, marquée par
l'icône Clapperboard Ensuite, nous allons attacher un script au nœud racine de notre scène, soit en sélectionnant le nœud
racine et en cliquant sur le bouton
du script joint, soit en cliquant dessus avec le bouton droit de la souris et
en sélectionnant le script attaché. Le langage est GD Script
, le langage
de programmation que nous allons apprendre Chaque script héritera du type
de nœud auquel il est
attaché par défaut Le nœud racine étant
un type de nœud par défaut, notre script hérite de node Nous n'utilisons
ni modèle ni script intégré, et nous pouvons spécifier où ce script sera stocké
dans le projet. Mettons-le dans
le même dossier. Leçon 1. Lorsque vous nommez des scripts, il est important de
ne pas être arbitraire, mais de décrire
le type d'objet ou de comportement que nous créons
par le biais du script. Appelons-le donc Hello. Les scripts ont l'
extension de fichier point gD. Cliquez ensuite sur Créer
pour créer le script. Cela fera passer notre
aperçu en mode script, affichant notre script hello nouvellement
créé. Nous pouvons également voir notre script dans l'onglet du système de fichiers
indiqué par une icône en forme de roue dentée, et le nœud racine de
la leçon 1 possède une icône de script qui
nous indique qu'un
script y est attaché et
qui, lorsque nous le survolons, nous
indiquera le nom du cliquer sur cette icône
ouvre également le script s'il
n'est pas déjà ouvert. Notre script ne comporte qu'une seule ligne, qui décrit son
héritage
du type de nœud de base à l'aide
du mot clé extends. Cela signifie simplement que notre
script peut faire tout ce un nœud peut faire, plus
tout ce que nous écrivons ici. Cela nous permet également de
remplacer les comportements
du nœud qui existent déjà par de nouveaux comportements qui nous sont propres. Par exemple, les nœuds ont
une fonction nommée ready, mais elle ne fait rien. Donc, si nous voulons que notre script
remplace ce comportement
consistant à ne rien faire, nous pouvons déclarer notre
propre fonction du même nom en utilisant
le mot clé funk Funk est ensuite suivi
du nom de la fonction,
généralement écrit en
minuscules, généralement écrit en c'est-à-dire toutes les lettres
minuscules séparant les mots De nombreuses fonctions définies par les
nœuds sont
précédées d'un trait de soulignement, et le nom
doit correspondre exactement pour annuler le comportement Le nom de la fonction doit être suivi de parenthèses
et de deux Nous verrons pourquoi plus tard. En appuyant sur Entrée après cette ligne, la ligne suivante est automatiquement
indentée d'un niveau C'est ainsi que GD Script
sait quelles lignes sont contenues dans la
fonction et où elle se termine La ligne est surlignée en rouge car les fonctions
ne sont pas autorisées à être vides. C'est donc une bonne idée d'
écrire le mot « pass » pour donner de nouvelles fonctions à un
corps qui ne fait rien. Maintenant que l'erreur a disparu, nous pouvons voir cette icône en forme de flèche bleue apparaître devant la déclaration de
fonction, qui est le symbole de dérogation, indiquant que
ce script
remplace désormais le
comportement normal de notre nœud Au lieu de ne rien faire, nous voulons que notre nœud dise bonjour, ce que nous pouvons faire avec
une instruction print, en remplacement de la ligne qui disait « pass »
précédemment. L'instruction print
ressemble à une
déclaration de fonction dont nom est suivi de parenthèses car elle appelle
une fonction intégrée Cette fonction
nécessite un argument, qui est placé
entre parenthèses Et c'est cet argument
qui sera imprimé. En utilisant des guillemets, nous
pouvons écrire ce que nous voulons, et cela sera imprimé par notre script lorsque
le nœud sera prêt. Comme le script s'appelle hello, le comportement que nous voulons créer est que le nœud dise bonjour. Notre script étant prêt, nous pouvons lancer notre jeu en utilisant le bouton Exécuter la scène en cours en haut à droite ou en utilisant
le raccourci F six. Cela affichera
une fenêtre vide, puisque notre jeu ne
dessine rien, mais cela
ouvre également le cinquième dock, affichant le panneau de sortie. Et dans notre sortie, nous
pouvons voir que notre nœud a imprimé les mots « Bonjour tout le
monde » lorsqu'il était prêt. Nous pouvons terminer cette simulation
en fermant la fenêtre, en cliquant sur le bouton d'arrêt ou en utilisant le raccourci F huit. Nous pouvons modifier le texte
imprimé pour qu'il dise
ce que nous voulons et le
réexécuter pour que notre nœud puisse imprimer
tout ce que nous lui demandons. Nous savons maintenant comment associer
des scripts aux nœuds et les exécuter. Dans la leçon suivante, nous allons en apprendre davantage sur les constantes et les variables. Je te verrai dans la prochaine leçon.
3. 0-2 constantes et variables: Bonjour, mes amis. Nous allons commencer chaque leçon en
créant d'abord un nouveau dossier
pour la leçon. Créez ensuite une nouvelle scène dans le dossier du même nom. Double-cliquez sur une scène dans l'onglet du système de fichiers pour l'ouvrir. Lorsque plusieurs scènes sont ouvertes, nous pouvons passer de l'une à l'autre
en cliquant sur leurs onglets
dans le document d'aperçu. Aujourd'hui, nous allons discuter des différences entre
les constantes et les variables en utilisant les
jours comme cadre de référence. Attachons donc un nouveau script au nœud racine de la
scène et nommons-le jours. Commençons par les
constantes et déclarons-en une en haut du script
en utilisant le mot clé const, suivi du nom
de notre nouvelle constante, qui est généralement
écrit en majuscules et minuscules. Une constante est comme un conteneur dans lequel nous pouvons stocker des informations, mais ces informations
ne sont jamais autorisées à changer. Quelque chose que nous
considérerions comme une constante pourrait être le
nombre de jours dans la semaine. Comme il ne peut pas être modifié, il faut lui donner une
valeur immédiatement, c'est
pourquoi nous avons une erreur. Nous devons suivre le nom
d'un signe égal, l'opérateur d'assignation pour
donner une valeur à la constante. Le nombre de jours par semaine est de sept. Il est raisonnable de supposer
qu'il y en
aura toujours sept et qu'il en sera de
même pour tout le monde. Par conséquent, il ne devrait jamais
avoir besoin de modifier sa valeur. À l'inverse, nous avons des variables, qui sont également des conteneurs
pour stocker des informations, mais qui sont
conçues pour être modifiées. Nous pouvons déclarer une variable la même manière en utilisant
le mot-clé VR, puis en lui donnant un nom écrit
classiquement
en minuscules Cela permet de
voir facilement la différence entre les constantes et
les variables dans nos scripts. Quelque chose qui
change fréquemment est
peut-être la valeur d'aujourd'hui. Contrairement aux constantes,
les variables peuvent être vides. Remplaçons la fonction
Ready de notre nœud de base et imprimons les valeurs
du nombre de jours
de la semaine et du jour Nous pouvons voir que le nombre de
jours de la semaine est de sept, mais que la valeur du jour
est imprimée sous la forme nulle, ce qui signifie que la valeur est vide ou nulle. Corrigeons cela en initialisant
aujourd'hui à jeudi. Et nous pouvons rendre notre sortie plus lisible en ajoutant du contexte, commençant par quelque chose
comme « aujourd'hui », puis en laissant un espace après le
signe plus, puis notre variable. Dans ce cas, le signe
plus est
utilisé pour joindre deux
phrases si nous essayons de faire la même chose Cependant, si nous essayons de faire la même chose
avec notre constante, cela provoquera une erreur car notre constante est un
nombre et non un mot. Lorsque nous avons déclaré notre constante, nous lui avons attribué une valeur de sept, qui est un nombre
sans décimal, appelé entier en mathématiques Notre constante a donc
un type entier. Aujourd'hui, en revanche, a attribué une valeur de certains caractères entre
guillemets. En programmation, on
appelle cela une chaîne de caractères. Notre variable a donc
un type de chaîne. L'opérateur plus ne
peut être utilisé lorsque les types des deux
opérandes sont compatibles Nous pouvons contourner ce problème en
utilisant une fonction intégrée pour changer le type tel qu'il est
utilisé ici en chaîne, en passant la constante comme
argument à la fonction. Cela ne changera pas le type
de la constante d'origine, mais uniquement la façon dont elle est utilisée ici dans le contexte de
l'opération d'ajout Et nous pouvons continuer à ajouter contexte par la suite avec une
autre chaîne ajoutée, en n' oubliant pas d'ajouter un espace
supplémentaire au début. Nous pouvons donc maintenant
imprimer notre constante et notre variable en les utilisant dans des phrases faciles
à comprendre. Après ces lignes, faisons
comme si un jour passait. Nous pouvons ajouter un contexte supplémentaire à nos scripts qui
ne sera jamais vu par les joueurs, mais qui n'existe que pour nous aider, en tant que développeurs, à comprendre
notre propre code ou le code écrit par d'autres. Ils sont appelés
commentaires et sont créés l'aide du signe ou du hashtag OctathorpPound Tout texte écrit après ce
symbole sera coloré en gris et n'affectera en rien
le fonctionnement du script. Ils peuvent être sur leurs propres lignes ou à la fin d'une ligne de code. Utilisons donc un commentaire pour expliquer que nous
prétendons qu' un jour s'est écoulé
entre le code au-dessus de cette ligne et
le code ci-dessous. Nous allons changer la
valeur d'aujourd'hui pour qu'elle soit vendredi et imprimer
une autre phrase. Aujourd'hui, c'est plus Today, qui a désormais une valeur
différente. Nous pouvons voir que la valeur du
jour a d'abord été imprimée en tant que jeudi, puis modifiée et imprimée en tant que vendredi
sur la ligne suivante. Le commentaire n'a eu aucun effet
sur le script en cours d'exécution. Si nous essayons de modifier la valeur
de notre constante,
cela provoquera évidemment une erreur car les
constantes ne sont pas
autorisées à être modifiées. Si nous ne voulons plus utiliser certaines lignes de
code dans notre script, nous pouvons facilement
les transformer en commentaires
en les surlignant et en appuyant sur
Ctrl K ou Command K, en ajoutant le symbole de commentaire
au début de chaque ligne
surlignée. Appuyez à nouveau dessus
pour supprimer les commentaires. Nous pouvons spécifier le
type de variable ou de constante en ajoutant
deux points après le nom. Suivi du nom du type, nous voulons également restreindre cette
constante ou variable. Restreignons notre
constante à être de type int et aujourd'hui
de type chaîne. Outre les chaînes et les entiers, il existe deux autres types
primitifs que nous pouvons utiliser pour stocker des informations
de base Si un nombre contient des décimales, il ne s'agit plus d'un entier mais d' un
autre type appelé
nombre à virgule flottante, qui utilise le nom de type float Ajoutons une autre variable
pour la date d'aujourd'hui et donnons-lui un type de
nombre à virgule flottante avec une valeur de 12,05, qui correspond à la
date du 5 décembre Et le dernier type est appelé Boolean en utilisant le nom
abrégé Boole, qui peut
être vrai ou Nous allons donc ajouter une autre
variable pour savoir si
aujourd'hui est un jour férié ou non. Je vais limiter cela
à un booléen, mais je ne lui donnerai pas de valeur
initiale Ajoutons deux
instructions d'impression supplémentaires pour imprimer
les valeurs de ces
variables avec le contexte. La date d'aujourd'hui est une date plus, et aujourd'hui est un jour férié. Colon Plus est un jour férié. Lorsque nous l'exécutons maintenant, nous pouvons
voir notre date imprimée,
mais est-ce qu' un jour férié dit faux, même s'il ne lui a pas donné de valeur. Cela est dû au fait que tous les
types primitifs ont une valeur par défaut, mais la
valeur par défaut ne peut être attribuée que si nous spécifiez
le type de variable. Comme nous avons précisé qu'
un jour férié est un booléen, valeur
par défaut d'
un booléen lui a été attribuée , La valeur
par défaut d'un entier et d'un
nombre à virgule flottante est égale à zéro, et la valeur par défaut d'
une chaîne est simplement une chaîne vide, qui n'est pas identique à null, mais une chaîne
ne contenant aucun caractère. Si nous ne spécifiez pas le
type d'une variable, sa valeur par défaut sera nulle, mais il est possible de lui attribuer
une valeur de n'importe quel type, et son type peut
changer à tout moment. Supprimons le type de date. Donnez-lui ensuite la nouvelle valeur du 13
décembre et
imprimez-le une deuxième fois. La variable commence par se voir attribuer une valeur de nombre à virgule
flottante, est utilisée par l'instruction
print, puis une valeur de chaîne lui est attribuée avant d'être à nouveau imprimée. Cela est autorisé
car GD Script est un langage mal typé Cela offre une plus grande flexibilité
lors de l'écriture de nos scripts, mais également une plus grande
responsabilité pour éviter les erreurs de compatibilité de
type, comme nous l'avons vu avec l'opérateur plus. Il est recommandé de
toujours attribuer un type à vos
variables, non seulement pour éviter les erreurs, mais également pour améliorer l' efficacité de l'exécution de
vos scripts. Si le moteur connaît le
type de vos variables, il sait également exactement quelle quantité de mémoire il
doit occuper. Cela vaut également pour l'utilisation constantes à la place de variables. Si le moteur sait que la
valeur ne peut pas changer, il peut être utilisé
plus efficacement. Dans la leçon suivante,
nous allons apprendre comment contrôler le
flux de nos scripts. Je te verrai dans la prochaine leçon.
4. 0-3 Si Déclarations et conditions: Bonjour, mes amis. J'ai
déjà créé une nouvelle scène dans un
nouveau dossier pour cette leçon. Aujourd'hui, nous allons apprendre
à contrôler le flux de nos scripts pour exécuter
différentes lignes de code, en décidant
si nous pouvons voir ou non. Attachons donc un nouveau script
au nœud racine de notre
scène et nommons-le vision. Nous allons commencer notre
script en remplaçant la définition des nœuds de base
de la fonction ready méthode
la plus élémentaire pour contrôler le flux de nos scripts
est l'instruction I, qui commence par
le mot clé I. I est suivie d'une instruction
conditionnelle qui doit
être vraie ou fausse. Pour l'instant, disons vrai, qui est ensuite
suivi de deux points. Comme les deux points à la fin de notre déclaration de
fonction, cela marque la fin
de l'instruction, et en passant à la ligne suivante, elle est automatiquement
indentée à un autre niveau Les lignes de code indentées
qui suivent
cette instruction if ne
seront exécutées si la condition de l'instruction
if est vraie Imprimons donc quelque chose
comme si la condition était vraie, puis exécutons la scène en cours pour voir notre déclaration
d'impression fonctionner. Si nous changeons vrai en faux, nous pouvons constater que la déclaration d'impression est
ignorée cette fois Nous pouvons ajouter une autre
ligne après le corps indenté de l'instruction
if
au même niveau d'indentation que l'instruction I en utilisant simplement le mot clé se
suivi Cela crée un autre
corps conditionnel qui
ne sera exécuté que si la condition de l'
instruction I d'origine n'est pas remplie. Dupliquons la déclaration
d'impression et modifions-la pour qu'elle dise
quelque chose de différent. La condition étant fausse, le bloc se a été exécuté à la
place du bloc I. Et si nous changeons la condition en vrai, c'est l'inverse
qui se produira. Cela n'est pas très utile
si nous savons toujours que le résultat de l'
énoncé conditionnel est vrai ou faux, mais nous pouvons le
remplacer par une variable. Déclarons une variable
booléenne,
qui indique si la
lumière est allumée ou non dans la pièce booléens sont
classiquement nommés de
telle manière qu'ils impliquent
leur utilisation comme condition Dans ce cas, on suppose que la
lumière est allumée est vraie ou fausse en
fonction de son nom. Maintenant, notre instruction if peut définir
sa condition comme étant de savoir si la valeur de notre
variable est égale
ou non à true. Lorsque nous comparons deux valeurs
pour voir si elles sont égales, nous utilisons un double signe égal, connu sous le nom d'opérateur égal, qui est différent
d'un signe égal simple tel nous l'avons utilisé auparavant comme opérateur
d'affectation. Nous imprimerons ensuite
soit je peux voir, soit je ne peux pas voir, selon que la lumière est
allumée ou non, étant égale à vraie. Comme la valeur par défaut
d'un booléen est false, nous pouvons voir le résultat
comme je ne peux pas Mais si nous définissons la
variable sur true, elle devient I can see. Puisque la variable elle-même est un booléen, vrai ou faux, nous pouvons supprimer complètement l'
opération de comparaison et simplement utiliser le booléen comme condition et obtenir
exactement
le même condition et obtenir
exactement
le Nous pouvons inverser la
valeur de n'importe quel booléen, ce qui signifie que s'il est vrai, il devient faux
ou s'il est faux, il devient vrai
en utilisant le mot-clé not Comme la fonction STR que nous avons
utilisée dans la leçon précédente, cela ne change que la façon dont
elle est utilisée dans le contexte local et ne modifie pas réellement la valeur
stockée dans la variable. Donc, si ce n'est pas le cas, la lumière est allumée alors nous ne pouvons pas voir,
sinon nous pouvons voir. Rien peut également être représenté
par un point d'exclamation. Modifions la valeur des
voyants allumés et exécutons-le à nouveau. Je rétablirai ensuite ces modifications comme elles étaient auparavant Nous pouvons rendre nos conditions
beaucoup plus complexes en combinant plusieurs conditions l'aide d'opérateurs logiques. Créons une autre variable
nommée Has dark vision. Cette variable implique
que nous devrions être capables de voir même si le
voyant n'est pas allumé. Nous pouvons donc ajouter à nos
instructions if la condition que la lumière
soit allumée
ou que nous ayons une vision dans le noir. Et si l'une ou l'autre de
ces conditions est vraie, alors nous pouvons voir. Ce n'est que si les deux
conditions sont fausses que cela nous
empêchera de voir ? Et si, au lieu
d'avoir une vision sombre, nous portions des lunettes de
vision nocturne, car elles ne nous permettent de
voir que dans le noir mais
pas dans la lumière En changeant le nom de
la variable, la condition de notre
instruction I doit changer. Puisque si les deux
conditions sont vraies, nous ne devrions pas
être en mesure de voir. Ce n'est que si les valeurs de ces
deux conditions sont différentes on
doit considérer que la
condition à voir est remplie ? Nous pouvons utiliser l'opérateur non
égal pour vérifier si les deux valeurs ne
sont pas égales. Si vous êtes familiarisé
avec les opérations logiques, cela est connu dans d'autres
langages sous le nom de « or exclusif ». Maintenant, ce n'est que si la lumière
est allumée ou si nous portons lunettes de vision
nocturne, mais
pas les deux, que nous
pourrons voir Ensuite, considérons que
notre
personne hypothétique n'est peut-être pas humaine et ajoutons une variable pour le nombre de I
qu'elle possède, qui doit être
représentée par un entier Pour l'instant, nous allons
lui donner une valeur de deux Is. En ignorant les autres variables, quelle serait la
condition que nous définirions pour pouvoir voir en
fonction de cette variable ? Si le nombre d'yeux que nous
avons est
supérieur à zéro, nous devrions être capables de voir. Nous pouvons également l'exprimer en
utilisant un autre opérateur, supérieur ou égal à, et remplacer le
côté droit par un. Ils doivent donc avoir des yeux
supérieurs ou égaux à un. Il s'agit d'
opérateurs de comparaison qui renvoient un résultat booléen en comparant la valeur des nombres situés à gauche et à droite Nous pouvons logiquement conclure qu'il devrait être impossible pour toute créature humaine ou autre d'avoir un nombre
négatif d'yeux La valeur de notre
variable ne doit être que nulle ou
supérieure à zéro. Et la condition
pour pouvoir voir se résume
vraiment à
ces deux options Avons-nous des yeux nuls
ou non nuls ? Tout comme la variable booléenne peut être utilisée implicitement
comme condition,
un entier peut également être utilisé de cette
manière, zéro étant considéré comme une fausse condition et tout élément autre que zéro
étant La même logique est également appliquée
aux nombres à virgule flottante. Nous pouvons déclarer une variable flottante
, la nommer plage
de vision et
lui donner une
valeur arbitraire de 7,8 mètres. Nous pouvons utiliser nos
opérateurs de comparaison pour déterminer si ce nombre est supérieur ou égal
à une certaine valeur, ou nous pouvons l'utiliser implicitement
dans sa propre condition zéro
étant considéré comme faux et tout le reste
considéré comme vrai Qu'en est-il des cordes ? Changeons légèrement
les choses et déclarons une variable de chaîne correspondant à ce que nous avons entendu et donnons-lui une valeur
de bumps in the night Ensuite, nous pourrions logiquement l'utiliser
comme une déclaration « if car si ce que j'ai entendu
n'était pas une chaîne vide, nous pouvons
alors dire « j'ai
entendu quelque chose Sinon, je n'ai rien entendu. Et comme pour les
autres types de variables, nous pouvons supprimer la
comparaison et utiliser la variable elle-même
comme condition. toutes les variables, Pour toutes les variables,
leurs valeurs par défaut sont
considérées comme fausses, et tout le reste est toujours considéré comme vrai
lorsqu'il est utilisé comme condition. Si nous déclarons une variable
sans type, appelons-la comme
je veux, mais ne lui donnons pas de valeur, alors nous savons déjà que sa valeur
par défaut sera nulle. Même sans type ni valeur, n'importe quelle variable peut être utilisée
comme condition d'intimidation. Toute variable vide, c'
est-à-dire que sa valeur est nulle,
est considérée comme fausse. Si nous devions renseigner cette
variable avec un objet, sa valeur en tant que condition
serait considérée comme vraie Nous n'avons actuellement aucun
autre objet avec lequel jouer, mais nous pouvons toujours nous en servir nous-mêmes. Définissons donc la
valeur de ce que je recherche comme étant
le mot clé self. Et cela
se traduit par le fait de pouvoir voir. Dans la leçon suivante, nous utiliserons des boucles pour répéter plusieurs fois
des lignes de code. Je te verrai dans la prochaine leçon.
5. 0-4 Pendant Loops et opérateurs: Bonjour, mes amis. Aujourd'hui, nous allons apprendre à répéter plusieurs
fois des
lignes de code avec des boucles
en imaginant une
femme tombée amoureuse pour la première fois tenant une fleur Écrivons donc un nouveau
script et nommons-le fleur. Remplacez ensuite la définition des
nœuds de base de
la fonction prête. Notre dame imaginaire tient une fleur qui a un
certain nombre de pétales, nous allons stocker
dans une variable et restreindre son
type à un entier. Donnez-lui ensuite la valeur d'
un nombre arbitraire,
disons cinq. Nous déclarerons également une autre
variable nommée He Loves Me, sous forme de booléen, dont nous pensons qu'elle a pour valeur
par défaut false Nous pouvons commencer notre
script en imprimant une histoire sur la
femme amoureuse tenant sa fleur Elle retire chaque pétale de
la fleur un par un, disant soit il
m'aime, soit il ne m'aime pas abord, nous devons réduire d'un
le nombre de pétales
sur la fleur. Nous allons donc commencer par la variable du
nombre de pétales, puis utiliser l'opérateur d'assignation pour attribuer une nouvelle valeur à la
variable. La valeur que nous
voulons lui attribuer est le nombre qu'il
possède déjà moins un. Nous voulons ensuite modifier la
valeur de la variable booléenne. Il aime que je sois le contraire. Il m'aime donc, il n'est assigné
à rien. Il m'aime, inversant la valeur du
faux vrai ou vice versa Ensuite, nous pouvons imprimer
les résultats. Il m'aime. Nous souhaiterons peut-être encapsuler
cette partie entre guillemets, mais si nous essayons de mettre un
guillemet dans notre chaîne, il marquera plutôt
la fin de la chaîne Certains caractères spéciaux,
tels que les guillemets, peuvent être créés à l'intérieur d'une
chaîne à l'aide d'une barre oblique inverse Si nous écrivons un
guillemet inversé, cela représente désormais un
guillemet, non la fin de la chaîne Et nous pouvons en inclure une autre après la déclaration des Dames. Dupliquons cette
ligne et changeons la déclaration comme suit
: « Il ne m'aime pas ». Un autre exemple de caractère
spécial que nous pouvons écrire à l'aide de la barre oblique inverse
est la barre oblique inverse Nous pouvons également combiner
les deux lignes ci-dessus et
les séparer par une barre oblique inverse N, qui représente une nouvelle Ils sont donc imprimés
sur deux lignes de sortie à partir d'une seule instruction d'impression. Nous avons maintenant deux possibilités
que nous voulons afficher
en fonction de la valeur
de notre variable booléenne Il semblerait donc que nous devrions les
envelopper dans une déclaration if. S'il m'aime, alors imprime-le. S'il ne m'aime pas,
alors imprime-le. Mais dans les cas où les
instructions
dépendent d'une seule variable booléenne
pour apporter une modification mineure, il existe une méthode plus efficace Revenons donc
au format d'origine. Notre déclaration
sera qu'il m'aime, s'il m'aime, sinon il ne m'aime pas. Ce n'est pas la même chose qu' une instruction if malgré
l'utilisation des mêmes mots clés, mais c'est ce qu'on appelle une opération
ternaire Comme il ne crée
pas nouveau bloc de code
avec une indentation, il est en fait exécuté
plus efficacement et il est recommandé utiliser dans des cas simples
comme celui-ci Nous pouvons en fait
réduire encore plus
la taille de la variation en la remplaçant uniquement
par point d'
exclamation ou un espace suivi
du mot « non », puis du point d'exclamation Cela fonctionne dans le
cas s'il m'aime, mais si nous changeons la
valeur en true par défaut, alors nous ne verrons rien
dans l'autre cas. Tout comme les mathématiques, il existe un ordre spécifique d'opérations dans lequel nos scripts
exécutent plusieurs opérations
sur la même ligne. Étant donné que la chaîne append et le ternaire I sont
tous deux des opérateurs, l'un doit être exécuté
avant l'autre, et dans ce cas, il s'
agira de la chaîne Et comme en mathématiques, les crochets sont toujours les
premiers à être exécutés. Nous pouvons donc placer n'importe quelle
opération entre crochets pour assurer qu'elle sera exécutée en
premier dans l'ordre
des opérations. Encadrant notre
instruction ternaire entre crochets, elle s'exécutera désormais avant
l'ajout de la chaîne
et nous donnera le résultat attendu Nous avons donc maintenant notre bloc
de code qui doit être répété tant que la
fleur a encore des pétales. En utilisant le mot clé WW, un
peu comme une instruction if, nous pouvons répéter un bloc de
code
indenté tant que la
condition reste vraie La condition dans
ce cas étant que le nombre de pétales sur
la fleur ne soit pas nul. Quel que soit le nombre de
pétales sur la fleur,
il sera réduit
d'un à chaque fois. Ensuite, après l'instruction print, le flux logique de ce
script reviendra au début
du WWLoop
pour vérifier à nouveau la condition. Lorsque le nombre de
pétales atteint zéro, la condition n'est plus
remplie et la boucle interrompue et le script continue, s'il y en a un. Rédigons donc une
courte conclusion à notre histoire en
fonction des résultats. Elle se lève, les
larmes aux yeux. Mais selon la
valeur finale de He Loves Me, elle est heureuse ou triste, et nous imprimerons la phrase finale
différente. cours de cette scène, nous pouvons voir notre histoire imprimée
dans le panneau de sortie, et avec cinq pétales,
la dame est heureuse. Si nous changeons le nombre
de pétales à six, nous obtenons un résultat
différent puisque la boucle s'est répétée six
fois au lieu de cinq. Mais que se passera-t-il si nous réduisons le nombre de pétales
de la fleur à zéro ? La boucle ne tourne pas du tout, et l'amour était voué
à l'échec dès le début Je ne recommande pas de
suivre cet exemple, mais regardez simplement ce qui
se passe si nous donnons la fleur un
nombre négatif de pétales. Bien que cela
soit raisonnablement impossible, dans notre code, c'est
très problématique Comme la condition de notre boucle
murale ne sera jamais remplie, elle ne se brisera jamais et le script est piégé
à l'intérieur de celle-ci, sans jamais se terminer. Il s'agit d'une boucle infinie doit être évitée à tout prix. Dans ce cas, nous pouvons empêcher la boucle infinie en modifiant notre condition pour qu'elle soit si le nombre de pétales
est supérieur à zéro, car un nombre négatif
interrompra tout de même la boucle. Nous pouvons utiliser un autre opérateur réduire le nombre de
pétales comme raccourci. En éliminant le besoin d'écrire deux fois
le nom de notre variable, nous pouvons effectuer des opérations
mathématiques simples sur notre nombre de variables l'aide d'un opérateur d'
affectation spécial. Dans ce cas, l'opérateur moins
égal peut
remplacer cette ligne de code nombre de pétales
moins égal à un. Ces raccourcis existent pour toutes les
opérations arithmétiques de base, plus égal, multiplie égal
ou divise égal, et peuvent être utilisés avec n'importe quel nombre ou variable comme
autre opérande Il
existe également un autre opérateur pour l'
arithmétique de base, l'opérateur de module, représenté
par le signe du pourcentage Modulus effectue une opération de
division, mais ne renvoie pas
le quotient comme résultat comme le fait l'opérateur de
division Il renvoie plutôt le
reste de la division. Tout ce script, mis à part l'histoire racontée, ne
fait
que déterminer
si le nombre de pétales sur la fleur est
pair ou impair, mais il le fait de la manière la plus
inefficace possible, en comptant à rebours
chaque pétale Commentons donc
l'ensemble de la boucle murale et utilisons plutôt le module
pour accélérer le processus Sachant que tous les nombres pairs
sont divisibles par deux, nous pouvons utiliser le module du nombre de
pétales Le seul résultat possible le reste de cette
division sera soit zéro si le nombre de pétales est pair, soit un si le
nombre de pétales est impair. Notre script pourrait être
simplifié comme si le nombre de pétales modulus
deux est égal à un, alors la dame est heureuse Sinon, elle est triste. Puisque nous comprenons comment les
entiers sont interprétés
comme des conditions, nous n'avons même pas besoin d'effectuer
l'opération de comparaison ici et nous pouvons simplement la raccourcir à I nombre de
pétales module deux Le résultat de l'opération du
module peut être affecté directement à la variable booléenne pour obtenir le même résultat sans avoir
besoin d'une instruction if, et le zéro ou le un sera
automatiquement converti en
faux ou en vrai en Nous pourrions aller plus loin en supprimant la variable et en utilisant simplement l'opération du module directement dans l'instruction turny Dans la leçon suivante,
nous allons découvrir les ensembles de variables
associées. Je te verrai dans la prochaine leçon.
6. 0-5 tableaux et pour boucles: Bonjour, mes amis. Aujourd'hui, nous verrons comment organiser de
grandes quantités de variables, en particulier lorsqu'elles contiennent des informations
connexes. J'ai déjà créé un script nommé
census
et j'ai remplacé la définition des nœuds de base
de la fonction ready Pour le
scénario hypothétique présenté dans cette leçon, nous imaginons un
agent de recensement qui doit enregistrer nombre de personnes vivant dans chaque maison située sur une seule
route Nous pouvons déclarer une seule variable pour contenir toutes ces informations, nommons-la Main Street. Et le type de cette
variable sera un tableau. Un tableau peut contenir une liste de variables de
n'importe quel autre type. Dans ce cas,
les variables que nous
recherchons sont des nombres entiers, représentant le nombre de
personnes vivant dans chaque maison Nous pouvons spécifier le
type de contenu d' un tableau en utilisant des
crochets après le tableau de noms de type et en plaçant le type du contenu
entre crochets. Désormais, ce tableau ne peut contenir que
des entiers comme contenu. Avant de pouvoir accéder au
contenu d'un tableau, il doit avoir une taille, le nombre de variables
qu'il contient. Contrairement aux autres
variables, les tableaux sont plus complexes et ont
leurs propres fonctions Nous pouvons accéder à ces fonctions en suivant le nom de la
variable par un point, puis le nom de la fonction. Dans ce cas, la fonction de
redimensionnement, qui définit le nombre d'
adresses à l'intérieur de ce tableau, représente le nombre
de maisons sur Main Street, soit six Notre ville imaginaire est
un peu inhabituelle dans la
mesure où les numéros des maisons sur
Main Street commencent à zéro. Notre agent de recensement
commence donc par la maison située au zéro de la rue Main et
frappe
à la porte pour demander
au résident combien de personnes y
vivent Nous pouvons stocker une valeur dans un
tableau en commençant par son nom, puis en utilisant des
crochets pour marquer l'adresse de l'entier
spécifique, dans ce cas, l'adresse zéro, puis en utilisant l'opérateur
d'affectation. Nous pouvons attribuer un entier
à cette adresse. Supposons donc que cinq
personnes vivent dans la
maison numéro zéro de
Main Street. Passant à la maison suivante sur rue
principale, adresse numéro un, quelqu'un répond
lorsque l'on frappe à
la porte et dit au recenseur que deux personnes vivent
dans cette maison. À la maison suivante, à l'
adresse numéro deux, la maison est en construction
et porte un panneau « à vendre », ce
qui signifie qu'elle
est clairement inoccupée, et notre agent de recensement enregistre le nombre de
résidents comme zéro Au numéro 3 de la rue principale, personne n'ouvre la porte, malgré la
présence d'une voiture dans l'allée et de
signes d'occupation Quel est, selon nous le recenseur devant enregistrer le nombre
de résidents ? On pourrait penser qu'
il pourrait être nul. Mais comment faire la
différence entre un nombre inconnu d'occupants
et une maison inoccupée ? Si nous considérons que le
nombre d'occupants d' une maison ne doit jamais être
considéré comme un nombre négatif, nous pourrions utiliser le nombre
négatif un pour indiquer que le nombre d'occupants de la
maison est une valeur inconnue. Et au numéro 4 de Main Street, il n'y a, encore une fois, aucune
réponse à la porte. Mais la maison
semble également avoir été négligée, et personne n'
y habite probablement depuis un certain temps. Nous pouvons supposer que le
nombre d'occupants est égal à
zéro , utiliser la même valeur négative pour un nombre inconnu
d' occupants ou créer d'autres codes de valeur
négatifs pour différentes situations, par
exemple utiliser moins deux pour signifier probablement
inoccupé mais non confirmé L'adresse numéro 5 sur Main Street n'a
même pas de maison, mais c'est juste un terrain vacant. Encore une fois, cela peut être
représenté par un zéro ou une autre valeur négative pour
coder une sorte de réunion Imprimons les résultats
du recensement et voyons à
quoi ils ressemblent. Nous pouvons voir notre tableau
représenté sous la forme d'une liste de
nombres séparés par des virgules et
encapsulés entre crochets Cela représente bien
le nombre de personnes vivant
dans chaque maison de Main Street. Mais que se passerait-il si nous voulions utiliser ces données pour
connaître le nombre total d' occupants de toutes les maisons
de Main Street ou en moyenne ? Si nous calculions la somme
de tous ces nombres, les nombres inconnus
représentés par des négatifs
fausseraient les L'un des meilleurs avantages
de l'utilisation de tableaux pour stocker informations
connexes de cette manière est la facilité avec laquelle il est possible de
les parcourir en boucle À l'aide du mot-clé quatre, nous écrivons ensuite le nom
d'
une nouvelle variable, qui représentera chaque élément individuel du tableau, suivie du mot-clé in, puis du nom du tableau. Comme pour les fonctions, si les
instructions sont des boucles wa, sont suivies de deux points et d'un bloc de code en retrait
qui seront répétés Ces lignes de code
seront répétées une fois pour chacune de nos six
maisons de Main Street, et nous pouvons nommer la
variable house, car elle sera utilisée pour accéder à chaque maison individuelle à
l'intérieur de la boucle. Supposons que nous voulions d'abord connaître le nombre moyen d'occupants qui vivent dans une maison occupée. Cela signifierait additionner
tous les nombres positifs, puis les diviser par le
nombre de maisons occupées. Nous aurons donc besoin de trois
nouvelles variables, une pour le
nombre total d'occupants, une autre pour le nombre
de maisons occupées, toutes deux sous forme de nombres entiers, et un nombre à virgule flottante
pour la moyenne Pour chaque maison de Main Street, nous pouvons vérifier si la
maison est occupée, si le nombre enregistré dans
le tableau à cette adresse maintenant enregistrée dans la variable house est supérieur à zéro. Si tel est le cas,
le nombre total d'
occupants des maisons occupées
peut être augmenté par maison, et le nombre de
maisons occupées peut être augmenté d'une unité Une fois que les six maisons de Main
Street ont été inspectées, la boucle s'interrompt et nous avons
nos deux nombres entiers. Nous pouvons donc calculer la
moyenne en divisant le nombre total d'occupants par le nombre de maisons
occupées. Imprimez ensuite les résultats. Il y a plus de maisons occupées et plus de maisons occupées
sur Main Street, avec une moyenne d'occupants et d'
occupants majorés. Mais si nous exécutons ce code, la moyenne est représentée par
un entier,
trois, dont nous savons qu'
il n'est pas correct. Comme il y a au total sept occupants dans
deux maisons occupées, la moyenne devrait être de 3,5. Cela s'est produit
parce que nous avons effectué une opération de division
avec deux entiers, et le résultat de l'opération
sera également un entier, même si nous l'attribuons
à une variable numérique à virgule
flottante Godot fournit également un avertissement contre l'utilisation d'entiers
dans les opérations de division Pour résoudre ce problème, nous pouvons changer nos variables entières
en nombres à virgule flottante dans leurs déclarations, ou nous pouvons changer leur type localement avant d'
effectuer la division. De la même manière que nous avons transformé entiers en chaînes
avant de les ajouter, nous pouvons transformer un entier en nombre flottante
avant
d'effectuer une division Changer également le résultat
de la division en un
nombre à virgule flottante. La modification du type d'une variable cette
manière s'appelle le casting. Nous transformons un
entier en valeur flottante. Nous pouvons maintenant voir les résultats que nous attendions avec une moyenne de 3,5 occupants
par maison occupée. un des avantages de GD Script, étant un
langage à typage souple, est que nous n'avons pas besoin de spécifier les
types de nos variables, y compris les types
contenus dans un tableau Si nous autorisons notre tableau à
contenir n'importe quel type de variable, nous pouvons modifier la façon dont notre
agent du recensement enregistre les informations. Supposons que l'adresse zéro reste la même
avec cinq occupants. Mais la première adresse a également fourni les noms des deux
résidents qui y vivent. Au lieu d'enregistrer les
occupants sous la forme d'un chiffre deux, nous pourrions enregistrer leurs
noms dans une chaîne. adresse numéro un de Main Street est donc occupée par Jordan
et Ashley Smith. La maison numéro deux était inoccupée, ce que nous pourrions
représenter par un zéro Mais nous pouvons également envisager l'enregistrer sous forme de
booléen et de lui attribuer la valeur false
pour indiquer que la maison est en construction et ne peut pas avoir d'
occupants Au numéro trois,
personne n'était à la maison, mais il y a certainement
des gens qui y vivent. Nous ne savons tout simplement pas combien. Nous pourrions également stocker
cette valeur sous forme de booléen et lui
attribuer la valeur true Au numéro quatre, il
semble vraiment que personne n'y habite. Il se peut que nous voulions
le marquer comme zéro occupant. À l'adresse numéro cinq, puisqu'il n'y a
même pas de maison, nous pourrions
envisager d'utiliser null comme valeur puisque null représente
l'absence de toute valeur. Nous pouvons utiliser le mot clé null pour attribuer au
tableau à l'adresse 5. Notre tableau imprimé a maintenant un
aspect très différent, contenant
des variables de tous types au lieu de simples entiers Et nous pouvons en tirer plus
d'informations. Les tableaux peuvent même contenir d'autres
tableaux comme contenu. Nous allons donc changer notre
liste de noms d' une seule chaîne à
un tableau de chaînes. Nous pouvons créer ce
tableau en même temps qu'il est attribué à
l'aide de crochets, puis le remplir d'
une liste de chaînes séparées par des virgules comme contenu Donc, si nous voulions savoir combien de personnes vivent à la première
adresse sur Main Street, nous pourrions l'imprimer sous la forme
Mainstreet one point SIE Dans la leçon suivante,
nous allons découvrir d'autres utilisations des tableaux pour créer des collections de données plus
dynamiques Je te verrai dans la prochaine leçon.
7. 0-6 piles et fonctions: Bonjour, mes amis. Aujourd'hui, nous allons
continuer à travailler avec les tableaux de différentes manières en mettant en place un
jeu Old Made J'ai déjà créé un
script nommé Old Made et j'ai remplacé la définition des nœuds de base
de la fonction ready Pour jouer à l'ancienne, nous avons besoin d'un jeu de cartes, qui est un ensemble de variables que nous pouvons
contenir dans un tableau. Comme le jeu
Old Made ne se soucie pas vraiment de
la couleur des cartes, nous pouvons ignorer cette information, et chaque élément du
tableau doit uniquement contenir le rang des cartes de l'as
au roi sous forme d'entier. Pour générer notre deck,
nous pouvons utiliser une boucle à quatre boucles. Mais au lieu d'
utiliser la boucle
à quatre pour parcourir un tableau, elle peut simplement être utilisée pour compter
le rang de nos cartes En commençant par quatre,
nous pouvons déclarer une variable représentant le rang
d'une carte, suivie du mot clé in, puis spécifier un nombre. Si nous considérions
King comme un chiffre, ce serait le 13e rang. Pour l'instant, imprimons simplement le classement afin de voir ce qui se passe. Les quatre boucles commencent avec une valeur de rang nulle
et comptent jusqu'à 12, répétant cette boucle et en
imprimant l'instruction 13 fois. Pour des raisons de santé mentale, il peut être
judicieux de considérer carte numéro deux est
représentée par le rang deux, et donc As serait un et roi 13 Bien que démarrer une boucle à quatre à
zéro soit très utile pour itérer dans des tableaux puisque leur premier
numéro d'index est zéro, cela n'est pas très utile
dans ce cas Nous pouvons changer la façon dont
une boucle à quatre boucles compte en
remplaçant le 13 par un appel de
fonction, range. Les appels de fonction sont
suivis de parenthèses
contenant des arguments Les arguments de
cette fonction sont les
limites inférieure et supérieure de la plage. La limite inférieure sera
incluse dans la fourchette, mais pas la limite
supérieure. La plage 114 contiendra
tous les nombres de 1 à 13, nous pouvons voir qu'ils sont imprimés
dans la sortie Une autre façon d'
ajouter des informations à un tableau au lieu d'utiliser les crochets et numéro d'
index consiste à utiliser une
fonction nommée append Cette fonction d'ajout accepte un argument de la valeur
ajoutée au tableau Cela positionnera la
valeur ajoutée à
la fin du tableau,
où qu'elle se trouve. Et comme il y a quatre cartes de
chaque rang dans un jeu de cartes, une pour chaque couleur, nous devons répéter cette ligne de code
quatre fois pour chaque rang. Nous pouvons le faire avec quatre
autres boucles, commençant
cette fois à
zéro et en comptant jusqu'à quatre, mais sans inclure quatre. En imprimant le jeu, nous pouvons
voir que notre tableau contient quatre cartes de chaque numéro de 1 à 13 pour
un total de 52 cartes Mais pour jouer à l'ancienne, nous voulons supprimer
trois des reines, ou dans ce cas, 12. Donc, dans notre boucle à quatre étapes
qui consiste à parcourir
les combinaisons de cartes, vérifions si le rang est 12 Et dans ce cas précis, nous voulons uniquement autoriser l'ajout du
112, en utilisant le mot clé break pour
sortir instantanément de cette boucle. Break ne mettra fin qu'à la boucle la plus indentée dans
laquelle il se trouve actuellement Nous allons donc mettre fin
à la combinaison pour boucle, mais pas au rang pour boucle. Cela augmentera ensuite
le rang à 13 et ajoutera
quatre treizaines au deck Et en le testant, nous pouvons
voir qu'il n'y en a que 112. La première chose qui se passe dans notre jeu est de mélanger
le jeu de cartes,
ce qui, dans le script GD, est une simple
fonction intégrée de rayse Il suffit d'appeler
cette fonction et nous
pouvons voir que les cartes sont
mélangées dans notre deck Nous aurons également besoin d'
une autre variable, un tableau de mains de cartes
pour représenter nos joueurs. Chaque main du tableau doit contenir plusieurs cartes Ce sont
donc également des tableaux, que nous devrons initialiser
avant de pouvoir les utiliser Ainsi, en comptant de zéro
à quatre, mais sans compter quatre, nous pouvons ajouter une nouvelle
main au tableau Notre aiguille commence par un tableau vide représenté
par des crochets. Si nous imaginons notre jeu de cartes, le recto des cartes étant le côté marqué de la couleur et le verso vierge,
nous pouvons également imaginer
le jeu de
cartes face cachée. L'avant du tableau est
le bas du pont et l'arrière du tableau
est le haut du pont. Le processus de
distribution des cartes peut être effectué en
parcourant notre jeu de cartes, mais il n'est pas du tout nécessaire de faire
référence à des cartes spécifiques, car peu
importe leur nature, il suffit que la carte soit prise
du haut du jeu et
remise à un joueur Donc, pour retirer une carte
du haut du jeu, on peut appeler une autre fonction. Celui-ci s'appelle pop back. Il renvoie non seulement le
dernier élément du tableau, mais le
supprime également du tableau. Nous voulons ensuite ajouter cette carte à la main du joueur et nous allons
commencer par le joueur 1, en supposant que le joueur
zéro est le croupier. Tout comme nous pouvons utiliser la fonction pop
back pour retirer une carte, nous pouvons également ajouter une
carte avec pushback La carte que nous
plaçons sur le dos de la main du joueur est la même que celle que nous lançons
à l'arrière du jeu. Nous pouvons simplement mettre
cet appel
de
fonction entre crochets et utiliser sa valeur de retour comme
argument de la fonction push. L'utilisation du pushback est
exactement la même que celle de l'ajout. La fonction d'ajout est
un héritage de chaînes de caractères, car elles sont généralement stockées
sous forme de tableaux de caractères, tandis que les commandes push et pop proviennent de
l'utilisation de piles ou d'indices,
comme nous le faisons Pour distribuer notre prochaine carte, nous devrons augmenter la
main qui est distribuée Stockons cela
dans une variable sous forme d'entier et donnons-lui
une valeur initiale de un. En remplaçant celle de notre
index matriciel par notre variable, nous devrons l'incrémenter d' une après chaque carte distribuée Mais cela
ne comptera évidemment que jusqu'à 51, et il n'y a pas tellement de mains. Nous aurons donc besoin que ce
nombre revienne
à zéro chaque fois
qu'il atteindra quatre. Cela peut être accompli à l'aide notre opérateur de module fiduciaire, en assignant à hand un
module égal à quatre Mais si nous voulons que notre code fonctionne avec n'importe quel
nombre de joueurs, il serait préférable de remplacer
quatre par la taille
de notre tableau de mains. Pour voir où nous en sommes jusqu'ici, imprimons nos mains
en parcourant
le tableau des mains et en
imprimant chacune Imprimez ensuite le deck. Nous pouvons voir nos quatre tableaux
et le deck est vide. Nous pouvons même modifier le
nombre de joueurs et les cartes seront distribuées
au bon nombre de mains. Notre fonction prête à l'emploi
devient assez importante. Nous pouvons
mieux organiser notre code en déclarant
nos propres fonctions. En séparant notre logique
en petits morceaux, nous avons une section qui crée
notre jeu de cartes initial, une qui crée
les mains du joueur et une autre qui distribue les cartes En utilisant le mot clé funk, nous pouvons donner à chacun de
ces blocs de code un nom suivi de
parenthèses et Initialisez le deck,
initialisez les mains et distribuez. La fonction prête peut alors appeler chacune de ces
fonctions en séquence. Nos fonctions peuvent également
accepter des arguments, tels que le nombre de
mains que nous voulons avoir. Passons quatre comme argument. Pour écrire notre fonction
de manière à accepter l'argument, nous devons ajouter un paramètre
correspondant entre parenthèses
dans la déclaration de
la fonction Tout comme la déclaration d'une variable, elle a un nom et
éventuellement un type. Puisque nous l'utilisons
pour redimensionner un tableau, il est conseillé de le limiter
à un entier Nous pouvons alors utiliser le
paramètre à l'intérieur la fonction de la même manière que nous utiliserions
n'importe quelle autre variable. La dernière chose à
faire pour commencer à jouer
serait de retirer toutes les paires
de la main de chaque joueur. Ainsi, en parcourant chaque
main du tableau de mains, nous pouvons appeler une autre fonction pour retirer les paires
de cette main, en passant la main en argument donnant
une définition à cette fonction, nous pouvons alors accepter une main
comme paramètre de tableau. Nous devrons effectuer une itération dans
la main avec une variable. Appelons ça la carte 1. Mais nous pouvons nous arrêter avant
de passer à la dernière carte. Nous ne passerons donc que de zéro à la taille de la
main moins un. Nous pouvons ensuite itérer
une deuxième fois la même
manière, mais cette fois,
en par la carte une après autre et en allant jusqu'à la fin de
la taille de la main À l'intérieur de ces 24 boucles, cartes 1 et 2
contiennent désormais chaque paire
de cartes unique de notre main Nous pouvons
donc facilement comparer les deux cartes pour voir
si elles correspondent. S'ils le sont, ils peuvent être retirés de la main, en
commençant par la deuxième carte. Si nous retirions d'abord la première carte, l'index de la
deuxième carte changerait en fait, puisque toutes les cartes se
déplaceraient d'une position. Si nous trouvons une correspondance, nous ne voulons pas continuer
cette boucle ni l'une ni l'autre, mais nous voulons recommencer tout
le processus. Une façon simple de le faire
serait d'utiliser une boucle while, une variable
booléenne indiquant si nous avons
trouvé ou non une paire avec une valeur
par défaut vraie Lorsqu'une paire a été trouvée, nous pouvons immédiatement la
définir sur false. Cela nous permet d'
entrer dans la boucle mais ne pas rester ici à moins qu'
une paire ne soit trouvée. Dans d'autres langues, vous pouvez le
faire avec une boucle do
Wile à la place Si nous trouvons une paire, nous pouvons définir la variable sur true, puis également sortir des deux boucles en réinitialisant
la boucle while Si les quatre boucles terminent sans trouver
de paire correspondante, paire
trouvée sera fausse et
la boucle while sera interrompue. Nous pouvons exécuter notre
simulation à plusieurs reprises et voir qu' aucune des mains de nos joueurs contiendra jamais de paires
identiques, et les joueurs sont prêts à
commencer à jouer à Old Maid Dans la leçon suivante, nous
utiliserons une autre forme
de contrôle de flux. Je te verrai dans la prochaine leçon.
8. 0-7 Match et retour: Bonjour, mes amis. Aujourd'hui, nous allons utiliser une autre forme de contrôle de flux pour simplifier les conditions complexes. J'ai déjà créé un script nommé
months
et j'ai remplacé la définition des nœuds de base
de la fonction Ready Commençons par
déclarer une variable contiendra le mois en cours
et définissons-la janvier et une deuxième variable pour contenir le nombre de
jours du mois, comme
janvier et une deuxième variable
pour contenir le nombre de
jours du mois,
qui sera laissé à zéro par défaut. Nous pouvons imprimer une
phrase simple indiquant que le nombre de jours
en janvier est de 31. Mais d'abord, nous voulons
renseigner notre variable avec le nombre de jours en
fonction de la valeur du mois Écrivons donc une fonction
capable de faire exactement cela. Attribuez le nombre de
jours du mois
à renvoyer à partir d'une
fonction que nous allons écrire, qui acceptera le
mois comme argument. Pour donner
une définition à cette fonction, acceptant le mois comme
paramètre de type chaîne, elle a également besoin d'une
information supplémentaire, un type de retour. Le type de valeur renvoyé par
une fonction est défini après les parenthèses avec un tiret
et un trait d'union plus grand dans une flèche, suivi du nom du Dans ce cas, il s'agit d'un entier représentant le nombre
de jours du mois. Si nous ne spécifiez aucun type
de retour, le type de retour de toute fonction que nous écrivons est nul par défaut. Dans notre fonction, nous
devons renvoyer un entier, ce qui signifie que nous devons déclarer un entier en haut de celui-ci, et il devra contenir le
nombre de jours du mois. Ensuite, au bas
de la fonction, nous retournerons la valeur
contenue dans cette variable. Entre ces deux lignes, nous devons renseigner
notre variable avec le nombre de
jours correct en fonction du mois Si le mois est janvier, le nombre de jours est de 31. Nous avons appris précédemment
que nous pouvons proposer une alternative
avec le mot clé se, mais cela ne nous fournit deux options sur
les 12 dont nous avons besoin. Nous pouvons utiliser un autre mot clé, if, abrégé de se if pour fournir une autre condition qui sera vérifiée si la
condition d'origine était fausse. Sinon, si le
mois est février, le nombre de jours est de 28. Et nous pouvons le répéter
autant de fois que nécessaire, en argumentant
toutes les possibilités. Mais bon nombre de ces options
ont le même résultat, soit 30 jours, soit 31 jours. Nous pourrions améliorer considérablement
l'efficacité de cette
instruction if en combinant
le résultat le plus courant, 31 jours par défaut, et en les
remplaçant tous un seul
mot clé else à la fin Donc, si le mois n'est pas février ou un mois de 30 jours, le nombre de
jours doit être de 31. Tous les cas aboutissant
à un délai de 30 jours peuvent également être combinés en une seule déclaration à
l'aide de l'opérateur or. Si le mois est septembre ou si le mois est avril ou
si le mois est juin, ou si le mois est novembre, le nombre de jours est de 30. Mais la déclaration est assez
longue, avec plus de cas, elle risque de disparaître de l'écran. Pour des
déclarations simples au cas par cas comme celle-ci, il existe un
mot clé plus propre
et plus facile à utiliser que l'
instruction I appelé match. La correspondance est suivie
du nom d'une variable, deux points puis d'un bloc de code
indenté. À l'intérieur d'un bloc de correspondance, nous pouvons spécifier un nombre quelconque de cas
spécifiques pour la
valeur de la variable. Commençons par le mois de février. Le cas est également suivi deux points et
d'un autre bloc de code en
retrait. Ce code ne sera exécuté si la valeur du
mois est février. Nous pouvons regrouper les cas
dans une liste séparée par des virgules. Notre
condition relative aux déclarations I peut donc être réduite à une
liste de quatre mois seulement. Si la valeur du mois est
septembre, avril, juin ou novembre, le nombre
de jours sera défini sur 30, et notre bloc peut
être remplacé par
un caractère générique représenté
par un trait de soulignement, fixant le nombre
de jours à 31 si la valeur du mois est
autre que celle spécifiée ci-dessus Cela revient à utiliser la
valeur par défaut dans d'autres langues. Chacun de ces blocs de
code est appelé branche. Et dans le script GD, une
instruction match n'exécutera
que la branche
supérieure
dont la condition est remplie Dans d'autres langages, cela ressemble à une instruction
switch, mais diffère en ce sens que les instructions
switch peuvent exécuter plusieurs branches si plusieurs conditions sont remplies. En raison de cette restriction, il n'est pas nécessaire d'inclure des
pauses dans les branches de match. Si nous voulions imprimer le nombre de jours
de chaque mois, nous devrions probablement
utiliser une boucle, mais nous ne pouvons pas simplement
compter ou incrémenter une chaîne comme janvier pour devenir février d'une
manière Il est donc courant dans le code, lors représentation d'éléments
qui existent dans un ordre séquentiel,
de les placer dans une liste numérotée appelée
énumération Une énumération dans un script GD n'
est qu'un groupe de constantes
connexes Nous pouvons avoir une constante pour
janvier avec une valeur de un, une autre pour février avec
une valeur de deux, etc. Mais en utilisant le mot clé Enum, nous pouvons nommer le
groupe de constantes, nommons-le mois
suivi d'accolades À l'intérieur des accolades, nous pouvons regrouper les constantes et un numéro leur sera attribué automatiquement en fonction de leur
position dans cette liste Tout ce qui
se trouve entre accolades n'a pas besoin de
rester sur une seule ligne et peut être décomposé dans format
que vous préférez
pour le rendre plus lisible L'indentation n'a pas d'importance ici, mais généralement, lorsque vous écrivez
quelque chose entre accolades,
la plupart des codeurs mettent en retrait le contenu,
ce qui ressemble
à ce qui ressemble Bien que je préfère que les bretelles
soient alignées verticalement, nombreux codeurs préfèrent placer l'orthèse d'ouverture sur la ligne de
déclaration Tout comme Constance, les entrées
d'énumération sont classiquement nommées
en majuscules en forme de serpent Maintenant que nous avons une énumération, le mois peut être limité au type de cette énumération Nous pouvons également lui attribuer une
valeur issue de l'énumération, commençant par son nom,
suivi d'un point, puis de l'entrée dans la liste Le mois ajouté à
la chaîne de sortie n'est plus une chaîne en soi et doit être converti en chaîne avant de
pouvoir être ajouté L'argument transmis
au nombre de jours n'est plus une chaîne et est désormais un mois, et nous pouvons modifier notre fonction pour accepter également un mois en tant que
paramètre. Comme le mois est désormais un
mois, et non une chaîne, nous devons modifier
nos conditions pour qu'elles correspondent en utilisant le nom de l'énumération
suivi d'un point, puis les entrées de la liste Mais lorsque nous
imprimons les résultats, nous constatons qu'au lieu de janvier, notre mois est écrit
sous la forme du chiffre zéro. Bien que le type de notre
variable soit un mois, qui est une énumération, la valeur réelle est
traitée comme un entier, sa position dans
l'énumération Comme janvier est
la première entrée, sa valeur sous forme d'entier est zéro. Il y en aurait
un en février, et cetera. Cela nous permet de modifier
la valeur du mois à l'aide d'une
simple arithmétique, sorte que janvier plus un
devient février Si nous enroulons ce code dans une
boucle qui se répète 12 fois, nous pouvons facilement itérer pendant
les 12 mois Mais qu'en est-il de l'écriture du
nom du mois sous forme de chaîne ? Nous pourrions le faire
de différentes manières. Notre type d'énumération possède
une propriété nommée keys, qui correspond à toutes nos entrées
sous forme de tableau de chaînes Si nous indexons ce tableau
à l'aide de notre variable entière, il nous donne le nom de l'entrée sous forme de chaîne correspondant à
ce nombre. Mais conformément à la convention de dénomination Upper Snake
Case, il se peut que
nous ne souhaitions pas
imprimer le nom de cette façon. Nous pourrions plutôt renommer toutes
nos clés d' énumération en cas de
Pascal, ou nous pourrions déclarer une constante contenant
le tableau de chaînes, contenant tous les noms de nos mois dans un format plus présentable Utilisez ensuite le mois comme
index dans ce tableau. Une autre chose que nous pouvons faire
avec les énumérations est définir
manuellement les valeurs des entrées à
l'aide de l'opérateur d'
affectation Disons que nous voulons que le mois
de janvier soit un au lieu de zéro. Les autres entrées
mettront automatiquement à jour leurs valeurs pour passer d'une valeur
à une. Le mois de février est
donc désormais de deux Mais cela ne correspond plus
aux indices constants du tableau. Donc, si nous voulions l'utiliser pour écrire le
nom des mois, nous devrions soit ajouter une entrée vide pour l'index zéro, soit en soustraire une du mois tel qu'elle est utilisée
pour indexer le tableau Dans la leçon suivante, nous
en apprendrons davantage sur
la façon dont le moteur utilise et
exécute nos scripts Je te verrai dans la prochaine leçon.
9. 0-8 Arbre de scène et héritage: Bonjour, mes amis. Aujourd'hui,
nous allons découvrir comment le moteur utilise l'
arborescence des scènes pour exécuter nos scripts. Je n'ai pas encore attaché de script au
nœud racine de l'arbre des scènes, mais nous allons plutôt commencer cette
leçon en ajoutant d'autres nœuds. En cliquant avec le bouton droit sur le nœud racine, puis en sélectionnant Ajouter un nœud enfant, toujours un nœud normal, nous pouvons le renommer en président et prétendre que notre arbre de scènes est
la structure d'une entreprise Le nœud président est indenté car il est un enfant du nœud racine de
la scène Lorsqu'un nœud est sélectionné,
nous pouvons également utiliser le raccourci Control
A ou Command A pour ajouter un autre nœud enfant. Appelons celui-ci directeur
des opérations, et il est mis en retrait un autre niveau parce qu'il s'agit
d'un enfant du président Attachons maintenant un nouveau script
au nœud président
et nommons-le employé. remplaçant la
définition des nœuds de base de la fonction
ready, nous pouvons simplement imprimer le nom de ce nœud et ajouter est prêt Ce script peut être
attaché à plusieurs nœuds. Attachons donc le même script
au
nœud du gestionnaire des opérations en le faisant glisser de l'onglet
du système de fichiers
vers l'arborescence de la scène Exécutez ensuite la scène
pour voir ce qui se passe. Nous pouvons voir que le directeur
des opérations est prêt, puis que le président est prêt. Les deux nœuds auxquels le script est
attaché exécutent le script, et comme ils ont des noms
différents, le résultat était différent. Nous pouvons également constater que
le directeur des opérations était prêt avant que le
président ne soit prêt. Pour comprendre pourquoi nous
devrons ajouter des employés. Le directeur des opérations
supervisera un certain nombre d'opérateurs. Je vais ajouter un autre nœud enfant
au gestionnaire des opérations
et le nommer opérateur un. Joignez ensuite le script de l'employé. Nous pouvons cliquer avec
le bouton droit sur n'importe quel nœud sauf le nœud racine et sélectionner Dupliquer pour en créer
une copie. Le nom des doublons inclura
automatiquement
un nombre croissant, sorte que nous pouvons avoir l'opérateur deux, trois et quatre, Étant donné
qu'un script était attaché au nœud que nous avons dupliqué, le même script est également attaché aux copies créées Comme les opérateurs ont le même
niveau d'indentation et sont tous des enfants du directeur des
opérations, ils sont appelés frères et sœurs, et les frères et sœurs ne sont pas autorisés
à porter le même nom Notre entreprise doit avoir
plus d'un département, dupliquons
donc l'
ensemble du département des opérations en dupliquant le responsable des
opérations Tous les nœuds enfants
sont également dupliqués. Comme les opérateurs
ne sont pas des frères et sœurs directs, ils sont autorisés à conserver
leur nom d'origine. Renommons le responsable en directeur
du marketing,
et il n'y aura
que deux spécialistes du marketing dans
leur équipe Les nœuds parents peuvent
également être réduits pour masquer leurs enfants ou
étendus pour les afficher. Tous les employés
de cette entreprise ont le même
script d'employé attaché à eux. Exécutons donc la scène pour avoir une meilleure idée de l'ordre dans lequel les scripts
seront exécutés. Nous pouvons voir que le premier opérateur est
le premier à être prêt, suivi de chaque
opérateur dans l'ordre, et enfin, du responsable
des opérations. Il en va de même pour le service
marketing. Enfin, le président de l'entreprise est le
dernier à être prêt. Comment Gadot décide-t-il de
cet ordre d'exécution ? Le moteur démarre en haut de l'arborescence des scènes
et descend, mais il
considère qu'aucun nœud n'est prêt tant que tous ses
enfants ne sont pas prêts. Le président
n'est donc pas prêt parce que le
directeur des opérations n'est pas prêt. Le directeur des opérations n'est pas prêt car les
opérateurs ne le sont pas. Les opérateurs sont
prêts dans l'ordre, puisqu'ils n'ont pas d'enfants. Une fois que tous les
opérateurs sont prêts, le
responsable des opérations est prêt. Mais le président
n'est toujours pas prêt parce qu'il a un autre
enfant qui n'est pas prêt. Le directeur du marketing n'était pas prêt avant que tous les
spécialistes du marketing ne soient prêts, et finalement, le président
est le dernier à être prêt Comme aucun script
n'est attaché au nœud racine, sa fonction prête est celle d' un nœud par défaut, qui est vide. Outre le mode prêt, il existe
d'autres fonctions du nœud que nous pouvons remplacer pour être exécutées
ultérieurement une fois qu'un nœud est prêt Le plus courant est le processus, également précédé d'
un trait de soulignement Le moteur fera de
son mieux pour exécuter la fonction
de traitement de chaque nœud de l'arborescence des scènes 60 fois par seconde en utilisant la fréquence d'images par défaut
du projet. Le processus utilise donc un
paramètre nommé Delta, qui est un
nombre à
virgule flottante représentant le nombre de secondes
écoulées depuis la trame précédente. Donc, la plupart du temps, ce
sera un soixantième, mais pas toujours. Nous n'avons pas besoin d'utiliser ce
paramètre pour quoi que ce soit aujourd'hui Nous pouvons
donc commencer le nom de ce paramètre par
un trait de soulignement Gudo sait
donc que nous n'avons pas besoin de l'utiliser et que nous
ne devrions pas nous en soucier Mais pour annuler
la fonction de processus, elle doit avoir le même nombre
et le même type de paramètres Demandons à nos employés de travailler sur chaque image en
imprimant une déclaration indiquant que leur nom
en annexe fonctionne Dans cette scène, nous constatons que tous nos employés
travaillent d'arrache-pied rédigent leurs relevés imprimés
60 fois par seconde. Ce n'est pas la même chose qu'une boucle
infinie, car le travail est réellement effectué comme prévu et
rien n'est cassé. Faisons en sorte que cela soit un
peu plus facile à comprendre en n'
autorisant chaque employé à
effectuer qu'une seule unité de travail en utilisant une variable Bolan ayant effectué un travail avec une valeur
par défaut fausse Dans la fonction de processus, si l'employé
n'a effectué aucun travail, il le fera et
remplacera la valeur par true. Un soixantième de seconde plus tard, comme la variable est vraie, ils ne fonctionneront plus. Mais si nous déclarons cette variable dans la fonction de processus, elle n'existera que dans la fonction de processus et uniquement pour une seule
itération de celle-ci image suivante, lorsque la fonction de
processus est
exécutée pour la deuxième fois, la variable est déclarée à nouveau et sa
valeur par défaut est toujours false Cela n'aura donc aucun effet. Pour que notre variable persiste, elle doit exister en dehors du contexte de la fonction de
processus. Nous allons donc le déclarer en dehors de la fonction sans
aucune indentation Les variables déclarées ici
sont accessibles n'importe où dans
l'ensemble du script. Ce concept, appelé
scope, est l'une des principales raisons pour lesquelles nous utilisons l'
indentation dans nos scripts Nous pouvons donc voir quelles variables
existent dans quelle portée. Maintenant,
nous pouvons voir chacun de nos employés déclarer
qu'il est prêt à travailler. Ensuite, une fois que
tout le monde est prêt, chacun effectue une unité de travail, mais maintenant dans un ordre différent. L'ordre dans lequel les nœuds
et l'arbre de scène exécutent leurs fonctions de processus suit l'ordre exact de l'
arbre de scène de haut en bas. Les parents n'ont pas besoin d'attendre leurs enfants grâce à
la fonction Ready. Il se peut que nous souhaitions que tous les employés
de notre
entreprise soient similaires, mais pas
exactement identiques. Le travail d'un manager n'est pas vraiment le même
que celui d'un travailleur. Nous pouvons utiliser l'héritage pour créer différents comportements
pour des objets similaires. De la même manière, nous écrivons
des scripts qui étendent les nœuds, mais en modifiant la façon dont ils sont
préparés et traités. abord, nous devons
donner à ce script un nom que nous pouvons
utiliser comme référence, en utilisant le nom de classe du mot-clé, suivi d'un nom décrivant le comportement
du script, généralement le même que
le nom du script, mais écrit en
majuscules en Pascal. Maintenant que le moteur sait qu'il s'
agit d'un employé, créons un nouveau script
et nommons celui-ci manager. Mais au lieu d'
hériter du nœud, nous pouvons
cette fois
hériter de Étant donné que notre
script de responsable étend le nombre d'employés, tout ce qui est écrit dans
le script
d'employé s'applique toujours à celui-ci, mais nous pouvons en ajouter d'autres
ou apporter des modifications. Un manager est toujours un employé, mais sa façon de
travailler est différente. Nous devons remplacer le
script attaché à nos nœuds de gestionnaire par
le nouveau script de gestionnaire. Oublions la
définition de la fonction
prête donnée par l'employé définition de la fonction
prête donnée par l' Ainsi, lorsqu'un responsable est prêt, ne
se contente pas de dire
qu'il est prêt, mais qu'il dit que
l'ensemble de son département est prêt. Pour que nos deux
responsables
puissent afficher le nom
de leur département, ils auront besoin d'une
variable contenant
le nom de leur
département sous forme de chaîne. Mais comment pouvons-nous
renseigner cette variable pour qu'elle contienne des valeurs différentes
pour les différents départements ? Si nous procédons à notre déclaration de
variable avec la balise lors de l'exportation, cette variable deviendra accessible par d'autres parties
du moteur Gadot, à savoir le panneau d'inspection Pour qu'une variable
soit exportée, elle doit être déclarée au niveau de
la portée du script. En sélectionnant le
responsable des opérations et le scénario, il existe désormais un champ dans le panneau de
l'inspecteur dans lequel nous pouvons attribuer une valeur de chaîne à la
variable du département Ainsi, le responsable des opérations et le responsable marketing peuvent chacun avoir leur
propre valeur pour cette variable que nous
pouvons facilement contrôler. cours de la scène, nous pouvons constater
que les nœuds auxquels attaché
le script du responsable déclarent
désormais que leur
service est prêt, tandis que les autres
employés utilisent tous la définition précédente
dans le script de l'employé. La fonction de processus dans le script d'
employé est également héritée par les responsables et
est exécutée de la même manière qu'auparavant. Nous allons donc modifier la fonction de processus de notre
responsable. Les managers diront
quelque chose de différent. Name plus permet
aux employés de faire leur travail. La variable has done work du script
de l'employé a également été héritée et n' pas besoin d'être déclarée
ici pour être utilisée. En fait, nous ne pouvons pas déclarer une
variable portant ce nom car cela provoquerait un conflit avec la variable héritée
du même nom. Reprenons les choses en
main et voyons comment nos managers font désormais leur travail différemment
des autres employés. Dans la leçon suivante, nous en apprendrons
davantage sur l'utilisation des nœuds dans l'arbre des scènes et sur les principes de conception
orientée objet. Je te verrai dans la prochaine leçon.
10. 0-9 Abstraction et encapsulation: Bonjour, mes amis.
Aujourd'hui, nous allons découvrir comment écrire des classes
plus faciles à utiliser et à comprendre. Imaginer une voiture comme
cadre de référence. Créons deux
nœuds dans notre scène, un conducteur et une voiture en
tant qu'enfant du conducteur. Attachez ensuite un nouveau script
à chaque script portant le même nom. Les voitures sont des machines
très complexes, et la plupart des personnes qui les conduisent n'
ont aucune idée de
leur fonctionnement réel. Ils ne savent que
conduire leur voiture. Commençons par le script car et donnons-lui un nom de classe de voiture, puis ajoutons une variable pour l'année de la
voiture sous forme d'entier. Un autre pour la
marque de la voiture sous forme ficelle et
un autre pour
le modèle également sous forme de ficelle. exportant tout cela, je vais configurer ma voiture pour qu'elle soit
une Honda Civic 2007. Lorsque vous créez une nouvelle classe, veillez à enregistrer le script
avant d'essayer de l'utiliser. Dans le script du conducteur, le conducteur aura besoin d'une
référence à la voiture, que nous pouvons enregistrer dans une
variable de type car. Les nœuds peuvent accéder à d'autres
nœuds de l'arborescence des scènes, le plus souvent à leurs enfants en utilisant une autre balise similaire à
export appelée « ready ». En utilisant le tag on ready, nous pouvons attribuer la
valeur de la variable une fois que le nœud est prêt, ce qui signifie que tous ses
enfants sont également prêts, mais avant d'appeler la
fonction ready de ce nœud. Nous pouvons l'attribuer à
la valeur de retour d' un nœud G intégré à la fonction, qui accepte le
chemin d'un nœud en tant que paramètre. Si nous indiquons le nom
du nœud enfant
entre guillemets, nous avons désormais une référence
au nœud enfant stockée
dans une variable, et nous pouvons accéder à ses
propriétés et fonctions, y compris celles
du script joint. Outre la définition
de la fonction prête, nous pouvons accéder au nœud de la voiture et en imprimer
l'année, la marque et le modèle La fonction ready est exécutée
après les balises on ready. Un raccourci existe pour la fonction get node
afin de faciliter cette opération, le signe dollar,
suivi du même chemin de nœud. Revenons au script car et
ajoutons une autre variable. Celui-ci spécifie si le moteur
fonctionne ou non en tant que booléen En tant que conducteur, nous savons si
le moteur tourne et nous pouvons
décider si le moteur tourne ou non, car nous pouvons choisir de démarrer ou d'
arrêter le moteur à l'aide de la clé. Nous considérerions donc cette
variable comme publique. Une autre propriété de notre
voiture pourrait être le nombre de cylindres dans le
moteur sous forme d'entier, et je vais lui attribuer
une valeur de quatre. C'est quelque chose que le
conducteur n'a pas besoin de savoir, qu' ne
peut pas facilement accéder et il ne devrait jamais être
autorisé à modifier. Ainsi, contrairement à la variable publique, celle-ci serait
considérée comme privée, et nous pouvons la marquer comme privée en faisant suivre son
nom d'un
trait de soulignement Dans le script du pilote, nous pouvons
régler la valeur du moteur sur true en mettant la clé sur le contact d'allumage
et en le tournant. Mais d'abord, il faut
appuyer sur la pédale de frein. Utilisons une fonction pour régler la pression appliquée sur
la pédale de frein, dont nous supposerons qu'elle peut atteindre un maximum de 20
kilogrammes. Donc, pour démarrer notre voiture,
nous devrions probablement régler la pression de freinage
à environ 10 kilogrammes. De retour dans le script de la voiture, nous devrons définir cette fonction qui permet de régler
la pression de freinage. Comme le moteur fonctionne sur une variable, cela s'appellerait
une fonction publique, puisqu'elle est utilisée
par un autre script. Cette fonction accepte
un nombre à
virgule flottante comme paramètre
représentant
la pression
appliquée à la pédale. Mais que fait réellement la
voiture lorsque nous exerçons une pression sur
la pédale de frein ? Du point
de vue du conducteur, celui-ci choisit d'
appliquer une certaine pression sur la pédale sans jamais connaître la position exacte. Du point de vue de la voiture, la position de la
pédale qui est mesurée et
utilisée pour arrêter la voiture. La voiture utilise la position de la pédale de frein pour ajuster
la pression appliquée aux étriers qui maintiennent les plaquettes de frein contre
les roues de la voiture, sans parler de la complexité des freins antiblocage
ou d'autres systèmes Donc, si nous
programmions réellement une vraie voiture, nous devrions écrire
ici
plusieurs fonctions complexes qui convertissent
la simple action du conducteur qui applique une
pression sur la pédale de frein à la mécanique complexe
de compression des étriers Cela fait partie des fonctions
internes de
la voiture et non de tout ce
qui est contrôlé ou accessible au conducteur par un
autre moyen que
l' autre moyen que application d'une pression
sur la pédale de frein. Nous considérons donc qu'il
s'agit de fonctions privées, puisqu'elles ne sont destinées qu'à
être utilisées par la voiture elle-même. Et nous pouvons marquer nos réceptions
privées
en faisant précéder leur nom d'un
trait de soulignement Notez que c'est la même chose que les fonctions de processus et de préparation. La façon dont GDScript utilise des variables et des
fonctions
privées ressemble davantage à la façon dont les autres langages
utilisent des variables protégées, dans la mesure où elles sont
accessibles aux héritiers GD Script n'
applique pas réellement ces règles de confidentialité Cependant, GD Script n'
applique pas réellement ces règles de confidentialité et les scripts peuvent
toujours accéder à des membres privés Ces conventions
existent uniquement pour
faciliter une meilleure
structure et une meilleure conception des classes. Une autre façon d'utiliser les
commentaires dans GD Script consiste à créer des régions de nos
scripts associées, en utilisant le mot clé region suivi du
nom de la région Nous pouvons terminer une région à l'aide
du mot clé et de la région. Créons donc une région
publique et
une région privée
dans notre script automobile, séparant ce qui devrait être accessible au conducteur
de ce qui ne le devrait pas. Pour simplifier les choses, supposons que le
conducteur puisse uniquement démarrer ou arrêter
le moteur,
exercer une pression sur l'accélérateur, appliquer une pression sur
la pédale de frein ou tourner le volant Ce qui se passe réellement
dans le cadre de
chacune de ces fonctions publiques, c'est la mécanique interne
de la voiture elle-même. Le conducteur n'a pas besoin de savoir comment tout cela fonctionne
pour faire fonctionner le véhicule. Par exemple, lorsque vous
appuyez sur la manette
des gaz, des la voiture ouvre une
soupape d'admission d'air sur le moteur, laissant entrer plus d'air et
d'oxygène dans le moteur La voiture doit donc utiliser un
capteur pour mesurer le
débit d' air et la quantité d' oxygène qui
s'écoule actuellement dans le moteur Utilisez-le ensuite pour
ajuster la quantité de carburant injectée dans
les cylindres du moteur. Toutes ces fonctions
sont privées, car nous n'avons pas besoin
de savoir à quoi elles servent
réellement
pour conduire la voiture. façon dont notre voiture se déplace
dépend de la fonction du processus, et nous aurons besoin d'une autre
variable privée nommée phase pour représenter dans laquelle
des quatre phases se trouve actuellement chaque cylindre. Dans la fonction de traitement de la voiture, si le moteur tourne, nous pouvons itérer dans chacun des
cylindres du moteur En additionnant le
cylindre et la phase, puis le module quatre, nous obtenons une phase différente
pour chaque cylindre faisant correspondre ce nombre, nous
pouvons indiquer à chaque cylindre d'
effectuer une
phase différente, la course d'admission, course de
compression, la course de
combustion ou la course d'échappement, chacun acceptant le
cylindre comme argument. Augmentez ensuite la phase
et revenez à zéro
lorsqu'elle atteint quatre. Chacune de ces fonctions peut ensuite contrôler les soupapes d'admission, soupapes
d'échappement, les injecteurs de carburant et les bougies d'allumage de chaque
cylindre pour faire fonctionner le moteur La force
produite par les coups de combustion de chaque cylindre ferait
alors
avancer la voiture pendant que les
plaquettes de frein essayaient de l'arrêter et que la position du volant
changeait de direction. La position de la voiture
serait alors modifiée en fonction de la direction, la vitesse et du temps Delta. Ne vous inquiétez pas si rien de tout
cela n'a de sens pour vous car c'est précisément
le but de cette leçon. Tu n'as pas besoin
de le comprendre. Comme tout cela se trouve dans la zone
privée du script, le conducteur n'a pas besoin de savoir comment tout cela fonctionne
pour conduire la voiture. leur suffit de savoir comment utiliser la zone publique
du script. La séparation du public
et du privé impose deux principes importants de la programmation orientée
objet encapsulation est
le domaine public, qui donne accès à des variables ou
fonctions
publiques faciles à
utiliser et simples à comprendre,
tandis que l'abstraction est
le domaine privé, masquant les détails de systèmes ou de
mécanismes
complexes qui
n'ont pas besoin d'être compris pour être
utilisés efficacement Vous saurez si vos
cours respectent ces principes si
vous pouvez masquer tous
les contenus privés tout en comprenant facilement
comment ils sont censés être utilisés. Notre conducteur peut donc désormais
simuler la conduite d'une voiture en accédant uniquement aux
zones publiques du script de la voiture, agisse d'appuyer sur le
frein et de démarrer le moteur, de
relâcher le frein, appuyer sur la manette des gaz, de tourner le volant, etc. Ces principes sont non seulement importants pour nos propres scripts, mais ils nous permettent également d'
utiliser des scripts écrits par d'autres développeurs sans bien comprendre
leur fonctionnement interne. Ils rendent également les
scripts R plus flexibles. Imaginez si nous remplacions notre voiture à essence par
une voiture électrique Y a-t-il quelque chose à changer dans
le script du pilote ? Seul le script de voiture
devrait être modifié pour un script de voiture
électrique, car toutes les variables et
fonctions
publiques existeraient toujours
dans le script de voitures électriques. De même, nous pourrions également remplacer le script du pilote par
un script de pilote automatique, qui n'a besoin que
d'une destination et qui sera automatiquement capable de
faire fonctionner la voiture Dans la prochaine leçon,
nous en apprendrons encore plus sur les principes de
conception orientée objet. Je te verrai dans la prochaine leçon.
11. Polymorphisme 0-10: Bonjour, mes amis. Aujourd'hui,
nous aborderons le dernier des principes de programmation orientée objet,
le polymorphisme étendant les concepts d'
héritage et d'abstraction, nous pouvons écrire des classes qui représentent un concept plus
abstrait, une collection de
classes plus spécifiques liées. Prenons l'exemple des animaux en créant
un script nommé animal
qui étend le nœud, mais nous n'avons pas besoin d'attacher ce script à aucun nœud
de l'arborescence des scènes. Ici, nous pouvons donner un nom de classe au
script, puis définir des propriétés et des comportements
communs à tous les animaux, comme une variable contenant
le pluriel de l'
animal sous forme de chaîne,
et une autre pour le nom
d'un groupe de cet animal Et définissons également une
fonction permettant à l'animal de bouger, de manger ou de parler. Bien que nous puissions facilement définir le pluriel d'animal comme des animaux, il n'existe pas de mot pour désigner
un groupe d'animaux Nous ne pouvons pas non plus définir la
façon dont un animal se déplace ou mange sans savoir de
quel type d'animal il s'agit. Les corps de ces
fonctions peuvent donc rester vides. Mais nous pouvons considérer que certains
comportements sont
suffisamment courants pour qu'ils aient
une valeur par défaut, comme le fait de parler. Bien que de
nombreux mammifères produisent une grande
variété de bruits,
ce pas le cas de
la majorité des animaux, y compris les poissons et les insectes La plupart des gens ne les
décriraient pas comme parlant. Ainsi, lorsque nous demandons à un animal de parler au
hasard, nous pouvons considérer que le
comportement par défaut est le silence. Ajoutons donc
différents animaux à notre arbre de scènes, en
commençant par un chat. Nous pouvons maintenant utiliser l'héritage, comme nous l'avons fait auparavant,
pour créer un certain nombre de scripts animaliers
différents qui héritent d'un animal comme un chat Nous allons ensuite remplacer
la fonction ready pour donner aux variables
héritées de l'animal une valeur
appropriée pour un chat Le pluriel serait chats, et un groupe de chats s'
appelle un Clouder Les fonctions comportementales
peuvent également être remplacées pour transformer le comportement de
parole silencieuse Les chats marchent sur quatre
pattes pour se déplacer, et je dirais qu'ils mangent du poisson. Le contenu réel de ces variables et
fonctions n'est pas pertinent, mais l'accent est mis sur la façon dont
elles sont
héritées du concept abstrait d'un animal à une
instance plus spécifique d'un chat. Nous pouvons répéter ce processus pour créer de
nombreuses autres espèces d' animaux à ajouter à notre
arbre de scènes, comme un oiseau ou un poisson. Et en dotant chacun un nouveau script
hérité d'animal, chacun peut fournir
ses propres valeurs uniques pour les variables et
les
implémentations
des fonctions
dont variables et
les
implémentations
des il a Le pluriel de « oiseau » est « oiseaux ». Un groupe d'oiseaux
s'appelle un troupeau. Ils volent pour se déplacer, ils mangent des vers et
ils gazouillent pour parler Je vais prendre une longueur d'avance
sur mon script fish en copiant le contenu
du script cat. Et le pluriel de poisson est poisson Un groupe de poissons s'
appelle un banc. Ils nagent pour se déplacer, ils mangent des algues, mais
ils ne parlent pas. En omettant la fonction speak, poisson utilisera la définition
héritée du
script animal pour parler Jusqu'à présent, nous n'avons fait qu'utiliser
les principes orientés objet nous connaissons déjà pour hériter, abstraire et encapsuler
les propriétés
et les comportements des animaux Mais tout cela nous permet d'
utiliser le polymorphisme en traitant tous les animaux comme s'ils étaient égaux et
interchangeables Ajoutons d'abord un script
au nœud racine de notre scène et appelons-le Zoo, en
héritant du nœud Notre zoo regorge d'animaux
différents, mais peu importe ce que sont réellement
ces animaux. Outre la définition de la fonction prête pour notre zoo, nous pouvons facilement
parcourir notre liste d' animaux et les traiter tous comme s'ils n'étaient que des animaux Un
moyen rapide et facile
de stocker tous nos animaux dans
une seule variable. Disons que les animaux utilisent une fonction de nœud
appelée Get children. Cela renvoie un tableau de nœuds, tous les nœuds enfants de
ce nœud étant
organisés de manière pratique en un tableau dans le même ordre
que l'arbre des scènes. Comme cela
dépend des enfants, nous devons utiliser l'étiquette dès que possible. Comme nous savons que
tous les animaux ont mêmes propriétés
et comportements, nous pouvons parcourir
chaque animal de notre gamme d'animaux et leur dire de parler Et bien qu'
ils les traitent tous comme des animaux, chacun parlera à sa
manière, selon ses
propres
scripts, ou utilisera la définition héritée de animal s'il n'a pas
la sienne. Nous pouvons créer autant de niveaux d'héritage que nous le souhaitons. Créons donc un autre script
abstrait pour les mammifères, héritant
de l'animal Les mammifères constituent une
sous-catégorie d'animaux, y compris tous les animaux qui possèdent des glandes
mammaires et
les utilisent pour allaiter leurs petits Il s'agit de propriétés
et de comportements uniques des mammifères qui ne
s'appliquent pas aux autres animaux. Nous pouvons donc ajouter une nouvelle variable au script
du mammifère
pour le nombre de glandes
mammaires de cet animal et écrire une nouvelle
fonction appelée infirmière Encore une fois, le contenu des fonctions n'est pas
pertinent pour cette leçon. Ce script aura également
besoin d'un nom
de classe pour être hérité. Passons
au script félin, puisque les chats sont
des mammifères, nous pouvons donc donner au
nombre de glandes mammaires une valeur pour les chats,
qui devrait être de huit Et nous pouvons également ajouter de nouveaux
mammifères à notre zoo, comme un singe. Les singes sont également des mammifères, mais ils ne possèdent que
deux clans mammaires Je vais à nouveau
copier le contenu d'un autre script pour
accélérer les choses. Le pluriel de singe est singes. Un groupe de singes
s'appelle une troupe. Ils se déplacent en grimpant aux arbres. Ils mangent des bananes, et je
dirais qu'ils disent « oh ». Notre script Zoo peut désormais
tirer parti de cette nouvelle structure d'
héritage pour appliquer des conditions uniques
spécifiques aux animaux qui sont des mammifères. Nous pouvons directement utiliser noms de
classe dans
les instructions conditionnelles pour dire que si l'
animal actuel est un mammifère, nous exécuterons du
code supplémentaire
exclusivement pour les mammifères Je vais juste imprimer
quelques lignes supplémentaires décrivant nos mammifères. Et nous pouvons constater que nos résultats sont à la fois cohérents pour tous les animaux, mais qu'ils ont également quelque chose d'unique spécifique pour
les deux mammifères. Vous pouvez imaginer comment nous pourrions
modifier la liste des animaux
de notre zoo pour y inclure toutes
sortes d'animaux, et comment nous pourrions modifier notre
structure d'héritage pour les classer aussi
précisément que nécessaire Dans la leçon suivante,
nous allons découvrir une autre collecte de données que nous pouvons utiliser pour regrouper
des informations connexes. Je te verrai dans la prochaine leçon.
12. Dictionnaires 0-11: Bonjour, mes amis. Aujourd'hui, nous allons utiliser une alternative
au tableau qui est parfois
utilisé comme une classe sans aucune fonction
appelée dictionnaire. Imaginez une rangée de
casiers
comme dans un
lycée ou un gymnase Si nous déclarons un
tableau de variables, nous pouvons considérer que
l'indice
du tableau de chacune est le numéro du
casier Supposons qu'il y ait dix casiers et que nous puissions accéder à chaque casier
individuel mettre quelque chose, commençant par le casier zéro, un, etc. Ce que nous mettons dans chaque
casier n'a pas d'importance. Il peut s'agir d'un entier, d'un nombre
flottant, d'une chaîne, booléen, d'une valeur nulle ou d'une
instance de classe Et nous pouvons
imprimer le contenu des casiers pour les voir. Imaginez maintenant que lorsque nous mettons quelque chose dans
l'un des casiers, nous ne nous contentons pas de fermer la
porte du casier, mais aussi d'y mettre un cadenas Ce cadenas nécessite une
combinaison de trois chiffres pour s'ouvrir Auparavant, si nous voulions récupérer le contenu
du casier, nous suffisait de connaître
le numéro du casier, y rendre et d'en
sortir le contenu Maintenant, nous pouvons ignorer le numéro du
casier, et
nous devons plutôt connaître la combinaison
pour ouvrir le cadenas Supposons que la
combinaison soit 149. En tant que tableau, attribuer
quelque chose au numéro 149
signifierait que le tableau devrait
avoir 150 casiers Si nous devions changer le type de notre tableau en dictionnaire,
cela fonctionnerait toujours, sauf que nous n'avons pas besoin de définir une taille pour le dictionnaire avant de pouvoir accéder à
son contenu. Remarquez comment le
résultat a changé. dictionnaires sont représentés par des
accolades plutôt que par des
crochets, et chaque entrée est un nombre
représentant une clé
suivie et chaque entrée est un nombre
représentant une clé
suivie de la valeur du contenu du casier
verrouillé par cette y a également aucune entrée
dans le dictionnaire pour une clé à laquelle aucune valeur
n'a été assignée. En tant que dictionnaire, ce numéro n'
est ni un index ni une adresse. C'est une clé que nous
utilisons pour ouvrir une serrure. Et tout comme le contenu
du casier peut être de n'importe quel type de données, les clés que nous utilisons pour
le
verrouiller peuvent également être n'importe quel type de données avec une
seule restriction Chaque clé doit être unique. Sinon, nous ne
trouverons pas le casier
correspondant à la clé. Essayons donc de verrouiller un casier avec un
autre type de serrure, qui utilise des lettres
au lieu de chiffres. La clé de cette
entrée de dictionnaire est donc une chaîne, mais sa valeur est un nombre. Tout le contraire
de ce casier, dont la clé est un nombre
et la valeur une chaîne. Verrouillons le
casier suivant avec un verrou rotatif, qui nécessite trois
numéros pour le déverrouiller, que nous pourrions
stocker dans un tableau. La clé des entrées de notre dictionnaire est donc un tableau représenté par des
crochets contenant une liste de trois entiers séparés par
des virgules Peut-être que ce numéro de serrure
inclut un point décimal, donc la clé est un flottant Et d'une manière ou d'une autre, ce
casier est verrouillé par photosensibilité et ne peut être ouvert que si les lumières sont éteintes Sa clé est donc un booléen. Nous pouvons même utiliser des classes
personnalisées comme clés ou
valeurs dans les dictionnaires. Écrivons une nouvelle classe pour la clé, qui n'aura pas besoin d'
hériter de quoi que ce soit puisqu'elle ne
sera
ni attachée à un nœud, ni héritée Notre classe clé a besoin d'un nom de classe et comportera une variable
décrivant ses dents. L'implémentation de cette
classe n'est pas pertinente, mais nous pouvons prétendre qu'il s'agit d'une clé. De retour dans le script locker, nous pouvons stocker une instance
de notre clé dans une variable. Appelons-la clé
1 de type key en l' affectant au nom de classe
de key Nunu crée une nouvelle clé, qui est assignée
à notre variable Nous pouvons maintenant utiliser cette clé pour créer une entrée dans
le dictionnaire. Nous pouvons également créer plus de clés
pour créer plus d'entrées. Parce que chaque clé que nous créons
est considérée comme unique. La sortie affiche désormais les clés
sous la forme d'un nombre de récifs compté
suivi d'un nombre long. Les noms que nous avons utilisés dans d'autres classes ont été
hérités de node. Mais comme la clé n'
hérite pas du nœud, elle
n'a pas de nom Ref Counted est l'abréviation de
Reference Counted Object, et c'est la
classe de base du script GD Si nous écrivons une classe qui n'hérite
de rien, elle héritera de Reef Counted et se verra attribuer
un numéro long aléatoire Nous pouvons ignorer cela
et simplement comprendre que nos clés sont des objets comptés par
références, ce qui signifie que Gadot garde
automatiquement une trace de chaque instance unique
de chaque objet que nous créons Mais que voulons-nous
entreposer dans les casiers ? Tout comme les tableaux peuvent
contenir d'autres tableaux, les dictionnaires peuvent également
contenir d'autres dictionnaires En fonction de la façon dont les dictionnaires
sont imprimés, nous pouvons créer nos
propres dictionnaires la
volée à l'aide Chaque entrée commence par
une clé suivie deux points, puis de la valeur correspondant à
cette clé. L'utilisation courante des
dictionnaires ne consiste pas à créer quelque chose comme
ce scénario de casier, mais plutôt à créer
quelque chose qui ressemble davantage à une classe, même si elle ne comporte aucune
fonction, uniquement des variables Disons que ce casier
contient une peluche, que nous allons représenter
avec un dictionnaire Et cette peluche
fait partie d'un ensemble de peluches à
collectionner
similaires mais variées
à leur manière Chacun des jouets en peluche est un type d'animal différent
avec une couleur et un nom Chacune de ces
clés peut être une clé du dictionnaire. Disons que ce casier
contient Bruno l'ours brun. Et le casier suivant contient
Arthur le bouc blanc. Nous pouvons voir notre
dictionnaire de jouets en peluche dans le dictionnaire
des casiers Il se trouve que la couleur est également une
classe déjà définie dans Gadot. Ainsi, au lieu de stocker
nos couleurs sous forme de chaînes, elles peuvent être stockées sous forme de couleurs
en utilisant le nom de classe color. Comme vous pouvez le constater,
il existe de nombreuses couleurs
prédéfinies que nous pouvons utiliser, et la façon dont elles
sont nommées en majuscules en minuscules indique sont nommées en majuscules en minuscules indique qu'il s'agit
de constantes de la classe de couleurs. Nous pourrions même faire fausse route et prétendre que les jouets en peluche contiennent une étiquette NFC ou une étiquette de communication en
champ proche, ce qui en fait la clé
pour accéder au casier Et nous pouvons mettre ce que
nous voulons dans le casier comme avant, y compris
une autre peluche. Faisons un autre jouet en peluche
à ranger dans le casier, qui est déverrouillé
en utilisant Arthur comme Cette fois, c'est mignon,
l'éléphant gris. En imaginant ce scénario, il y a un lecteur NFC
près des casiers, et nous tenons une peluche
avec une étiquette NFC à l'intérieur, un peu comme
ce que vous pourriez
trouver dans une Si nous plaçons la
peluche contre le lecteur, nous devons vérifier quel casier
correspond à la
peluche et le déverrouiller, si un casier correspond Mais si nous essayons d'accéder à une clé
d'un dictionnaire à laquelle aucune valeur n'a
été attribuée, nous provoquerons une erreur. De la même manière que nous le
ferions si nous essayions d'
accéder à un
index de tableau hors de portée. Nous pouvons vérifier si un dictionnaire
contient une entrée correspondant à une clé spécifique
en utilisant la fonction has, puis en passant la
clé en paramètre. Cela nous permet de vérifier
si une entrée de dictionnaire existe avant d'essayer d'
accéder à sa valeur,
évitant ainsi l'erreur. Si le dictionnaire
n'a pas la clé, j'imprimerai un
autre message. Au lieu de définir deux fois le
même dictionnaire, il serait préférable de le stocker dans une variable et de
l'utiliser deux fois. Dans la leçon suivante,
nous allons explorer différentes techniques
que vous pouvez utiliser
lorsque vous êtes bloqué ou que vous
avez besoin de plus d'informations. Je te verrai dans la prochaine leçon.
13. 0-12 Débogage: Bonjour, mes amis.
Aujourd'hui, nous allons passer en revue
quelques stratégies différentes
que vous pouvez utiliser pour vous aider lorsque vous êtes
inévitablement bloqué. J'ai déjà
joint un script
au nœud racine de la scène nommé debug Vous avez probablement remarqué la fonctionnalité de
saisie semi-automatique qui est disponible si vous spécifiez
le type de vos variables Cela
vous permet non seulement
de voir toutes les propriétés et
fonctions de la classe, mais après avoir sélectionné une fonction, vous pouvez également voir les types de tous les paramètres des fonctions afin de fournir des arguments
correspondants. R, lorsque vous connaissez le type
de toutes vos variables, erreurs de non-concordance sont clairement apparentes et vous serez averti de l'erreur sans
avoir à l'exécuter Sans types stricts,
le moteur ne sait pas ce qui ne correspond pas avant
d'essayer d'exécuter la ligne Si vous souhaitez parcourir une classe
intégrée comme la couleur, nous pouvons facilement accéder aux
informations en cliquant sur l'un des boutons situés dans le
coin supérieur droit du panneau. Online Docs ouvre un onglet dans
votre navigateur Web par défaut vers l'API GADO correspondant à la version de l'éditeur
que vous utilisez Vous trouverez ici des
informations de base sur Gdo, des conseils pour démarrer, didacticiels
détaillés
sur les bases, des liens
communautaires où vous pouvez
trouver des ressources supplémentaires et une référence complète sur les cours Comme vous pouvez le constater, il
y a beaucoup de cours. Et en sélectionnant l'une d'entre elles, nous pouvons voir de quoi
elles héritent
et de quelles autres classes
elles héritent Chacun a une description
de ce qu'il fait. Liens vers des didacticiels
sur son utilisation, une liste de propriétés
et de méthodes. Lorsque nous parlons de classes, nous avons tendance à désigner les variables comme des propriétés et
les fonctions comme des méthodes. Il existe également des signaux, Gadot utilise pour communication
automatique
entre les nœuds, énumérations et les constantes,
comme nous l'avons déjà Tous ont
leurs propres sous-sections et descriptions de leur
utilisation. De retour dans l'éditeur GDA, aide à la
recherche ouvre une fenêtre dans GDA où vous pouvez voir
une liste de chaque classe En sélectionnant une classe,
nous pouvons voir toutes les informations disponibles sur
le site Web
de GDA
dans notre éditeur, afin que nous puissions y accéder hors ligne Pour en revenir à notre script, nous pouvons même accéder à
ces informations plus facilement en maintenant la touche Ctrl ou Commande enfoncée
plutôt qu'en cliquant sur le nom d'une classe, nous
amène directement
aux
informations de référence de cette classe. en va de même pour des fonctions
et des variables spécifiques. cliquer dessus
ouvre non seulement la
page de référence de la classe, mais nous amène également
à la fonction
ou à la variable sur laquelle nous avons cliqué Il existe également des fonctions globales
que nous pouvons utiliser principalement pour effectuer des opérations mathématiques
comme clamp, par exemple. Si nous utilisons cette fonction, nous pouvons voir les paramètres
attendus et nous pouvons l'utiliser pour fixer
notre variable à 0-1 Maintenez la
touche Ctrl ou Commande enfoncée et cliquez sur
le nom de la fonction
globale pour accéder
à la référence de cette fonction, qu'à sa description
et à son mode d'utilisation. Ils sont tous contenus dans
la classe de portée globale. Je vais ajouter une autre variable et
une autre ligne à mon script. Si nous exécutons notre scène, nous
pouvons afficher l'arbre des scènes de la simulation en cours via le panneau de scène en cliquant
sur le bouton de la télécommande. ne s'agit pas du même
arbre de scènes dans l'onglet local que nous avons créé pour définir la
scène comme un plan Cet arbre de scènes est
celui qui a été créé par le
moteur pour exécuter la scène. En sélectionnant un nœud, nous pouvons voir ses propriétés dans
l'inspecteur et nous pouvons voir que la
fonction Ready est déjà exécutée car les couleurs
ont des valeurs différentes. Nous pouvons également modifier les valeurs de
n'importe laquelle de ces propriétés. Nous pouvons également utiliser l'impression
pour imprimer chaque fois que nous voulons voir ce que contiennent nos
variables à tout moment. Et il est utile que vos relevés imprimés soient aussi
descriptifs que possible
, afin d'éviter toute confusion
quant à leur
provenance. Mais si nous changeons les choses
et utilisons la fonction de traitement, je changerai simplement la couleur
progressivement au fil du temps, puis j'ajouterai une déclaration d'impression ici. Comme cette fonction de processus s' exécute 60 fois par seconde, la valeur des instructions d'impression en
tant qu' outil de débogage est
considérablement réduite, car le journal de sortie va
simplement répéter le même message plus rapidement que nous ne pouvons le
lire ou y réagir Nous pouvons suspendre la simulation
pendant qu'elle est en cours d'exécution, en utilisant le bouton pause
ou en appuyant sur F sept. Cela nous permet de voir l'arbre des scènes
distantes tel qu'il est actuellement et de revoir
le contenu
du panneau de sortie lorsque
la simulation est suspendue. Mais cela
n'est toujours pas très utile, car plusieurs images
seront terminées entre le
début de la simulation et le moment où nous pourrons la suspendre. Si nous cliquons à gauche
d'une ligne de code, nous pouvons ajouter un point d'arrêt
automatique indiqué par un cercle rouge Lorsque nous exécutons la scène en cours, la simulation s'
arrête lorsqu'elle atteint cette ligne avant de l'exécuter. Cela est beaucoup plus
utile si nous
voulons que notre simulation
s'exécute image par image. Nous pouvons maintenant voir comment
la couleur de chaque image change progressivement
d'une image à l'autre. Demandons à notre fonction de processus d'appeler une autre fonction pour
effectuer une tâche simple. Je vais juste changer
la couleur progressivement en réduisant sa valeur rouge. Nous devrions donc voir
la couleur
changer progressivement à chaque image, devenant
moins rouge et plus bleue. Le point d'arrêt étant toujours sur la première ligne de la fonction de
processus, je vais lancer la scène Cela s'arrête là, et nous pouvons voir
que la prochaine ligne de code à exécuter est indiquée
par un triangle jaune. Lorsque la simulation
est interrompue de cette façon, nous pouvons lui demander de
n'exécuter qu' une seule ligne
de code à la fois, plutôt qu'une
image entière en sélectionnant Step Over dans le menu Debug ou
en utilisant le raccourci F ten Cela exécutera
uniquement la ligne de code pointée
par le triangle jaune, puis fera immédiatement une nouvelle pause. Nous pouvons donc voir les modifications
apportées uniquement par cette
seule ligne de code, et nous pouvons voir le triangle
jaune pointer vers la ligne suivante en
attente d'exécution. Nous pouvons continuer à exécuter notre script ligne par
ligne si nous continuons jusqu'à ce que
la fonction de processus se termine et que le cadre soit terminé, revenant en haut de la fonction de processus
pour l'exécuter une deuxième fois. Nous pouvons maintenant voir chaque individu
changer de couleur sa valeur bleue augmente
indépendamment lorsque
sa valeur bleue augmente
indépendamment de la diminution de la valeur
rouge, même si cela se produit
au cours de la même image. Dans le cas d'appels de fonction, il existe une autre option pour
accéder à la fonction. Si nous sélectionnons cette option
ou utilisons le raccourci F 11, la flèche jaune entrera dans la fonction appelée et exécutera cette ligne à la fois jusqu'à ce qu'elle soit terminée. Lorsque la fonction est terminée, la flèche jaune revient à la fonction d'origine pour
continuer à exécuter celle-ci. Grâce à ces outils, nous avons une vision très précise de ce que
font nos classes,
du moment où ils se comportent, et nous pouvons les observer
aussi
lentement nécessaire pour comprendre ce qui ne
va pas à quel moment
précis Si vous ne pouvez pas résoudre
un problème vous-même, la communauté GDA est très utile et toujours
prête à vous donner un coup de main Il existe des serveurs Discord
pour les développeurs de GDA, y compris mon serveur où mes étudiants s'entraident Le lien pour m'inscrire se
trouve dans mon profil. Il existe également des forums en ligne sur des sites Web comme Redit où
vous pouvez également poser des questions. Vous avez maintenant une
compréhension de base de la plupart de la syntaxe de GDScrip et des outils nécessaires pour approfondir ces
concepts Lorsque vous serez prêt,
demandez-moi un code de réduction pour de mes
cours de projet de jeu, et bonne chance.
14. Les bases: Bonjour, mes amis. Notre objectif pour la première section
de ce cours est créer un
personnage en trois D que le joueur peut contrôler à la troisième
personne. Notre première leçon
portera sur la mise en place d'une scène tridimensionnelle de base
et d'un nouveau projet. Ouvrir Gada pour la première
fois, il n'y a aucun projet. Cadeau recommande d'explorer
des exemples de projets officiels. Appuyez sur Annuler pour ignorer
cette recommandation. Nous allons démarrer un nouveau
projet à partir de zéro. Cliquez sur le nouveau bouton
pour créer un nouveau projet. Nous devrons donner un nom
au nouveau projet. Je vais appeler mon cours Gada
Three D. Et sélectionnez un dossier sur votre
disque dur pour le stocker. Je recommande de créer un dossier pour les projets
Gada dans les documents Cliquez ensuite sur le bouton
Refolder pour créer un nouveau dossier à cet emplacement avec le nom du projet. Vous pouvez modifier les
paramètres du moteur de rendu de votre projet. Forward est idéal
pour les jeux en haute fidélité, sur PC ou sur console. Ou le moteur de rendu mobile
pour appareils mobiles. J'aime utiliser le moteur de rendu de
compatibilité pour la plupart des projets,
car il est particulièrement
compatible avec les versions Web qui peuvent être téléchargées sur des sites tels que point IO Enfin, Dieu prend en charge l'intégration avec le
contrôle de version de GT Tub par défaut. Cliquez sur Créer et modifier pour créer le projet et l'
ouvrir pour le modifier. La fenêtre de l'éditeur Gdo est
divisée en plusieurs onglets. Au centre se trouve un aperçu de la
scène actuelle, ainsi que plusieurs outils que
nous pouvons utiliser pour modifier des éléments. haut à gauche
se trouve l'onglet scène, qui contient une liste de tous les éléments de la scène
en cours. En dessous se trouve l'onglet du système de
fichiers, qui contient toutes les ressources importées pour notre projet, telles que les modèles, textures, les sons et la musique. En plus de tous les fichiers, nous allons créer à l'aide de
l'éditeur Gada, comme les scènes, les scripts
et les ressources Actuellement, le seul fichier
ici est le logo Gada. À droite se trouve
l'onglet Inspecteur, où si nous sélectionnons
quelque chose dans la scène, nous pouvons voir ses propriétés
et les modifier. Tous ces onglets
peuvent être redimensionnés et réorganisés comme bon vous semble
pour s'adapter au mieux à
votre flux de travail Notre scène est un vaste espace
vide en trois D divisé par trois axes colorés. L'axe X rouge représente la
droite et la gauche. L'axe Y vert
représente le haut et le bas. L'axe Z bleu représente l'
avant et l'arrière. Commençons par cliquer sur le bouton des trois scènes en D
dans l'onglet Scène. Cela a créé un nœud racine pour notre scène dans l'onglet scène, nommé Node three D, qui est également le type de nœuds. Nous pouvons renommer ce nœud en
double-cliquant dessus ou en cliquant avec
le bouton droit de la souris
et en sélectionnant renommer Dans de nombreux jeux, cette
scène sera appelée scène principale
ou scène de jeu. Vous pouvez également le nommer d'après le style de jeu
qui sera utilisé, comme le jeu de plateforme, l'
exploration, le combat
ou la scène de puzzle Je vais donner un nom à mon jeu. Ce nœud racine formera notre arbre de scène au fur et à mesure que nous y
ajouterons des branches. Cliquez sur le
bouton plus ou cliquez avec le bouton droit sur le nœud racine et sélectionnez Ajouter un nœud enfant pour ajouter une
branche à l'arborescence de la scène. Il existe de nombreux
types de nœuds parmi
lesquels choisir et qui répondent à
de nombreux objectifs différents. Les types de nœuds suivent une
hiérarchie d'héritage. Tous les nœuds partagent donc
le même type de nœud. Mais il y a aussi le nœud
trois D, l'élément Canvas, nœud deux D, le contrôle, chacun avec de nombreux sous-types
différents Si vous savez ce que
vous recherchez, vous pouvez saisir le nom du
nœud dans le champ de recherche. Ajoutons une
instance de maillage à trois nœuds D. Vous pouvez constater qu'une
instance de maillage à trois nœuds en D hérite des propriétés d'
une instance de géométrie à
trois nœuds en D, instance
visuelle à trois nœuds en D, nœud trois D et d'un nœud Cliquez sur le bouton Créer pour ajouter le
nœud en trois D de l'instance de maillage à l'arborescence de la scène. Vous pouvez voir que le nœud
est ajouté à l'arborescence de la scène, mais qu'il est indenté pour indiquer qu'il s'agit d'un
enfant du nœud racine Tout nœud comportant des enfants
peut être réduit ou agrandi pour masquer ou
afficher ses nœuds enfants. C'est censé
être une image en trois dimensions, mais rien n'est affiché
dans la fenêtre d'aperçu. est dû au fait que
cette instance de maillage ne dispose pas d'une ressource de maillage
lui indiquant ce qu'elle doit dessiner. Avec l'instance de maillage,
trois nœuds D sont sélectionnés. Consultez l'onglet Inspecteur pour afficher et modifier les propriétés
des nœuds. Les propriétés sont divisées selon les mêmes types que ceux que nous avons vus
lors de la création du nœud. Nous pouvons donc voir quelles
propriétés sont héritées de différents types et lesquelles sont spécifiques à notre instance de maillage. Nous pouvons voir que le champ de
maillage est vide. En cliquant sur le menu déroulant, vous pouvez
accéder à plusieurs options, notamment certaines formes
de base, une boîte, une
capsule, un cylindre, un quadruple, un
prisme, une sphère et un torus Faisons de cette forme un plan. Nous pouvons maintenant voir une
forme en trois D dessinée dans notre aperçu. Cliquez sur la
ressource de maillage pour étendre ses propriétés afin que nous puissions également les
afficher et les modifier. Ici, nous pouvons définir la
taille du plan dans les dimensions x et
y tapant un chiffre dans
le champ ou en cliquant et en
faisant glisser le pointeur sur l'étiquette du champ Les unités sont généralement
considérées comme des mètres ou environ trois pieds
dans les mesures impériales. Mais il n'est pas obligatoire
d'utiliser ce ratio. Dans un jeu de stratégie, une unité peut mesurer un
kilomètre ou un mile, ou si vous
incarnez un petit insecte, une unité peut mesurer un
centimètre ou un pouce Maintenant que notre scène
contient
quelque chose nous donne un point de référence, explorons-la
un peu plus. Une grille de lignes
grises plus claires divise le plan x z en unités, une
ligne sur huit étant plus claire. Nous pouvons zoomer ou dézoomer à
l'aide de la molette de la souris. En zoomant vers le bas, nous pouvons constater que cette tendance se poursuit
, chaque huitième plus grande subdivision
étant également marquée, 64 unités l'une de l'autre,
soit huit Et encore une fois, toutes les huit ou 512 unités, huit unités ont
la puissance de trois zoomant à nouveau, le
grade d'origine redevient visible. Maintenir la molette de la souris
enfoncée et la déplacer nous
permet de faire pivoter le monde autour de l'axe y et incliner notre
perspective vers le haut ou vers le bas. Maintenir le bouton droit de la
souris enfoncé et déplacer la souris nous permet de faire
pivoter notre perspective, regardant vers la droite, la gauche, le haut ou le bas. en maintenant le bouton
droit de la souris enfoncé, nous pouvons utiliser les
touches WASD pour parcourir notre scène tout en utilisant la souris pour orienter
notre point de vue S'il semble que vous vous
déplacez lentement ou pas du tout, vous êtes probablement en train de zoomer. Cela nous permet de
visualiser
rapidement et facilement nos scènes dans
n'importe quelle position ou sous n'importe quel angle. Le maillage définit uniquement la
forme d'un objet en trois D, non son éclairage coloré
ou quoi que ce soit d'autre. Ils sont tous définis par matériau. En élargissant le menu
déroulant intitulé matériau, sélectionnez un nouveau matériau standard
trois D. Cliquez ensuite sur la ressource
matérielle nouvellement créée pour afficher et modifier ses propriétés. Les matériaux possèdent de
nombreuses propriétés qui permettent de contrôler la façon dont ils
interagissent avec la lumière. Développez la section d'albédo. Ici, nous pouvons ajuster
la couleur ou également utiliser un fichier image en deux dimensions pour appliquer de la
texture au matériau. Essayez de faire glisser le logo Gada
dans le champ de texture. S'il existe à la fois une
texture et une couleur, couleur de chaque pixel sera multipliée par la
valeur de couleur pour produire le résultat. Dans le coin supérieur droit
se trouve une série de boutons, dont
un
clapet avec
une icône de jeu, permettant de lancer la scène en cours En cliquant sur ce bouton, nous
serons invités à enregistrer la scène en cours si
ce n'est pas encore fait. Sinon,
la scène sera automatiquement enregistrée. Cela nous permet d'exécuter une simulation de notre
jeu à partir de scène
actuelle que nous sommes modifier. Rien n'est affiché. Nous pouvons fermer la fenêtre
pour terminer la simulation. C'est parce qu'il
n'y a pas de caméra dans la scène. Une caméra est nécessaire pour
visionner trois scènes en D. Une caméra n'est qu'
un autre type de nœud. Nous pouvons donc l'ajouter
à la scène de la même manière que nous avons ajouté
l'instance de maillage. Nous devons utiliser une caméra
3D pour visionner des scènes en trois D. La caméra est ajoutée
à l'origine de la scène, qui se trouve au centre
du sol, et regarde dans la direction
négative Z. Nous pouvons voir dans quelle direction regarde
une caméra
ainsi que la largeur de son champ de vision grâce
au gadget magenta
en forme Et le triangle nous indique également dans
quelle direction se trouve le haut. Lorsque les trois nœuds D de la caméra sont
sélectionnés dans l'arborescence des scènes, cliquez sur le bouton précédent pour afficher ce que voit
la caméra Là où se trouve la caméra ce
moment, elle ne
voit rien. Cliquez à nouveau sur le précommutateur pour
revenir en arrière. Nous devons l'
éloigner du sol
et le faire pivoter pour qu'il
regarde le sol. Nous pouvons facilement déplacer la
caméra le long d'un seul axe en cliquant et en faisant glisser
l'une des trois flèches, rouge pour l'axe X, verte pour y et bleue pour Z. Nous pouvons également déplacer la
caméra le long d'un plan en
cliquant et en faisant glisser l'un
des Cela verrouillera la valeur x, y ou
z
associée pendant que nous déplaçons la position
le long des deux autres axes. Déplacez la caméra vers le haut
le long de l'axe vert et
vers l'avant le long de l'axe Z. Selon le
point de vue de votre éditeur, avancer peut sembler être un retour en arrière. Mais pour plus de clarté, le terme « avant » est utilisé pour faire référence à la direction Z
positive, qui est la direction des points de
la flèche bleue. Cela peut également être fait
en verrouillant l'axe rouge et en déplaçant la caméra
le long du plan Y Z comme suit. Ensuite, nous devons faire pivoter la caméra
pour regarder le sol. Nous pouvons effectuer une rotation autour
d'un seul axe
en cliquant et en faisant glisser l'
un des trois cercles Tourner autour de l'axe
Y vert revient à tourner
la tête vers la gauche ou vers la droite. Tourner autour de l'axe Z
bleu
revient à incliner la tête d'un côté
ou de l' autre, voire à l'envers. Lorsque vous regardez vers le bas, vous effectuez une rotation autour de l'axe X, qui est rouge. Cliquez sur l'aperçu pour voir si votre caméra peut voir clairement
le sol. Lorsque les nœuds
3D de la caméra sont sélectionnés, examinez dans l'inspecteur
les propriétés héritées
du nœud trois D. En étendant la transformation, nous pouvons constater que les valeurs
de position
et de rotation de la caméra ont été modifiées. Les trois nœuds D
hériteront de cette propriété pour contrôler leur position et leur
rotation dans un espace à trois D. Ici, nous pouvons
modifier les valeurs manuellement, ou nous pouvons cliquer et
faire glisser sur les étiquettes pour les
ajuster avec la souris
comme nous l'avons fait avec l'avion. L'échelle est un multiplicateur de la taille
d'un objet en trois D. Par défaut, les
valeurs X, Y et Z sont toutes liées entre elles modification de l'une d'entre
elles
modifiera les trois. caméras n'ont pas de taille, donc la modification de la valeur
n'a aucune incidence sur l'appareil photo Mais régler l'échelle
sur une valeur négative reflétera efficacement sa rotation. Nous pouvons remettre l'échelle
à un en cliquant sur le bouton de réinitialisation et
ignorer cette propriété. En vérifiant l'aperçu, la
caméra peut maintenant voir le sol. Mais si nous reprenons la
scène actuelle, le sol est noir. C'est parce qu'il n'y a aucune source de
lumière dans notre scène. Dans l'éditeur, le
sol est éclairé car il y a un
aperçu de la lumière et de l'environnement, que nous pouvons activer ou
désactiver à l'aide de ces boutons Les éteindre du
sol devient noir
, comme nous le voyons
lorsque nous lançons la scène. Donc, pour que la caméra
puisse voir le sol, nous devons également ajouter une
source de lumière à la scène. Ajoutez une lumière directionnelle à
trois D non à la scène. Comme la caméra, elle est ajoutée à l'origine de la scène dans la direction
négative. Un éclairage directionnel
simule la lumière du soleil et produit des
rayons lumineux parallèles sur l'ensemble de la scène position n'affecte pas son comportement, seule sa rotation. Nous pouvons le déplacer et le positionner
n'importe où dans la scène, préférence à un endroit où nous pouvons voir le gadget en forme de flèche blanche Cette flèche pointe dans la
direction des rayons lumineux. Faites pivoter la source lumineuse manière à ce que la lumière soit dirigée
vers le sol pour
l'éclairer pour la caméra Maintenant, si nous exécutons la scène, la caméra peut voir le sol grâce à la lumière
qui s'y reflète. Chaque jeu exécutable doit
avoir ces trois composants
de base : un objet à regarder, une caméra pour le voir et
une source de lumière Si vous devez vous entraîner avec trois positions et rotations en D, essayez de créer une œuvre d'art abstraite en
trois dimensions aide d'instances de maillage Notez que les lumières ne
projettent pas d'ombres par défaut. Pour activer les ombres, cliquez
sur le nœud de la source de lumière, développez la section des ombres
sous la lumière tridimensionnelle, puis cliquez sur le bouton d'activation Vous pouvez également ajouter des
lumières supplémentaires à la scène, régler l'énergie ou couleur pour produire une grande
variété d'éclairage. N'hésitez pas à
expérimenter les différentes propriétés des matériaux et leur
interaction avec l'éclairage. Lorsque vous aurez terminé,
vous devriez avoir une bonne compréhension de la
relation entre les maillages, les
matériaux, les caméras
et les sources de lumière Comment ils sont utilisés pour
créer une scène en trois dimensions, comment déplacer et faire pivoter des objets dans un espace tridimensionnel et comment naviguer dans votre scène. Dans la leçon suivante, nous allons commencer à recevoir les commentaires du joueur. Je te verrai dans la
prochaine leçon. OK.
15. Scripts: Bonjour, mes amis. Dans
la leçon précédente, nous avons configuré une scène
tridimensionnelle de base avec des maillages, des matériaux, une caméra
et une source de lumière Dans cette leçon, nous allons accepter les
commentaires du joueur. Cliquez sur le projet dans la barre de menu et ouvrez
les paramètres du projet. Passez à l'onglet
de saisie de la carte en haut de la fenêtre des paramètres
du projet. Afin d'atteindre
notre objectif de contrôler un caractère en
trois D, nous devons accepter les entrées dans
les quatre directions de
mouvement, gauche, droite, avant
et arrière. Tapez, déplacez-vous vers la gauche dans le champ d'action
Ajouter une nouvelle action. Cliquez ensuite sur Ajouter pour
ajouter l'action. Le nom de l'action est
une description
de l'
utilisation de l'entrée dans notre jeu, généralement
écrit en minuscules séparées par des traits de soulignement Les actions sont déclenchées par des événements
, que nous pouvons ajouter en cliquant
sur le bouton plus. Les événements peuvent être des touches du clavier, clics de
souris, des mouvements
ou des saisies depuis un joypad. Nous pouvons rechercher
les entrées souhaitées en élargissant leurs catégories, filtrant les résultats de recherche ou en utilisant le champ
d'écoute pour simplement appuyer sur le
bouton souhaité. Pour se déplacer vers la gauche, la plupart
des jeux utilisent la touche A ou le joystick gauche d'un
joypad incliné vers la gauche L'ajout de plusieurs événements permettra mieux s'adapter aux
différents styles de jeu. Nous devons également être
capables de nous déplacer vers la droite, l'avant et vers l'arrière, en ajoutant
une nouvelle action pour chacune d'elles. J'utiliserai la touche D ou le
joystick gauche de droite à droite. WK ou joystick gauche vers le haut pour avancer, et touche S ou joystick gauche vers
le bas pour reculer La valeur de la zone morte est
la
pression ou l'inclinaison minimale requise
pour déclencher cette action. Le moteur va maintenant écouter ces événements d'entrée et
déclencher ces actions. Lorsque vous avez terminé,
cliquez sur le bouton de fermeture pour fermer les paramètres du projet. Créons un nouveau
nœud qui
réagira aux
actions d'entrée que nous avons créées. Ce nœud n'a pas besoin de représenter
un objet physique de notre scène, il peut
donc s'agir simplement d'un
nœud de base et d'un joueur de noms. possible de donner un
comportement à tout ce qui se trouve dans nos
scènes en y attachant
des scripts. Cliquez avec le bouton droit sur le
nœud du joueur, sélectionnez Script joint. Ou alors que le
nœud du joueur est sélectionné, cliquez sur le
bouton de script ci-joint dans l'onglet scène. La langue par défaut
pour les scripts du moteur Goda est GodaScript, qui est très facile à apprendre et bien optimisée pour le développement de
jeux Les scripts héritent des comportements
du type de nœud auquel
ils étaient attachés Dans ce cas, juste
un nœud normal. Des modèles sont fournis pour différents types de nœuds afin de
fournir des fonctionnalités de base. Les
cases à cocher du modèle sont activées par défaut. Voyons ce que contient
le modèle par défaut d'un script de nœud. Nous créons un nouveau script, et
non un script
intégré au moteur. Nous pouvons donner au script un nom, qui sera recommandé
par le moteur, correspondant au nom du nœud auquel
il est attaché. Il est classique
d'utiliser Snake Case nommer des scripts
tels que les actions de saisie. Minuscules séparées par des traits de
soulignement. Cliquez sur le bouton Créer
pour créer le script, et l'éditeur
passera automatiquement en
mode script pour le modifier. Vous pouvez revenir à l'affichage en
trois D à tout moment en
cliquant sur le bouton
en
trois D en haut de l'éditeur. De même, passez à la
vue du script en cliquant sur script. La ligne supérieure indique
le type de nœud auquel ce script peut être attaché,
à savoir nœud. Le mot clé extends
permet
à ce script d'hériter des propriétés
et des comportements d'un nœud, afin que nous puissions les utiliser
dans le script Les fonctions sont des comportements que le script exécutera sur le
nœud auquel il est attaché. Notre modèle de script
commence par deux fonctions :
prêt et traitement. Texte gris, commençant par
un catthorp ou des commentaires. Texte qui n'existe que
pour notre bénéfice en tant que développeur afin d'expliquer le
script en langage clair. Les commentaires nous indiquent que
la fonction Ready est automatiquement appelée
lorsque le nœud entre dans l'arbre de scène
pour la première fois. Ce n'est pas lorsque nous créons
le nœud dans l'éditeur, mais lorsque nous appuyons sur le bouton Exécuter la scène
actuelle. La simulation
créera l'arbre de scène, et lorsque le nœud du joueur ajouté à l'
arbre de scène et sera prêt, il appellera ce comportement. La fonction de traitement
est appelée chaque image,
ce qui, avec les paramètres de
projet par défaut est de 60 images par seconde. Cette fonction possède un
paramètre nommé Delta, qui correspond
au temps
écoulé depuis l'
image précédente en secondes Cette variable est représentée par
un nombre à virgule flottante, un nombre avec des virgules décimales Nous pouvons spécifier le type de
n'importe quelle variable avec deux points, suivi du nom du type. Comme le script Gudo est mal
typé, cela est facultatif, mais la spécification d'un
type améliorera l'efficacité du moteur et
réduira la fréquence Il est donc recommandé de
toujours spécifier le type de vos variables, sauf si vous
devez autoriser plusieurs types. OK. Nous pouvons utiliser la
commande d'impression dans nos scripts pour afficher du texte de base sur la console de sortie située en bas de la fenêtre. La commande d'impression prend comme argument
une chaîne de caractères, qui est une séquence
de caractères entre
guillemets. Prêts à imprimer pendant la fonction prête et traitons pendant la fonction de traitement. Nous pouvons également utiliser
l'opérateur plus pour ajouter des chaînes ensemble, ce qui nous permet d'ajouter la valeur de Delta à la chaîne de processus Mais Delta est un float, pas une chaîne, ce qui n'
est pas autorisé. Nous pouvons convertir le
type de Delta d' un float en une chaîne à
l'aide de la commande STR, en
passant Delta comme
argument entre crochets. Lancez la scène en cours et
arrêtez-la après un bref instant. Dans la console de sortie, nous pouvons voir que ready
a été imprimé une fois, suivi du processus 0,016, etc.
à de nombreuses reprises, soit une fréquence
d'images d'un soixantième de seconde Parfois, le nombre
peut être plus élevé car traitement de
cette image a pris un peu
plus de temps. Nous pouvons donc voir que
ces comportements
sont appelés automatiquement
par le moteur. Supprimons ces instructions
d'impression et l'ensemble de la fonction Ready. Au lieu de cela, nous
voudrons vérifier si
le joueur donne des informations pendant
le processus. Pour stocker ces informations, nous devons déclarer une
variable en haut
du script en utilisant
le mot clé VR. Appelons cela « Move Direction ». Le fait
de faire précéder le nom de la variable d'un
trait
de soulignement indique qu'elle est privée, ce qui
signifie que seul ce script doit s'y intéresser Le type de notre variable
sera un vecteur deux. Un vecteur deux est une structure permettant contenir deux flottants
nommés x et y. Nous avons déjà
travaillé avec le vecteur deux pour redimensionner
le maillage plan et le
vecteur trois pour modifier
la position ou la rotation
d'un nœud en vecteur trois pour modifier trois D. Au cours de la fonction de traitement, nous pouvons définir la valeur de la direction du déplacement en fonction de
l'état actuel des
actions de saisie de mouvement que nous avons créées précédemment à l'aide de l'
opérateur d'affectation ou du signe égal. La direction du déplacement
est égale au vecteur d'entrée. Input est une classe singleton, un script intégré que nous
pouvons référencer par son type, puisqu'il n'y en aura toujours
qu'une seule instance La période accède à
des variables ou à des fonctions, qui dans ce cas sont appelées méthodes car elles
appartiennent à une classe La méthode que nous appelons
s'appelle get vector. Get vector accepte quatre
chaînes comme arguments, qui sont les noms
des actions d'entrée qui seront utilisées pour
créer un vecteur deux, qui sera ensuite
stocké dans la variable. Une valeur x négative, qui reste, sera
soustraite d'une valeur x positive, pour calculer la valeur
de x dans le vecteur deux De même, une valeur
y négative vers le haut sera soustraite d'une valeur y
positive bas pour calculer
la valeur de y. Cela peut sembler inversé, mais lorsque l'on examine les mappages d'entrée,
la direction vers
le haut est répertoriée comme côté négatif de
l'axe
et la direction vers le bas est le De plus, la caméra regarde dans
la direction négative définie. Avancer du point de vue de la
caméra signifie
en fait reculer
dans un espace tridimensionnel Cela est compatible avec les jeux
bidimensionnels puisque l'origine de la scène se trouve en haut de l'écran et que les valeurs
positives
se déplacent vers le bas et non vers le haut. Pour l'instant, nous pouvons simplement imprimer la valeur de notre variable
pour voir de quoi il s'agit. Exécutons la
scène actuelle et testons-la. La console de sortie imprime
constamment zéro, zéro car aucune entrée n'
est donnée. Si nous appuyons sur l'une des touches WASD ou que nous inclinons le
joystick gauche de notre joypad, la valeur en cours d'
impression changera Gauche signifie que la valeur x
est négative, positive. bas définit la
valeur y sur positive, c'
est-à-dire vers la caméra et négative vers le haut en s'
éloignant de la caméra. En fermant la fenêtre, nous pouvons
voir un message d'avertissement. La valeur de Delta n'est pas utilisée par notre fonction de
traitement. Nous pouvons ajouter un trait de soulignement à
l'avant du Delta pour le marquer afin que le moteur sache qu'il peut être ignoré puisque
nous n'en avons pas besoin Nous sommes désormais en mesure de lire les mouvements
du joueur à partir du clavier
ou du JoyPad Dans la leçon suivante, nous utiliserons les informations du joueur pour déplacer
un objet dans notre scène. Je te verrai dans la prochaine leçon.
16. Contrôles: Bonjour, mes amis. Dans
la leçon précédente, nous avons commencé à
recevoir des informations du joueur. Dans cette leçon, nous allons déplacer un objet en trois D dans
notre scène à l'aide de cette entrée. Commençons par supprimer tous les maillages de notre
scène à l'exception du sol Et en ajoutant un nouveau nœud
à la scène de jeu, un nœud en trois D du corps du personnage. Ce nœud est doté de fonctionnalités intégrées pour la physique du
déplacement d' un personnage, mais ne représente pas réellement ce que
le joueur peut voir. Nous devrions donc ajouter un
nœud enfant au corps du personnage, une instance de maillage trois
D. Que nous pouvons remplir avec un maillage de
capsules dans le but de le remplacer par un
caractère réel ultérieurement Le corps du personnage en trois D se trouve à l'origine de la scène sur le sol, tout comme l'instance du maillage. Si nous considérons que la
position du personnage se
situe entre ses pieds, la capsule doit être déplacée vers haut par rapport
au corps du personnage. Lorsque l'instance de maillage est sélectionnée à
trois nœuds D, qui doivent être attachés
au corps du personnage, déplacez la capsule vers le haut
le long de l'axe y jusqu'à ce qu'elle
soit au sol, soit une unité En sélectionnant le nœud en trois D
du corps du personnage, si nous déplaçons ce nœud, l'instance du maillage se
déplacera également. Les nœuds enfants suivent la position, la rotation et l'échelle
de leurs parents. OK. Un avertissement apparaît dans l'onglet scène indiquant que le corps du personnage a besoin
d'une forme de collision. Il s'agit d'un autre nœud enfant. Nous devons ajouter au corps du
personnage trois nœuds en D, une forme de collision en trois nœuds D. Le moteur Goto ne suppose
pas
que des collisions se produiront
lorsque des maillages Au lieu de cela, nous pouvons ajouter
une forme supplémentaire, généralement une forme beaucoup
plus simple pour détecter les collisions afin de rendre les calculs plus efficaces. Tout comme le nœud en
trois D de l'instance de maillage a besoin
d'une ressource de maillage, le nœud en trois D de la forme de collision nécessite une ressource de forme. Nous allons utiliser la même forme de
capsule et la déplacer d'une unité vers le
haut pour qu'elle soit dans la
même position que le maillage. OK. Il s'agit désormais d'une branche de nœuds
qui se rapportent tous
spécifiquement à notre personnage et
n'ont rien à voir avec la scène
globale du jeu. bouton droit sur le nœud en trois D du corps du
personnage, sélectionnez la branche sécurisée comme scène et donnez un nom à cette scène. Vous pouvez donner à cette
scène le nom
du personnage ou simplement la
laisser comme personnage pour le moment. Les nœuds enfants de l'arbre des
scènes sont désormais masqués
et le nœud du personnage
possède une icône en forme de clapet Si nous cliquons sur le
clapper board, la scène du personnage s'
ouvre pour être modifiée. OK. Un nouvel onglet s'ouvre dans l'éditeur
pour notre nouvelle scène, et nous pouvons passer de la scène
du jeu scène du
personnage
en cliquant sur les onglets. Le personnage est désormais
une scène distincte de la scène de jeu que nous
pouvons modifier de manière isolée. Toute modification apportée
à cette scène en
modifiera toutes les instances dans d'autres scènes. Tout comme notre nœud joueur
possède un script de joueur, le nœud personnage a également besoin d'un script de personnage pour
lui indiquer comment se comporter. En attachant un nouveau script au nœud
racine de notre personnage, ce nouveau script
héritera du corps
3 du personnage D. Nous pouvons utiliser le modèle de base
pour ce type de nœud et cliquer sur Créer pour
ouvrir le nouveau script Ce modèle présente quelques différences
. La vitesse et la
vélocité de saut du personnage sont enregistrées sous forme de constantes. Les constantes sont similaires
aux variables, mais elles sont plus efficaces pour
les valeurs qui ne changent jamais. Une force gravitationnelle
est lue dans les paramètres
du projet. OK. Au lieu de la fonction de
processus, il existe une fonction de
processus physique. Par défaut, le
processus et le processus physique s'exécutent 60 fois par seconde. Mais dans les jeux comportant de nombreux corps physiques
complexes, la fréquence d'images du processus physique
peut être réduite pour améliorer l'efficacité sans sacrifier mises à jour
graphiques
ou le temps de réponse Tout ce qui concerne les calculs
de vitesse
ou de force est effectué dans la
fonction du processus physique pour les séparer. Au cours du
processus physique, si le personnage
n'est pas au sol, temps de gravité
Delta est
soustrait de sa vitesse
verticale Si le joueur appuie sur
l'action d'acceptation de l'interface utilisateur, une action de saisie intégrée
affectée à la barre d'espace, le personnage sautera. Ce modèle utilise également un code
similaire pour lire le
mouvement saisi à l'aide
des touches fléchées. L'entrée est ensuite convertie en un vecteur trois en
ajoutant un zéro pour la valeur y et en utilisant le mouvement vertical y
pour l'axe zt, en convertissant les
entrées vers le haut et vers le bas sur le clavier du contrôleur en mouvement avant
ou arrière. Ceci est ensuite multiplié
par la base des nœuds, qui est une structure de trois vecteurs pointant vers
le haut et vers l'avant Ce sont les trois mêmes flèches
colorées qui
s'affichent dans l'éditeur lorsque
nous sélectionnons un nœud en trois D. Cependant, ces flèches
se trouvent dans l'espace mondial. Si nous faisons pivoter le corps du personnage, les flèches restent les mêmes. Les vecteurs de base des nœuds sont
affichés si nous passons à l'espace
local en cliquant sur cette bascule ou en appuyant sur
la touche de raccourci T. Au fur et à mesure que le nœud pivote, ses vecteurs de base ou ses interprétations locales de droite vers le haut et vers l'avant
pivotent également Il s'agit des
vecteurs directionnels utilisés pour déterminer la direction dans laquelle
le personnage se
déplacera lors de la saisie. La direction est
ensuite normalisée. Cela signifie que, quelle que soit
la rotation ou
l'inclinaison partielle du joystick gauche, la longueur du
vecteur directionnel deviendra une, ce qui permettra au
personnage de toujours se déplacer à une vitesse constante. C'est un raccourci pour dire si
la direction n'est pas nulle. Déplacez ensuite le personnage
le long des axes x et z en
multipliant la direction par la vitesse. Si la direction est nulle, déplacez leur vitesse vers
zéro à une vitesse déterminée. Enfin, la méthode Move
in Slide est appelée pour appliquer
leur vitesse et forces
externes pendant
la durée de Delta afin de déterminer où le personnage
doit se trouver dans cette image. Si nous essayons de lancer cette scène, rien n'est dessiné car il s'agit la scène du personnage qui n'
a ni caméra ni éclairage. Passez donc à la scène du jeu et lancez ce cygne
pour tester le jeu. Le personnage
tombe immédiatement par terre. Cela est dû au fait qu'
il n'y a aucune collision avec le sol. Ajoutons un nœud 3D
à corps statique à la scène. Un corps est un terme général désignant tout objet affecté
par la physique ou les collisions. Statique signifie qu'il est
immuable ou, dans ce contexte, qu'il ne bougera
ni du fait de la physique, comme la gravité, ni des collisions avec d'autres corps
tels que notre personnage L'instance de maillage de sol
doit être un enfant de ce nœud de corps statique car elle en est la
composante visuelle. Ensuite, nous devons ajouter une
forme de collision à trois nœuds en D pour donner au sol une forme avec laquelle il entrera en collision
avec d'autres corps Cette forme sera une boîte. élargissant la ressource de
forme de boîte, nous pouvons lui donner une longueur et une
largeur correspondant au sol, -5 mètres en longueur et en
largeur et une hauteur de zéro. Nous pouvons renommer les nœuds pour
refléter cette nouvelle disposition, sorte que le nœud statique en trois
D soit le sol et que l'instance de maillage en trois D soit un enfant utilisant
son nom par défaut Maintenant, lorsque nous
lançons la scène en cours, la
forme de collision du personnage entre en collision avec la forme de collision du sol, l'
empêchant ainsi de tomber Le plancher ne réagira pas à la collision car
il est statique. vous croisez
les touches fléchées,
le corps du personnage se déplace de trois nœuds en D et appuyez sur la barre d'
espace pour sauter. Pour en revenir au script du personnage, les commentaires nous indiquent
que, comme bonne pratique, nous devrions remplacer les actions
intégrées à l'interface utilisateur par
des actions de jeu personnalisées,
ce que nous avons déjà fait. Nous pouvons donc commenter
ces deux lignes appuyant sur
Ctrl ou sur Commande K. Mais en
appuyant sur
Ctrl ou sur Commande K. Mais
la variable de direction
est déclarée ici dans la fonction du
processus physique. C'est ce qu'on appelle la
portée de la variable. Il est déclaré dans
cette fonction et n'existe
donc que
dans cette fonction. Comme nous l'avons fait avec
le script du joueur, nous pouvons déclarer cette
variable de direction en haut du script en dehors du processus physique afin d' étendre sa portée à
l'ensemble du script. Nous allons le définir comme privé
en le faisant précéder
d'un trait de soulignement et en définissant son
type comme étant le vecteur trois, une structure contenant
trois flottants pour Et modifiez également le nom de la variable dans le processus
physique pour qu'il corresponde. Pour déplacer le personnage,
écrivons une nouvelle fonction dans notre
script nommée move, dont nous accepterons un paramètre appelé direction
du vecteur 3. Ce paramètre de direction est différent de notre variable de
direction, car celui-ci n'a pas
de trait de soulignement et son but sera de stocker
la valeur transmise à cette fonction de déplacement,
en affectant à l'aide de l'opérateur d'
affectation Le nom de cette fonction move ne comporte pas de trait de soulignement ,
ce qui signifie qu'elle est censée être
accessible aux autres scripts OK. Notre
script de joueur appellera cette méthode pour
déplacer le personnage en fonction de la direction
de déplacement reçue. Nous pouvons passer d'un
script à l'autre en cliquant dessus dans la liste des scripts située à
gauche de la vue du script. En passant au script du joueur, nous pouvons ajouter une nouvelle variable
pour que le personnage
du joueur contrôle. Il s'agit d'un caractère de
soulignement d'une variable privée de type caractère trois D. ajout lors de
l'exportation au début de la déclaration de
variable permettra d'y accéder par d'autres parties de
l'éditeur Gda, à savoir l'onglet inspecteur Dans la scène de jeu, si nous
sélectionnons le nœud du joueur, la
variable de caractère est répertoriée dans l'inspecteur et nous
pouvons lui attribuer sa valeur. Comme nous indiquons que le type de variable est un corps de
caractère en trois D, seuls les nœuds de ce type ou les nœuds héritant de ce
type peuvent être affectés Attribuez au
nœud de caractère la valeur de la variable de caractère dans
le script des nœuds du joueur, soit en cliquant sur un
signe et en le sélectionnant dans
la liste , soit en cliquant
et en faisant glisser le
nœud dans le champ Au lieu d'imprimer la
valeur de la direction du déplacement, nous voulons appeler character do move et transmettre le
sens du déplacement comme argument. Mais le type de
direction de déplacement est un vecteur deux, et le type du
paramètre attendu par le personnage do
move est un vecteur trois. Même s'ils étaient
du même type, ce ne serait pas la bonne direction
pour déplacer le joueur. Puisque la direction dans laquelle
nous nous attendons
à ce que le personnage se déplace dépend de
la perspective de la caméra. Ajoutons une autre
variable exportée pour la caméra. Attribuez ensuite sa valeur. Nous allons renommer la direction du déplacement
en direction d'entrée et créer une autre variable pour la
direction du déplacement de type vecteur trois Comment convertir la direction
d'entrée bidimensionnelle en
une direction de
déplacement tridimensionnelle fonction de la
perspective de la caméra ? Nous multiplions la
base de la caméra par la direction d'entrée, comme cela a été
fait dans le code du modèle, mais nous allons le faire un
peu mieux. abord, prenez la
direction droite de la caméra, c'est la flèche rouge, Tout d'abord, prenez la
direction droite de la caméra, c'est la flèche rouge, à
laquelle vous pouvez accéder avec le point X de base du point de
caméra et le multiplier par le point de direction
d'entrée x.
Si le joueur appuie sur la droite,
il Si le joueur appuie sur la droite, se déplacera dans la direction droite de la
caméra, et s'
il appuie sur la gauche, le sens d'entrée
x est négatif et droite multipliée par un
nombre négatif ira à gauche à la place. Ajoutez ensuite en utilisant l'opérateur
plus égal, la
direction avant de la caméra, c'est la flèche bleue, base des points de la
caméra est multipliée
par le point de direction d'entrée y, convertissant l'
entrée verticale en mouvement le long des directions avant
et arrière de la caméra. Mais la caméra est actuellement pivotée car elle regarde vers le bas. Ainsi, si le joueur avance, il
s'
enfonce légèrement dans le sol, plus
lentement qu'
il ne le ferait à gauche ou à droite, et en reculant, il
essaiera en fait monter dans les airs pour
se rapprocher de la caméra. La multiplication du
vecteur de base par le vecteur 3101 supprimera toute composante y et aplatira sur
le plan x. Nous devons ensuite normaliser
le vecteur trois aplati, afin qu'il ait toujours
une longueur d'
un et n'affecte pas la vitesse de déplacement du
joueur Cela supprimera tout effet de rotation en x ou en z sur
ces directions, mais la rotation y de la caméra modifiera tout de même les commandes du
joueur. Maintenant, lorsque nous
lançons la scène en cours, le script du joueur vérifie
les entrées, à chaque image. Si nous donnons une
entrée, elle
vérifiera les directions droite
et avant de la caméra, les
aplatira sur le plan rouge, les normalisera et indiquera au personnage dans quelle direction se
déplacer en fonction de l'entrée Ensuite, le processus
physique du personnage orientera dans cette direction. Déplacer le personnage à
l'aide des vecteurs de
base aplatis de la caméra permet au joueur de
garder
le contrôle du personnage
quel que soit l'angle de prise de vue, même lorsque la caméra
bouge ou est contrôlée par le joueur en même temps, puisque
la direction
du mouvement
est calculée
dynamiquement à même temps, puisque
la direction
du mouvement chaque image Séparer les entrées
du joueur de celles du personnage est également une structure plus flexible puisque le personnage que le joueur contrôle peut
facilement être modifié. Le script indiquant au personnage où se déplacer peut facilement être contrôlé grâce à la logique du jeu
plutôt qu'à la saisie du joueur. Le joueur peut désormais
déplacer une capsule
dans notre scène,
et à la prochaine leçon, nous allons importer un modèle de personnage pour
remplacer la capsule. Je te verrai dans la prochaine leçon.
17. Importer: Bonjour, mes amis. Dans
la leçon précédente, nous avions l'habitude de jouer
votre entrée pour déplacer une capsule dans
une scène en trois D. Dans cette leçon, nous allons remplacer la capsule par un modèle de
personnage. Commençons par télécharger
un pack d'actifs depuis Soto. Pour ce cours, j'
utilise la version gratuite de Kits Character Pack Adventurers. En cliquant sur Télécharger maintenant, vous serez invité à payer, mais vous pouvez cliquer sur Non merci. Dirigez-moi simplement vers les téléchargements. Nous choisissons éventuellement de
soutenir l'artiste en lui donnant le montant
que vous jugez approprié. Il existe également des versions payantes de ces packs d'actifs, qui
incluent davantage de contenu. Je recommande de
les essayer gratuitement et payer pour les versions supplémentaires
si vous aimez leur travail. Cliquez ensuite sur Télécharger
pour télécharger les ressources. En attendant la fin du
téléchargement, revenons à la page des
ressources et examinons ce qui est inclus
dans ce pack d'actifs. Il y a quatre
personnages, tous dotés d'
une variété d'armes
et d'accessoires, et chaque personnage
est animé avec une grande variété
d'animations que nous pouvons utiliser dans un format
cohérent. Les modèles sont
efficaces pour une utilisation dans les jeux
mobiles et sont compatibles
avec le moteur Cada Ces ressources sont gratuites pour un usage
personnel ou commercial sous licence Creative
Common Zero. Assurez-vous de vérifier la
licence des ressources que vous téléchargez avant de
les utiliser dans vos projets. Dans certains cas, l'attribution
peut être requise
ou l' utilisation dans le cadre de projets commerciaux
peut être totalement interdite. Lorsque le téléchargement est terminé, extrayez le contenu
du dossier compressé quelque part sur votre disque dur Ouvrez ensuite le dossier
pour voir ce qu'il contient. Nous voulons utiliser les
personnages et les modèles sont disponibles
dans deux formats différents. Pour ce cours, j'
utiliserai les fichiers GLTFfiles. Pour importer les actifs
dans Coda, il
suffit de cliquer dessus et de
les faire glisser dans la fenêtre de l'éditeur Notre dossier
de ressources commence à paraître un peu désordonné, alors
organisons-le Cliquez avec le bouton droit sur le dossier de ressources
racine et créez un nouveau dossier. Nommons ce dossier « Ressources
importées ». Créez ensuite un autre dossier à l'intérieur de celui-ci
nommé characters. Regroupez, sélectionnez et faites glisser les
éléments de personnage importés dans ce nouveau dossier. OK. Nous pouvons également créer un nouveau dossier dans le dossier ressources
racine pour contenir les scripts et un autre pour les scènes. Les scripts ont une icône en forme de roue
dentée et l'extension GD. Alors que les scènes ont l'icône du tableau et leur extension est TCN Vous pouvez organiser vos
ressources, mais cela vous semble logique et s'
adapte le mieux à votre flux Avant de pouvoir travailler avec
les actifs importés, nous devons modifier certains paramètres
d'importation. Sélectionnez l'un des fichiers GLB de
caractères dans l'onglet Système de fichiers Passez ensuite le document
qui
affiche actuellement l'
onglet scène à l'onglet Importer. Ici, nous pouvons modifier la
façon dont l'éditeur God interprète les fichiers et
génère les actifs importés La plupart de ces paramètres
conviennent à nos besoins. Ajoutons d'abord un type de racine au corps de caractère trois
D. Par défaut, le personnage
aura été importé tant que nœud trois D. Mais nous voulons que nœud
racine de
notre personnage soit un corps de personnage trois D pour être compatible
avec notre script de personnage. Si nous modifions l'
un des paramètres, il ne sera pas mis à jour à
moins que nous ne réimportions la ressource. Cliquez ensuite sur le bouton
Avancé. La fenêtre des
paramètres d'importation avancés s'ouvre et nous pouvons voir un aperçu de ce à quoi ressemblera
la ressource importée. Vous pouvez zoomer ou dézoomer avec
la molette de la souris ou cliquer et faire glisser le pointeur pour faire pivoter le
modèle afin d'obtenir une meilleure vue. À gauche se trouve l'arbre de scènes qui sera généré
par cet actif, comprenant un squelette, des os, des maillages et un lecteur d'animation
avec toutes les animations Avant de pouvoir travailler avec
ce modèle de personnage, nous devons autoriser certaines
animations à tourner en boucle. Commençons par
l'animation inactive. fois l'
animation inactive sélectionnée, nous pouvons prévisualiser à quoi elle
ressemblera à
l'aide du bouton de lecture
en bas de la fenêtre. Mais il ne joue qu'une seule
fois puis s'arrête, ce qui est exactement le problème. Sur le côté droit, nous pouvons modifier les paramètres d'importation de
l'animation, en passant du mode boucle au mode linéaire. Maintenant, lorsque nous appuyons sur Play, lorsque
l'animation se termine, elle revient au
début et rejoue. Ping Pong
jouera plutôt l'animation en arrière pour revenir au point de départ puis en avant. Réglons-le sur
linéaire. Répétez ensuite l'opération pour toutes
les animations de cette liste contenant le mot idle,
blocking ou running. Bien que cela ne soit pas abordé
dans ce cours, vous pouvez également autoriser l'utilisation de
boucles pour le tir, rotation, le blocage
et le lancement de sorts. Lorsque vous avez terminé, cliquez sur
le bouton de réimportation pour
réimporter les ressources avec les paramètres d'animation
mis à jour. Vous devrez répéter
ce processus pour les autres personnages avant de
pouvoir les utiliser. Passez à la scène du personnage. Cliquez et faites glisser l'actif du
personnage sur le nœud racine de
la scène du personnage ajouter
à l'arborescence de la scène. Activons l'éclairage de prévisualisation afin de
mieux voir notre personnage
importé et supprimons le nœud d'instance de
maillage dessine le maillage de la capsule. Le nœud barbare n'
est qu'un nœud, non le grand arbre de nœuds que nous avons
vu dans les paramètres d'importation, et il porte l'icône en forme de
clapet, ce qui
implique qu'il s'agit d'une
instance d'une Par exemple, nous avons créé la
scène du personnage à partir de la scène du jeu. Nous pouvons le faire à l'envers. Cliquez avec le bouton droit sur le Barbare
et sélectionnez Make Local. Cela rompra le
lien entre ce nœud la ressource importée et en fera une version
unique qui n'
existe que dans cette scène. Et maintenant, nous pouvons voir
tous ses nœuds enfants. Les animations sont contenues dans le nœud du
lecteur d'animation. Réduisons le nœud de la plate-forme
pour le moment afin d'en cacher la majeure partie. Ensuite, nous voulons que le barbare soit le
nœud racine de la scène Nous pouvons à nouveau cliquer dessus avec le bouton droit de la souris
et sélectionner make seen root pour organiser l'arborescence de la
scène afin qu' il devienne le nouveau nœud racine de la
scène. Ensuite, cliquons et faisons
glisser le nœud 3D
en forme de collision pour
le relier au nœud Barbarian En faire une
forme de collision pour le Barbare et supprimer le nœud en trois D du corps du
personnage d'origine car il est désormais superflu Cependant, nous avons toujours besoin d'un script de
caractère
attaché au nœud racine. Nous pouvons également l'ajouter
en cliquant dessus et en le faisant
glisser sur le nœud racine Notre arbre de scènes est toujours
le même qu'avant. Seul le nœud 3D de l'
instance de maillage est désormais remplacé par
le nœud Character Rig, et il existe un nœud de lecteur
d'animation. Notre personnage semble
tenir beaucoup trop d'objets
entre ses mains. Élargissez le nœud
de la plate-forme pour voir ses enfants. Nous pouvons masquer tous les
objets détenus par
le personnage en cliquant
sur
l' icône située à côté de celui-ci. Nous pouvons également masquer le chapeau et le
p du
personnage pour n'importe quel personnage
autre que le voleur. Le Rogue propose un modèle complètement
différent lorsque la capuche est relevée puisque les
poils sont également épilés. Selon la version de Coda ou les ressources que vous utilisez, une icône X rouge peut qu'
il y a un
problème avec cette ressource En le sélectionnant et
en examinant les paramètres d'importation, nous pouvons modifier la version de
dénomination GLTF pour la version 4.1 ou une version antérieure et réimporter
la ressource pour résoudre ce problème Lorsque vous avez terminé, repliez
l'appareil une fois de plus. Si nous sauvegardons la scène du
personnage depuis
le menu de la scène ou en appuyant sur la commande S ou la commande S. Passez ensuite à
la scène de jeu. Nous pouvons voir que le personnage
de notre scène de jeu a été mis à jour au cours de cette scène, nous pouvons le
déplacer comme avant, mais il se
déplace maladroitement dans les TP modèle de personnage est maintenant importé dans notre projet. Dans la prochaine leçon, nous allons
animer la marche de notre personnage. Je te verrai dans la prochaine leçon.
18. Marche: Bonjour, mes amis. Dans
la leçon précédente, nous avons importé des
modèles de personnages dans Cada Dans cette leçon, nous allons animer le personnage pour qu'il
parcourt notre scène Commençons par reculer légèrement
la caméra car le personnage est
plus grand que ne l'était la capsule. Les mouvements des personnages
sont très rigides. Le personnage se déplace à pleine vitesse ou pas du tout. Cela ne fait pas du bien et n'est pas comme ça que les choses bougent
réellement. Il doit y avoir une
accélération jusqu'à une vitesse maximale et une
décélération avant ouvrant le script,
nous pouvons voir que la vitesse des caractères est
déclarée constante. Déclarons plutôt certaines variables privées
exportées pour définir la façon dont notre
personnage se déplace. À commencer par leur vitesse de
marche mesurée en unités par seconde, qui est mieux
représentée par un flotteur. Nous pouvons attribuer
une valeur par défaut aux variables en utilisant l'opérateur d'affectation sur la même ligne lorsqu'elles sont
déclarées. Je vais le régler sur un. Nous voulons également que les valeurs d'accélération
et de décélération soient mesurées en unités
par seconde au carré. Également des types de flotteurs. Réfléchissez à la rapidité avec laquelle
vous passeriez d' position inactive à une
marche à pleine vitesse. Environ une demi-seconde
semble raisonnable,
ce qui correspond à une accélération
deux fois supérieure à la vitesse de marche. Et aussi la rapidité avec laquelle
vous vous arrêteriez complètement en
marchant à pleine vitesse. C'est généralement plus rapide que l'accélération, donc
je vais en faire quatre. En sélectionnant le nœud racine
des Barbarians, nous pouvons voir les variables
exportées disponibles pour être modifiées
dans l'onglet inspecteur modification de ces nombres
remplacera les valeurs par défaut
fournies dans le script Mais appuyer sur le bouton de réinitialisation les
ramènera à
leurs valeurs par défaut. Cela nous permet d'
expérimenter facilement différentes
valeurs et
offre également la possibilité que
différents personnages aient des vitesses de déplacement
différentes. Pour faciliter les choses, nous pouvons séparer la vélocité des
caractères sur le plan x z de la
vitesse le long de l'axe y, ce qui nous permet d'isoler les
ajustements vitesse de
mouvement de facteurs
tels que le saut et la gravité. Déclarons une autre
variable privée X Z velocity de type vecteur trois. Au début du processus
physique, nous pouvons définir la valeur de la vitesse
x comme étant un
nouveau vecteur trois, copiant la
vitesse du personnage sur les axes x et z, tout en réglant la valeur
y à zéro. Nous pouvons ensuite
ajuster la vélocité
X Z des caractères ici sans soucier de l'impact
de leur vélocité y. Ensuite, à la fin du
processus physique , avant le glissement de mouvement, nous pouvons définir la vélocité
des
caractères les valeurs ajustées pour X et Z, comme étant
les valeurs ajustées pour X et Z,
mais avec la même valeur que pour y. Cette méthode présentera également
des avantages supplémentaires plus tard. OK. Ensuite, nous devrons
modifier ce bloc de code qui déplace
le personnage. La déclaration divise
cette affaire en deux cas. Si le joueur fournit une direction de
mouvement ou non. Au lieu de décomposer la vitesse en composantes x et z, puisque nous avons supprimé la vitesse y, nous pouvons simplement modifier la vitesse x
z directement ici. Si le joueur fournit
une direction de mouvement, nous devons attribuer une
vitesse x z pour qu'il se déplace dans la
direction multipliée par la
vitesse de marche à un taux d'
accélération multiplié par Delta. Cela prendra leur vitesse
actuelle le long du plan X Z et la déplacera vers sa vitesse de marche
dans la direction que le joueur souhaite suivre à
un rythme d'accélération. Puisque Delta est le
temps qui s'est écoulé depuis
la dernière image, généralement un soixantième de seconde Il ajustera l'accélération en fonction
de la fréquence d'images, ce qui permettra
au personnage d'
accélérer et de se déplacer aux vitesses spécifiées, quelle que soit la fréquence d'images définie dans le
jeu. De même, lorsqu'aucune entrée de
mouvement n'est donnée, le personnage doit
décélérer à une vitesse
nulle à un taux de décélération Nous pouvons maintenant supprimer la
constante de vitesse d'origine puisqu'elle n'
est plus utilisée. Passons à la scène du jeu et essayons de déplacer le
personnage maintenant. Maintenant, le personnage
accélère jusqu'à une vitesse de marche et
décélère plus naturellement. De retour dans la scène du personnage, nous pouvons passer à vue en
trois D afin de
voir le personnage. Sélectionnez le nœud du
lecteur d'animation et l'onglet d'animation s'ouvrira
en bas de la fenêtre. L'animation
actuellement visionnée est une attaque masculine à une main, et le modèle du personnage a pris la première image
de l'animation. Nous pouvons appuyer sur le
bouton de lecture en haut de l'onglet d'animation pour
prévisualiser l'animation. élargissant l'onglet Animation et faisant défiler les pistes
d'animation, nous pouvons constater que chaque os est encadré pour produire une Utilisez le curseur Zoom pour ajuster la
durée affichée dans
l' onglet Animation et vous pourrez voir chaque image-clé individuelle À l'aide du menu déroulant,
nous pouvons sélectionner n'importe laquelle
des animations
importées, y compris celles qui sont inactives. Et en prévisualisant cette animation, puisque nous avons configuré
les paramètres d'importation, l'animation se déroulera en boucle nœud du lecteur d'animation
peut donc exécuter n'importe laquelle de
ces animations. Nous avons juste besoin de contrôler
quelle animation est jouée. Vous pouvez le faire
par le biais d'un script, mais le code sera
très long et devra
tenir compte d'un trop
grand nombre de possibilités. La meilleure façon de contrôler
l'animation en cours
est d' utiliser
un autre nœud, que nous pouvons ajouter à la
scène de notre personnage, un arbre d'animation. L'arbre d'animation
doit être informé du lecteur
d'animation
qu'il contrôle. En cliquant sur le
champ assigné à côté du lecteur Anim, nous pouvons sélectionner le nœud du
lecteur d'animation dans la liste Ensuite, nous devons fournir une
ressource pour ce nœud,
comme nous l'avons fait pour
les instances de maillage et
les formes de collision. Cette ressource est appelée
machine à états. En créant la
machine à états, nous allons ouvrir l' onglet de l'arbre
d'animation
en bas de la fenêtre de l'éditeur. Nous pouvons déplacer la fenêtre d'affichage de cette fenêtre en la faisant glisser avec
la molette de la souris enfoncée La machine à états suivra l'état dans lequel
se trouve le personnage et diffusera l'animation
adaptée à cet état ou mélangera plusieurs
animations. Nous devons simplement dire à la machine
étatique quels sont
ces états et aussi comment et quand le personnage va
passer d'un état à l'autre. Pour l'instant, nous
n'aurons qu'un seul état, qui combinera les animations d'inactivité et de marche. Si le personnage commence à
marcher après une période d'inactivité, il ne doit pas
immédiatement passer du mode inactif à la marche, pas plus qu'il ne doit revenir immédiatement lorsqu'il s'arrête. Sans oublier que le
joueur pourra incliner légèrement
le joystick gauche pour
se déplacer plus lentement s'il le souhaite. Nous avons besoin que les animations de ralenti et de
marche se
mélangent en fonction de la vitesse de déplacement du
personnage. Cela peut être réalisé
avec un espace de fusion. le bouton droit sur un espace vide, ajoutez un
espace de fusion unidimensionnel à la machine à états et nommez-le locomotion. Cliquez ensuite sur l'outil
Connect Nodes. Cliquez et faites glisser le pointeur du
point de départ jusqu'à la locomotion. faire l'état
par défaut dans lequel le personnage débutera
lorsque nous lancerons le jeu. Revenez en arrière pour sélectionner
et déplacer des nœuds. Cliquez ensuite sur le crayon pour modifier l'espace de mélange de locomotion Un
espace de fusion unidimensionnel possède un axe, qui est affiché
horizontalement entre une valeur nommée
négative et
une valeur positive. Si nous considérons qu'il
s'agit de la vitesse des caractères, nous pouvons le renommer en vitesse et définir sa valeur minimale à zéro et sa
valeur maximale à un Dans ce cas,
il faut considérer qu'il s'agit de 100 % de la vitesse, non d'une
unité par seconde. Nous pouvons ajouter des animations à l'espace de fusion avec
l'outil de création de points. Cliquez dessus à zéro. Nous pouvons ajouter l'animation inactive. Premièrement, l'animation de marche. Cliquez sur définir la
position de fusion dans l'espace. Cliquez ensuite n'importe où le
long de l'axe pour voir à
quoi ressemble l'animation à cette vitesse. Vous pouvez également cliquer et
faire glisser le pointeur pour voir comment
la modification de la vitesse au fil
du temps permet de fusionner les animations. OK. Maintenant, il ne nous
reste plus qu'à avoir
le script du personnage, indiquer à l'arbre d'animation
la vitesse du personnage. Les nœuds peuvent
communiquer facilement
entre eux en les affectant à des variables, et nous pouvons tout faire sur
une seule ligne de notre script en utilisant at on ready au
début de la déclaration Appelons cette variable, soulignons une animation
de type arbre d'animation et attribuons-lui une valeur À l'aide du signe dollar,
nous pouvons ensuite spécifier un chemin de nœud pour accéder à n'importe quel
nœud de l'arbre de scène, en commençant par
le nœud auquel le script est attaché. Si le nœud auquel nous essayons d' accéder est un enfant de celui-ci, il suffit de spécifier
le nom du nœud. Vous pouvez suivre une séquence de
nœuds en
séparant les noms des nœuds
par une barre oblique Si le nom du
nœud contient des espaces, vous pouvez placer le
chemin du nœud entre guillemets. Si vous n'êtes pas sûr
du chemin du nœud, vous pouvez cliquer sur n'importe quel nœud dans l'arborescence de la scène et
sélectionner Copier le chemin du nœud. Puis collez-le sous forme de texte. Notre script contient désormais une référence au nœud de l'arbre d'animation. Tout ce que nous avons à faire est de définir la position de l'espace de fusion après nos calculs de vitesse X Z. En utilisant la variable,
nous pouvons accéder à la méthode set pour définir
n'importe quelle propriété que nous voulons. La propriété que nous voulons définir
est définie sous la forme d'une chaîne, représentant un chemin d'accès
à la propriété
, au même format
que le chemin du nœud. Nous pouvons utiliser les suggestions
pour renseigner automatiquement ce paramètre, recherchant la position de saignement de notre
état de locomotion Comme pour le chemin du nœud, en sélectionnant l'
arbre d'animation dans l'arbre de la scène, nous pouvons étendre les paramètres, la locomotion et copier
le chemin de propriété Puis collez-le sous forme de texte. Spécifiez ensuite la valeur à laquelle nous
voulons attribuer cette propriété,
qui sera une valeur de
0 à 1 représentant le pourcentage de
la vitesse
maximale à laquelle le personnage se déplace Puisque la vitesse D
est un vecteur, nous pouvons utiliser la
méthode de la longueur pour savoir exactement quelle vitesse le personnage se
déplace le long du plan D. Divisez ensuite ce chiffre par
leur vitesse
de marche pour le convertir en un chiffre de 0 à 1 Voyons à quoi cela ressemble
lorsque nous lançons la scène du jeu. Désormais, le personnage alterne entre l'animation de ralenti et l'animation de marche par rapport à sa vitesse
sur le plan x d, mais il ne tourne pas en fonction de la direction dans
laquelle il se déplace. Essayez d'
expérimenter différentes valeurs pour la vitesse de
marche, l'
accélération et la décélération du personnage pour voir comment il se sent Dans la leçon suivante, nous allons
ajouter les rotations et les sauts. Je te verrai dans la prochaine leçon. OK.
19. Rotation: Bonjour, mes amis. Dans
la leçon précédente, nous avons animé la locomotion de notre
personnage Dans cette leçon, nous allons faire pivoter le modèle du personnage pour
qu'il regarde dans la direction dans laquelle il marche. À partir du script du
personnage, si le joueur fournit la direction
du mouvement
, nous pouvons simplement
demander à ce nœud de
regarder sa position actuelle
plus la direction. Cela fera pivoter le
corps du personnage en trois nœuds en D afin que son vecteur de base
avant pointe directement vers
ces coordonnées. Comme nous avons limité la
direction au plan X,
le ne fera pivoter le personnage
que
autour de l' axe Y pour faire face à la direction dans laquelle le
joueur souhaite se déplacer. Mais la rotation
sera immédiate et
orientera le personnage dans
la direction opposée. Comme Gudo inverse l'axe Z, nous pouvons corriger cela
en changeant simplement la direction positive en direction
négative De plus, si nous avons un
lien entre l'enfance le personnage dans la
scène de jeu, comme la caméra, par
exemple, il
sera également déplacé et pivoté, ce
qui n'est pas ce que nous voulons La solution ne
sera pas suffisante. OK. Dans la scène du personnage, nous pouvons voir que tous les composants
visuels
du personnage sont les enfants
d'un nœud en trois D nommé rig. sélectionnant Rig dans l'arbre de scène, nous pouvons modifier sa transformation en cliquant et en faisant glisser
le curseur de rotation en Y pour faire
pivoter le
modèle de personnage autour de l'axe Y. De cette façon, le modèle de
personnage peut être pivoté indépendamment du corps
du personnage en trois D, sorte que cela n'affectera aucun autre
enfant de la scène de jeu Dans le script du personnage, comme nous l'avons fait avec
l'arbre d'animation, nous pouvons utiliser at on ready pour stocker une référence au nœud rig
dans une variable privée. Ensuite, lorsque nous ajoutons de la
vélocité de mouvement au personnage, nous pouvons également demander à l'engin de
regarder où il va. Le personnage
fait désormais face à la direction dans
laquelle il se déplace sans
affecter les autres nœuds. Mais la rotation immédiate n'est
peut-être pas ce que
nous recherchons. Faisons donc
pivoter le personnage un peu à chaque image. Nous pouvons définir la vitesse de
rotation d'un personnage en
tant que variable privée exportée
et lui donner une valeur par défaut. Les moteurs de jeu calculent généralement les rotations en radians et
non en degrés Si vous n'êtes pas familier
avec les radians, un cercle complet de 360
degrés est égal à Pi multiplié par 2 radians Il existe également une autre constante
mathématique nommée T, qui est Pi multiplié par deux. Mais si nous considérons le cas
d'utilisation de cette valeur, nous ne nous préoccupons que de
la rapidité
avec laquelle le personnage pivotera
jusqu'à 180 degrés. Dans le cas contraire, ils
tourneraient simplement dans le sens
opposé. Nous pouvons donc définir la valeur
des variables exportées comme
un multiple de Pi ou du nombre de demi-rotations que le personnage peut
effectuer en 1 seconde Ce qui est inversé nous
indiquera
le temps qu' il faudra
au personnage pour tourner à mi-chemin Vous pouvez également définir vitesse de
rotation de
votre personnage en degrés et utiliser la fonction du degré en
luminosité pour la convertir
au début du jeu Je vais utiliser la
méthode Pi et dire que mon personnage devrait être capable de
faire
demi-tour en une demi-seconde, soit deux fois la vitesse de rotation
Pi. OK. Dans le processus physique, si le personnage
donne une entrée de mouvement, nous devons d'abord
déterminer l'angle de rotation de deux. C'est ce que nous appellerons
l'angle cible. Nous pouvons trouver notre
angle cible à l'aide de la trigonométrie. Si l'angle cible est thêta, ce
qui
représente dans ce cas la rotation y d' un objet orienté
dans la direction, nous pouvons le trouver en utilisant la fonction de tangente
inverse À deux heures. Cela prend
deux arguments flottants, qui sont des valeurs de point de direction x
et de point de direction z. Maintenant que l'angle cible
contient la valeur, nous voulons
déplacer progressivement notre rotation y vers. Ensuite, nous avons besoin de la différence
entre ces deux angles, exprimée sous la forme d'un nombre entre Pi
négatif et Pi positif. indiquant jusqu'où nous devons effectuer une rotation et dans quelle direction. En soustrayant notre rotation
y actuelle de angle
cible, vous obtiendrez
la différence entre
les deux Pour garantir que le
personnage ne
tournera que sur le chemin
le plus court, nous encapsulons ensuite ce résultat à
l'aide de la fonction rap f, en nous assurant que le
résultat se situe toujours entre la valeur
Pi négatif et Pi positif. Nous avons maintenant tous
les chiffres magiques, nous devons faire pivoter le personnage,
mais comment les utilisons-nous ? Nous pouvons déterminer
le sens de rotation à
l'aide d'une
fonction appelée sinus, en passant la
différence d'angle comme argument. Cela renvoie moins un si le nombre est négatif, zéro s'il est nul et positif un s'il s'agit
d'un nombre positif. Si nous le multiplions par le
caractère, la vitesse de rotation et le delta, nous
savons dans quelle mesure ils peuvent pivoter et dans quelle
direction dans une seule image. En ajoutant cela à sa rotation en y, nous allons faire pivoter le personnage, mais nous allons également dépasser
l'angle cible Ainsi, en ajoutant une fonction de serrage, nous pouvons limiter la valeur de la vitesse de
rotation multipliée par Delta à une valeur comprise entre zéro et la valeur absolue de
la différence d'angle La valeur absolue
étant le sinus supprimé, un nombre négatif
deviendra positif. Puis multiplié par le sinus pour garantir que le caractère pivote
dans le bon sens Cela empêchera le
personnage de dépasser la rotation et de
s'arrêter à l'angle cible Pour rendre cela plus efficace, étant donné que nous n'
utilisons l'angle cible qu'une seule fois dans le calcul
de la différence d'angle, nous pouvons copier-coller
son calcul dans la même ligne et
avoir une variable de moins. Et comme ce processus s'
exécute 60 fois par seconde, il ne devrait pas
déclarer de variables. Nous allons donc déplacer la
déclaration de variable en haut du script. Enfin, nous devons supprimer la ligne de recherche ci-dessous car
elle n'est plus pertinente. Maintenant, le personnage pivote progressivement pour faire face à la direction de saisie du
joueur Et nous pouvons modifier
leur vitesse de rotation dans l'inspecteur. Ensuite, ajoutons un bouton d'
exécution que
le joueur peut maintenir
enfoncé pour se déplacer plus rapidement. Ouvrez les paramètres du projet et passez à l'onglet de la carte en entrée. Ajoutez une action d'exécution. J'utiliserai la touche Shift
ou le bouton gauche. Dans le script du joueur, nous pouvons réagir aux différents événements liés à la pression sur les
boutons de
manière plus efficace qu'
avec les entrées de mouvement en utilisant une fonction différente, la saisie du trait de
soulignement Cette fonction
n'est appelée que pendant les images lorsqu'un événement
d'entrée se produit. Au lieu de Delta, le paramètre d'entrée est un événement d'entrée, c'
est-à-dire une structure contenant des informations sur l'
événement qui s'est produit. Dans cette fonction,
nous pouvons ensuite vérifier cette structure pour voir si
le bouton d'exécution a été enfoncé. Si c'est le cas, nous pouvons dire
au personnage de courir. OK. De même, nous pouvons également vérifier si le
bouton d'exécution a été relâché. Et si c'est le cas, dites au
personnage de marcher. Dans le
script du personnage, nous pouvons ajouter une vitesse de course en fonction
de la vitesse de marche. Ajoutez ensuite une autre variable
privée non exportée appelée
vitesse de déplacement avec une
valeur par défaut de vitesse de marche. Dans les fonctions de marche et de
course, il suffit de régler la valeur
de la vitesse de déplacement comme étant
la vitesse de marche ou la vitesse de
course en conséquence. Utilisez ensuite la vitesse de déplacement
dans nos calculs de vélocité. Cependant, pour déterminer
la position de fusion pour les animations de
locomotion du personnage, nous utiliserons la vitesse de course En sélectionnant l'arbre
d'animation du personnage, nous pouvons ensuite modifier l'espace de fusion
de locomotion Maintenant, si nous considérons
qu'une valeur de vitesse de un est le personnage
qui court à pleine vitesse. Nous pouvons utiliser l'outil de sélection
et de déplacement de points pour déplacer notre animation de marche plus
près
du milieu de l'axe et ajouter
une autre animation à du milieu de l'axe et ajouter l'extrême droite
pour notre animation de course, soit en passant
à l'outil de création de
points, soit en cliquant avec le bouton droit de la souris. Quelle que soit la vitesse,
l'espace de fusion
fusionnera les
animations les plus proches à gauche et à droite en
appliquant des pondérations à l'animation en
fonction de leur proximité. De retour dans la scène du jeu,
avant de tester une course à pied, nous devrions peut-être laisser un peu plus de place à notre
personnage. Ainsi, en sélectionnant le sol, nous pouvons modifier rapidement
la taille du sol et de tous ses enfants en
augmentant son échelle. Maintenant, lorsque nous lançons la scène de jeu, le personnage peut non seulement
se déplacer dans la scène, mais aussi courir en
maintenant le bouton d'exécution enfoncé. Selon les valeurs utilisées
pour l' accélération
par rapport à la décélération, peut avoir l'impression que le
personnage du mal à
réorienter son élan Si nous examinons
le processus physique, l' énoncé
le décompose en fonction du
fait que le joueur fournit ou non une entrée de
mouvement. Nous pouvons le décomposer davantage
pour tenir compte du fait le joueur souhaite ou non se déplacer dans la même direction que
le personnage. Pour vérifier si
la direction que le joueur souhaite prendre est similaire à celle dans laquelle
le personnage se déplace déjà. Nous pouvons utiliser des mathématiques vectorielles. Un produit par points est un moyen de multiplier deux vecteurs
ensemble, ce qui
donnera un nombre représentant similitude ou de différence
entre ces vecteurs Le produit scalaire de deux vecteurs, tous deux pointant dans la même
direction, sera égal à un, et les directions opposées,
à moins un. Si les deux vecteurs
forment un angle droit, s'ils sont perpendiculaires, leur produit
scalaire sera nul. Nous pouvons donc vérifier
si le résultat
du produit scalaire est
supérieur ou égal à zéro pour savoir si le personnage doit accélérer dans
la direction souhaitée. Puisque le joueur
veut se déplacer
plus ou moins dans la même direction où le personnage
se déplace déjà, sinon, le
produit des points est négatif, ce qui signifie que le
joueur essaie se déplacer plus ou moins dans
la direction opposée. Nous devrions dire au personnage de ralentir, pas Désormais, la
décélération du personnage peut être appliquée lorsque le joueur change
soudainement Nous avons maintenant le
personnage qui tourne et court dans notre scène. Dans la leçon suivante, nous allons
ajouter des animations de saut. Je te verrai dans la prochaine leçon.
20. Sauter: Bonjour, mes amis. Dans
la leçon précédente, nous avons fait pivoter le personnage en fonction de la direction dans laquelle
il se déplace Dans cette leçon, nous allons
ajouter des animations de saut. Commençons par activer les ombres causées par la lumière
du soleil dans nos scènes. Sélectionnez le nœud tridimensionnel de la
lumière directionnelle, étendez la section d'ombre et activez le bouton d'activation
s'il n'est pas déjà activé Cela nous donnera un
peu plus
de perspective sur la hauteur à laquelle le
personnage saute. Dans la scène du personnage, si nous
sélectionnons le nœud
du lecteur d'animation, l'onglet animation devrait s'ouvrir en bas
de la fenêtre. Vous pouvez également l'ouvrir manuellement en
cliquant sur l'animation ici. En parcourant la
liste des animations, nous pouvons voir qu'il existe plusieurs animations de
saut différentes. Si nous sélectionnons l'une de ces
animations, elle ne sera pas jouée. Cela est dû
au fait que l'arbre d'animation est actuellement en plein contrôle. Sélectionnez l'
arbre d'animation et cliquez sur le bouton actif pour le désactiver pendant
que nous explorons
les animations de saut Pour revenir au lecteur
d'animation, ouvrez l'animation courte ou
longue de saut et appuyez sur Play. Ces animations
ne sont pas très flexibles. Nous voulons que nos sauts
soient plus dynamiques. ouvrant l'animation de
démarrage, nous pouvons voir que c'est cette
animation qui devrait se produire lorsque le joueur
appuie sur le bouton de saut. Zoomez pour voir
les images clés de l'animation. Comme il y a 30
images par seconde, elles sont espacées de 0,033 à
3 secondes. Nous pouvons régler le snap sur
cette valeur pour nous
permettre chaque
image individuelle à l'aide de la chronologie Si nous passons notre aperçu en vue orthogonale
à gauche ou à
droite et que nous zoomons
sur les pieds du personnage Notez que les
pieds du personnage restent au sol pendant 0,3 seconde pendant toute la durée
de l'animation. C'est important, car
si nous ajoutons de
la vélocité au personnage au début de l'animation, cela
aura une mauvaise apparence. Elle est ensuite suivie de
l'animation jump idle, qui doit tourner en boucle jusqu'à ce que le
personnage touche le sol. Ce qui devrait ensuite mener
au saut et à l'animation. En décomposant ces animations
de cette manière, le saut peut être de n'importe quelle durée
tout restant beau
aux yeux du joueur. Notez également que la dernière
image de l'
animation jump start est identique à la première image de l'animation
jump idle. Cela vaut également pour
la dernière image du jump idle et la
première image du jump land, mais peu importe
, le moment
où le personnage atterrit
peut se produire à tout moment. En sélectionnant le nœud de l'arbre d'
animation, nous pouvons
le réactiver dans l'inspecteur, puis examiner
la machine à états. Nous pouvons ajouter les trois
animations de saut à la machine à états. J'aimerais les placer au-dessus de
l'espace de mélange de locomotion, disposés dans le même ordre gauche à droite que celui dans
lequel ils seront utilisés Ajoutez une connexion entre
Jump Start et Jump Idle. Regardez ensuite dans le panneau de
l'inspecteur. Ce sont les propriétés de la transition entre les états. Nous voulons que ces deux
animations se jouent en séquence
directe puisque la dernière et la première
image sont identiques. Lorsque l'
animation de démarrage est terminée, il suffit de
passer immédiatement en mode jump idle. élargissant la section du commutateur, nous pouvons régler le
mode de commutation à la fin. L'icône en forme de flèche dans la
machine à états changera pour indiquer que cette
transition aura lieu à la fin
de l'animation. Ajout de la transition entre
jump idle et jump land. Nous voulons que cette
transition se fasse immédiatement lorsque le
personnage touche le sol. Cela signifie que nous ne saurons pas
exactement à quel endroit se trouve le frame jump idle
lorsque cela se produira. Pour éviter des contractions gênantes, nous pouvons faire fondre les deux
animations ensemble pendant une courte fenêtre, environ
un dixième de seconde, juste assez longtemps pour que le
changement ne soit pas immédiat En ce qui concerne le moment où le changement se produit, nous voulons qu'il soit immédiat, mais sous une condition précise, lorsque le personnage
touche le sol. développant la section avancée, nous pouvons écrire n'importe quelle condition ou combinaison de
conditions que nous voulons dans la zone de texte de l'expression pour contrôler le moment où cette
transition aura lieu. Comme dans le script du personnage, nous pouvons utiliser le
corps du personnage à trois nœuds en D (
méthode intégrée au sol ) pour vérifier si le personnage
touche le sol. Lorsque cela sera vrai, la transition
commencera à s'estomper de Jump Idle à Jump Land pendant
un dixième de seconde, puis à jouer le
reste de Jump Land Toutefois, pour utiliser cette fonctionnalité, nous devons resélectionner le nœud de l'arbre
d'animation et
modifier sa propriété de nœud de
base d'expression avancée Il s'agit du nœud sur lequel l' expression
avancée
sera appelée, et nous voulons utiliser
le nœud en
trois D du corps du caractère pour vérifier que
la valeur de is on floor est au sol. Ensuite, lors de la transition entre le terrain de
saut et la locomotion. Nous voudrons permettre à
cette animation de jouer dans son intégralité avant de
revenir à la locomotion Le mode switch
devrait donc être terminé. Alors que la dernière image de Jump Land est la même que
la première image d'inactivité. Si le personnage atterrit
alors qu'il est en mouvement, nous ne voulons pas
passer immédiatement de la terre sautée
à la marche ou à la course. Nous pouvons donc également ajouter une croix triste à cette transition pour la
mélanger plus facilement. En ajoutant une transition entre
la locomotion et le saut, celle-ci sera déclenchée lorsque le
joueur appuiera sur un bouton Développez la
section avancée et changez le mode avancé
de automatique à activé. La flèche verte devient alors
grise dans la machine à états, car la transition
n'est plus automatique. Cela nous permettra de
déclencher manuellement cette transition par le biais de notre script de
personnage ultérieurement. Comme nous ne savons pas ce que
fait l'espace de mélange de
locomotion à un moment quelconque lorsque le joueur appuie sur
le bouton de saut, ajout d'un bref fondu croisé à cette animation
facilitera également la transition Enfin, les animations jump idle et jump
land peuvent également être utiles si
le joueur
descend d'un rebord
au lieu de sauter L'ajout d'une transition
directe entre la locomotion et le mode jump idle
répondra à ce cas Nous pouvons définir l'
expression avancée pour cette transition
si le personnage
n'est pas au sol. Et traversez la décoloration due à la locomotion pour sauter au ralenti afin de faciliter
la transition Mais que se passerait-il si les conditions
nécessaires pour passer de la locomotion au démarrage ou au saut au ralenti étaient
toutes deux réunies en même temps ? Le personnage a
quitté le sol et le joueur a appuyé sur le bouton de
saut dans cette image. Si vous souhaitez contrôler
quelle transition est prioritaire dans ce cas, vous pouvez sélectionner chaque transition et définir son paramètre de priorité. L'infobulle nous indique
que les nombres les plus faibles sont prioritaires lorsque plusieurs
transitions sont possibles. je donnerai la priorité
à jump start Dans
ce cas, je donnerai la priorité
à jump start en mettant sa priorité de
transition à zéro. Nous pouvons prévisualiser l'apparence de ces
animations, transitions et croix en
cliquant sur le bouton de lecture n'importe quel état pour forcer la
machine à états à passer dans cet état Notez que ce personnage
flotte dans espace
vide et n'est
donc pas au sol. Notre script de personnage
utilise toujours le code modèle de base pour
faire sauter le personnage. Nous devrions le mettre à jour
pour qu'il corresponde à la façon dont nous traitons les entrées relatives
à la marche et à la course. Ouvrez les paramètres du projet et passant à l'onglet de la carte d'entrée, nous pouvons ajouter une action pour sauter. J'utiliserai la barre d'espace et le bouton
inférieur
de ma manette comme événements pour le saut. OK. En fermant les paramètres du projet et en ouvrant le script du lecteur, nous pouvons ajouter une autre condition à notre instruction pour vérifier si
le bouton de saut a été enfoncé. Et si c'est le cas, dites au
personnage de sauter. En passant au script du
personnage, nous pouvons ajouter une fonction de
saut public. OK. Avant de pouvoir écrire
la fonction de saut, nous devons accéder à
la machine d'état. Ajout d'une autre déclaration de
variable sous l'arbre d'animation. En commençant par Add on ready, nous allons obtenir une référence à
la lecture de la machine à états. Il est de type animation
state machine playback et nous pouvons y accéder depuis l'arbre d'animation à
l'aide de crochets. Entre crochets, nous pouvons spécifier un chemin vers ce à quoi nous essayons d'
accéder sous forme de chaîne. Ce à quoi nous voulons accéder,
c'est la lecture des paramètres. OK. Comme précédemment, si nous sélectionnons le nœud de l'arbre
d'animation, nous pouvons voir la
ressource de lecture répertoriée ici. souris sur son nom nous
donne le chemin de la propriété, ou nous pouvons cliquer avec le bouton droit copier son chemin et le
coller sous forme de texte Maintenant, nous pouvons accéder à
la machine d'état lorsque le personnage
est invité à sauter. Si le personnage
est au sol, nous pouvons demander à
la machine à états de passer
à l'état Jump start. Assurez-vous que le nom de
l'État correspond exactement. Ensuite, copiez également la
ligne ci-dessous, qui applique la vitesse de saut des
personnages, et supprimez complètement ces lignes
du processus physique. Si nous le testons, le
personnage sautera, mais l'animation et la
vélocité ne sont pas synchronisées. En ajoutant une autre fonction
privée distincte nommée appliquer la vélocité du saut, nous pouvons régler la vélocité y du
personnage sur la vitesse de saut, déplaçant ainsi le
corps du personnage vers le haut. Et assurez-vous que le script est
enregistré avant de continuer. Désactivez l'
arbre d'animation pendant un moment. Ensuite, dans l'animation Jump
Start, frottez jusqu'au cadre lorsque les pieds du
personnage
quittent le sol En cliquant sur « Plus ajouter une piste ». Nous pouvons ajouter nos propres pistes
à cette animation. Le type de piste que nous voulons
ajouter est une piste de méthode d'appel. Ensuite, sélectionnez le nœud sur
lequel
vous souhaitez appeler une méthode, à savoir le nœud en trois D
du corps du personnage. Faites défiler la page vers le bas pour
trouver notre nouvelle piste ajoutée, puis cliquez avec le bouton droit de la souris sur cette piste l'
intersection de la
ligne de nettoyage Sélectionnez ensuite Insérer une clé. Nous pouvons appeler n'importe quelle méthode à partir de notre script de personnage ou n'importe
laquelle des méthodes héritées du nœud en
trois D du corps du personnage lui-même. La méthode que nous voulons appeler consiste à appliquer la vélocité du saut
à notre personnage. N'oubliez pas de réactiver l'arbre
d'animation avant de tester. Désormais, lorsque le joueur
appuie sur le bouton de saut, le personnage lance l'animation du saut
et attend que ses pieds
quittent réellement le sol avant de se déplacer vers le haut. OK. Dans certains jeux, vous souhaiterez peut-être que le personnage saute de manière
plus responsable. Dans ce cas, il est important
d'utiliser des animations où les pieds du personnage
quittent le sol au début de l'animation. Nous avons maintenant les personnages qui
sautent et tombent animés. Dans la leçon suivante,
nous allons améliorer la sensation du saut et la façon
dont le joueur le contrôle. Je te verrai dans la prochaine leçon.
21. Gravité: Bonjour, mes amis. Dans
la leçon précédente, nous avons ajouté des animations
de saut à notre personnage. Dans cette leçon, nous allons améliorer la mécanique des sauts et des
chutes. Lors du test du saut,
il y a quelques problèmes. Elle est lente et flottante. Le joueur a
autant de
contrôle sur le personnage dans les airs
qu'au sol, et nous ne pouvons en aucun cas modifier la hauteur de
saut. Si nous examinons le script de
caractères, la vitesse de saut est
définie comme une constante. Nous pouvons également voir
que la force de gravité est
récupérée dans les paramètres du projet. Si nous ouvrons les paramètres du projet, nous pouvons suivre cette
chaîne pour trouver les paramètres de gravité sous
Physics three D deft gravity La direction de la gravité
est également modifiable ici. Augmentons la gravité pour que le personnage se sente plus lourd. Je vais multiplier par deux. Notez que cette modification
affectera tout ce qui
est soumis à la gravité dans l'ensemble du projet. Si vous souhaitez uniquement affecter
la gravité du personnage, nous pouvons le faire
dans le script du personnage. Dans la scène du jeu, passez
à trois D V. Dans mon esprit, définir une vitesse de saut n'a pas vraiment de sens
. J'aime plutôt penser à la hauteur à laquelle je veux que le personnage
puisse sauter. Nous pouvons créer rapidement et facilement géométrie
de base dans
notre scène à l'aide d'un type de nœud appelé CS G ou géométrie solide
constructive. Ajoutons une boîte CSG. Déplacez-le sur le côté et
posez-le proprement sur le sol. Ajoutez une collision à la case
en cliquant sur le bouton de collision
dans l'inspecteur Nous pouvons redimensionner la boîte en
saisissant des valeurs dans l'inspecteur ou en cliquant et en faisant glisser les
points rouges dans l'aperçu Redimensionnez la case
jusqu'à ce qu'elle représente la hauteur maximale sur laquelle
vous souhaitez votre personnage
puisse sauter Nous pouvons voir exactement
la hauteur de la boîte avec sa
valeur y dans l'inspecteur. Mais assurez-vous que le bas
de la boîte est sur le sol. Sa valeur de position de transformation y doit être égale à la moitié de sa hauteur. Dupliquez cette case soit en cliquant dessus avec le bouton
droit de la souris et
en sélectionnant Dupliquer, soit en utilisant le raccourci
Ctrl D ou la commande D. Placez le duplicata à
côté de l'autre case. Faites en sorte que cette case soit plus haute que
la précédente et qu'elle représente une hauteur sur
laquelle le personnage ne
devrait pas pouvoir sauter Dans le
script du personnage, comme nous avons défini un tas de variables pour personnaliser la façon dont le
personnage se déplace, nous pouvons faire la même chose avec la
façon dont le personnage saute Exportons une
variable privée nommée hauteur de saut sous forme flottante et
donnons-lui une valeur par défaut quelque part entre
les hauteurs des deux cases que nous venons de créer. Cela permettra au
personnage de sauter sur la première case,
mais pas sur la seconde. Ajoutez ensuite une variable privée
non exportée pour conserver la vitesse
de saut réelle requise pour
atteindre cette hauteur de saut. Nous avons maintenant deux catégories
de variables complètement
distinctes dans notre script, l'une pour contrôler la
façon dont le porteur se déplace et l'autre pour contrôler la
façon dont le porteur saute Nous pouvons ajouter une autre ligne
au-dessus de ceux-ci pour
souligner davantage leur distinction
au niveau de la catégorie des ports. Entrez ensuite un
nom de chaîne pour la catégorie. J'appellerai ces variables de
locomotion et celles ci-dessous des variables de
saut Cela nous fournit non seulement plus d'
informations dans le script, mais
les sépare également dans l'inspecteur. Je vais également déplacer la direction dans la catégorie locomotion et la gravité dans la catégorie
saut. Je le marque comme privé
avec un trait de soulignement. Si vous souhaitez que votre
personnage subisse une force de gravité
différente de celle des autres objets de votre jeu, vous pouvez également exporter
une autre variable. Appelons-le masse et
donnons-lui une valeur par défaut de un. Cela agira comme un multiplicateur de la gravité ajoutée
au personnage. Ainsi, à 0,5, la gravité
serait réduite de moitié, ou avec une masse de deux,
la gravité doublerait. Dans la fonction ready, nous pouvons calculer la
vitesse de saut en utilisant la physique. La vitesse de saut requise pour atteindre la hauteur de saut souhaitée est la racine carrée de la
hauteur de saut multipliée par la gravité, également multipliée
par la masse si vous
l'utilisez et multipliée par deux. OK. Changez la vitesse
de saut ajoutée à la
vélocité y du personnage pour cette nouvelle variable, et nous pouvons désormais
supprimer la constante puisqu'elle n'est
plus utilisée. Nous devons également multiplier le graphty par la masse dans
le processus physique. Passons à la scène du jeu et
essayons de sauter dans nos cases. Le personnage peut
sauter assez haut pour atteindre la première case,
mais pas la seconde. Essayez d'
expérimenter différentes valeurs hauteur
de saut, de gravité ou de masse, et voyez comment elles modifient la sensation des
personnages qui sautent Et si le joueur ne
veut pas sauter à pleine hauteur ? plupart des jeux,
le personnage doit effectuer un petit saut en
appuyant sur le bouton, et un saut plus haut
en maintenant le bouton enfoncé. Le fait que l'animation
du personnage soit retardée avant sauter peut vraiment être bénéfique pour implémenter cette fonctionnalité. Commençons par ne pas
définir de hauteur de saut, mais à la fois une hauteur de saut maximale
et une hauteur de saut minimale. Cela signifie que nous aurons également besoin d'une vitesse de
saut minimale et maximale. Et calculez ces deux
valeurs dans la fonction prête. OK. Nous devons ensuite ajuster la
vélocité ajoutée au
personnage en fonction
du temps pendant lequel le bouton
est resté enfoncé. Pour mesurer le temps, il existe un
type de nœud
pratique que nous pouvons ajouter à notre personnage, un nœud chronométré. Nommons ce pull. Et saisissez une référence au nœud
du temporisateur pendant
la phase de préparation, la même manière que nous l'avons fait
avec les autres nœuds. Comme le nom du
nœud contient des espaces, le chemin est placé entre
guillemets. En divisant le saut en
deux fonctions du serveur, appelons la
première fonction start jump Lorsque le bouton de saut est enfoncé,
nous pouvons démarrer le chronomètre. Ensuite, lorsque le
bouton de saut est relâché, nous pouvons définir sa
propriété de pause sur true qui signifie que
lorsque nous le
démarrerons, nous devrons également définir sa propriété
suspendue sur false Nous devrons donc modifier
le script du joueur pour appeler Start Jump
lorsque le bouton est enfoncé et terminer le saut
lorsque le bouton est relâché. Dans l'inspecteur,
nous pouvons voir que le chronomètre est réglé pour compter à
rebours à partir d'une seconde, ce qui est supérieur à 0,3
seconde, donc c'est très bien. Mais nous devons activer
le bouton One Shot,
afin que le compte à rebours ne soit effectué qu'une
seule fois et qu'il ne se réinitialise pas à
chaque fois qu'il est terminé Lorsque la vélocité du saut est réellement ajoutée
au personnage, nous pouvons suspendre le chronomètre s'il
n'a pas déjà été interrompu Si le joueur est toujours
enfoncé sur le bouton de saut. Nous pouvons commencer par ajouter la vitesse de saut
minimale. Ajoutez ensuite également la
différence entre la vitesse maximale et
minimale. Multiplié par un moins le
temps restant sur le chronomètre, divisé par le temps
maximum possible,
que nous avons déterminé à partir de l'
animation est de 0,3 seconde. Nous ne voulons jamais que ce soit
supérieur à 0,3 seconde, nous
pouvons donc appliquer la fonction min
pour le plafonner à 0,3. Si le joueur
appuie sur
le bouton et le relâche en
une seule image, ce chiffre sera proche de zéro et le résultat sera une vélocité de saut
minimale. Si le joueur maintient
le bouton enfoncé pendant 0,3 seconde,
ce sera
le point zéro 3/0 0,3, soit un, et le résultat sera la vitesse de
saut maximale Un intervalle de temps entre
les deux résultats s'
échelonnera de manière linéaire Essayons-le en
exécutant la scène du jeu. En appuyant sur le
bouton de saut, le personnage saute jusqu'à une hauteur
de 1,5 unité, et en maintenant le bouton enfoncé,
il saute jusqu'à 2,5 unités Maintenir le bouton enfoncé pendant différentes durées produit des
sauts de différentes hauteurs Ensuite, ajoutons d'autres variables
exportées à notre catégorie de saut. Contrôle de l'air et freins à air. Ce sont des multiplicateurs d' accélération et de
décélération, respectivement, qui réduiront le contrôle que le joueur a sur le personnage dans les airs sans l'
éliminer complètement 0,5 est un bon point de départ
pour leur valeur par défaut. Vous devrez effectuer un test pour déterminer comment vous voulez que le personnage se
sente dans votre jeu. Dans le processus physique,
le premier bloc de code fait pivoter le jeu de
caractères dans la direction souhaitée. Dans la plupart des jeux, cela
se produit indépendamment du fait que le personnage soit
au sol ou dans les airs. Ensuite, il faut ajouter la gravité, qui ne s'applique que lorsque le personnage
n'est pas au sol. Ce bloc déplace
le personnage, mais il le fait d'une
manière qui n'a sens que lorsque le
personnage est au sol. Mais appliquez-le sur tous les cadres, qu'ils soient au sol ou en plein air. Ensuite, la position de
fusion de l'animation de locomotion est définie, ce qui, encore une fois, ne s'applique que lorsque le personnage
est au sol L'application de la vitesse D et la méthode du déplacement et du glissement
sont universellement applicables. Nous pouvons donc séparer les parties
du processus physique
en physique générale, physique sol et physique de l'air, en
écrivant une nouvelle fonction pour la physique du
sol et de l'air, à la fois privée et acceptant
un paramètre de débit pour Delta. Nous pouvons ensuite couper et
coller la gravité dans
la fonction de physique de l'air et les calculs de mouvement dans la fonction
physique du sol. Ensuite, dans le processus physique, si le personnage est au
sol, appelez la physique du sol. Sinon, appelez la physique de l'air. En utilisant Delta comme
argument pour les deux. Notre processus physique est désormais beaucoup plus restreint et
plus facile à comprendre, tandis que les physiques du sol
et de l'air sont séparées l'une de l'autre et
plus faciles à gérer. Alors, comment appliquer le
contrôle de l'air et les freins à air ? Copiez et collez les calculs
de
vitesse x issus de la physique du sol
vers ceux de la physique de l'air. Multipliez ensuite chaque fois que
le joueur essaie de contrôler le personnage dans
les airs par contrôle aérien. Et à chaque fois, ils n'
essaient pas de contrôler le personnage en
l'air avec des freins à air. Ce n'est pas la même chose
que l'accélération et la décélération dans ce cas, car lorsqu'il essaie de faire
demi-tour en l'air, le joueur essaie toujours de
contrôler En appliquant la vitesse du saut 0,3 seconde après le début de l'animation du
saut, nous produirons une grande quantité de temps de coyote pour le personnage Si vous ne le souhaitez pas, vous pouvez exiger que le
personnage soit toujours au sol avant d'ajouter
la vélocité du saut
avec une instruction if. De plus, l'initialisation de la
vitesse de déplacement doit utiliser Add on Ready Actuellement, cela initialise vitesse de
déplacement à la
valeur par défaut de la vitesse de marche Mais si nous remplacions la valeur par défaut de
la vitesse
de marche, elle ne serait pas affectée
à la vitesse de déplacement Utilisez des blocs de géométrie pour créer un petit parcours d'obstacles
pour votre personnage. Est-il difficile de contrôler les personnages
qui sautent ? Testez différentes valeurs jusqu'à ce que vous obteniez l'impression que
vous recherchez pour votre jeu. personnages sautent maintenant et suivent des mécanismes, ce qui leur donne l'
impression d'être plus réalistes. Et dans la prochaine leçon, nous
ajouterons des commandes de caméra. Je te verrai dans la prochaine leçon.
22. Appareil photo: OK. Bonjour, mes amis.
Dans la leçon précédente, nous avons ajusté la façon dont les forces affectent
notre personnage dans les airs Dans cette leçon, nous allons ajouter des
commandes de caméra à notre scène de jeu. Comme nous l'avons fait dans les leçons
précédentes, il serait facile de
simplement adapter la caméra au joueur. La caméra suivra
le joueur partout, mais il
serait compliqué de faire pivoter la caméra autour du joueur. Mais si nous ajoutons simplement une autre
couche de séparation, à savoir
qu'il n'y a pas d'enfant au joueur avec la caméra
puis un petit-enfant, cela devient beaucoup plus simple Les inclinaisons et
rotations de caméra que nous attendons des jeux
contrôlés par une tierce personne peuvent être obtenues uniquement en modifiant les valeurs de rotation de
ce nœud intermédiaire, soit autour des axes x ou y. rotation autour de l'axe
Y pivoter la caméra
autour du personnage, comme on s'y attend en inclinant
le joystick droit horizontalement rotation autour de l'axe X inclinera la caméra vers le haut ou vers le bas. Qu'attendons-nous en inclinant
le joystick droit à la verticale ? Comme la caméra est
une enfant de ce nœud, elle suivra sa rotation et restera également focalisée sur le
personnage. Nous pouvons régler le point focal de la
caméra, en le déplaçant des pieds jusqu'à la
tête du
personnage en déplaçant le
nœud vers le haut le long de l'axe y. À partir de là, nous pouvons également ajuster la propriété de
décalage horizontal de la caméra pour
décaler davantage la caméra le long l'axe x afin de produire un effet de caméra d'
épaule. Nous pouvons même contrôler la
distance entre la caméra et le personnage et la contrôler dynamiquement
en modifiant le type de nœud. Cliquez avec le bouton droit sur le nœud sélectionnez Changer le type et recherchez le nœud Spring
Arm Three D. Nous pouvons également modifier le nom
du nœud pour qu'il reflète
son nouveau type. La caméra étant un
enfant du bras à ressort, nous devons réinitialiser sa transformation afin qu'elle ait la même position
et la même rotation que le bras à ressort. Dans l'inspecteur, nous pouvons voir que la longueur du ressort
est fixée à 1 mètre. La caméra essaiera toujours
de se repositionner à 1 mètre de ce
nœud le long de son axe Z. Augmentons cette distance à quelque chose de plus élevé, par
exemple 5 mètres. OK. Ce
nœud à bras à ressort est également en collision. S'il y a un
objet en collision entre l'origine du
bras à ressort et la caméra, marge correspond à la
distance à laquelle la
caméra sera positionnée par rapport à la collision. La caméra sera positionnée le plus
près possible de la longueur du
bras du ressort avant
qu' une collision ne se produise, comprimant le ressort. Si l'obstacle est retiré, le ressort se décompresse et éloigne sur toute la distance. Cela se fait à l'aide d'un jet de rayons, en vérifiant un seul point le long de
l'axe de réglage des bras du ressort. Mais si nous spécifiez également une
forme pour le bras à ressort, nous pouvons indiquer le volume de collision en remplaçant le raycast
par un moulage de forme Exiger qu'il
y ait plus d'espace vide avant de permettre à la caméra de
revenir sur toute la distance. Si nous transformons la forme en boîte, nous pouvons définir ses dimensions, et maintenant la boîte
sera utilisée pour détecter distance que la caméra peut parcourir le long du
bras à ressort. Pour contrôler la caméra,
nous devons ajouter d' autres mappages d'entrée aux paramètres
du projet. Ouvrez les paramètres du projet et passez à l'onglet de la carte en entrée. Ajoutez des actions pour la gauche, droite, le haut et le bas. J'utiliserai les
touches fléchées et le stick tilt pour les événements qui
déclencheront chacune de ces actions. Dans le script du joueur, nous avons déjà une référence
à la caméra, mais ce n'est pas la caméra que nous allons
réellement contrôler. Nous devons obtenir une référence
au nœud du bras à ressort. Et mettez-le dans l'inspecteur. Dans la fonction process, nous pouvons appeler une fonction que nous
n'avons pas encore écrite. Dans un script, nous n'avons
même pas encore
créé le bras à ressort pour
regarder dans une direction. Nous pouvons
obtenir la direction à suivre à partir de l'
entrée, comme nous l'avons fait ici, du vecteur d'entrée avec la gauche
comme le x négatif, la
droite comme le x positif. Recherchez le y négatif et le bas comme le y positif. Créons le script
Spring Arm. Il héritera de
Spring Arm Three D. Il n'existe aucun modèle pour les scripts
Spring Arm Three D, et la valeur par défaut « aucun
modèle » n'est pas pertinente Décochons l'option du
modèle, ce qui nous permettra
de partir d'un script vide Je vais simplement nommer ce ressort
et l'enregistrer dans le dossier
des scripts. Nous savons déjà que nous devons
écrire une fonction publique n, qui acceptera un paramètre
de
direction de type vecteur deux à partir
du script du lecteur. OK. Il suffit ensuite de
faire pivoter ce bras à ressort autour de l'axe x par direction et de l'
axe y par direction x. Mais comme tout ce qui se passe au cours d'une fonction de processus, cela se produit 60
images par seconde, et nous voulons qu'il fonctionne
indépendamment de la fréquence d'images, c'
est-à-dire en le multipliant par Delta Mais nous n'avons pas
accès à Delta ici, car cette fonction ne l'
a pas en paramètre. Nous pouvons l'ajouter à la liste des paramètres et le transmettre
depuis le script du lecteur. OK. Ou nous pouvons simplement appeler une méthode intégrée, faire traiter Delta
T pour la récupérer. Maintenant, le bras à ressort qui maintient la caméra pivote
avec l'inclinaison du joystick droit. Ces rotations se produisent à une vitesse de 1 radian/seconde Nous pouvons modifier la vitesse
des rotations en exportant
une variable privée Appelons cela vitesse de rotation. Multipliez ensuite ce résultat par
la direction et le delta. Si vous souhaitez que ces rotations
aient des vitesses différentes, vous pouvez exporter des
variables distinctes pour elles. OK. Alors que la rotation y est généralement autorisée à
tourner indéfiniment, la rotation x a
généralement des limites Les commandes seront cassées si
nous laissons la caméra s'incliner complètement pour regarder
directement vers le haut ou directement vers le bas. Puisque l'
axe de la caméra est aplati sur le plan X, il
deviendra nul ou inversé Nous devons donc fixer la rotation
des bras du
ressort entre une valeur minimale
et une valeur maximale. Si la caméra est à plat par rapport à
l'horizon, si elle tourne de 0 radians, regarder vers le haut ou
vers le bas correspond à une rotation de Pi sur 2 radians dans le sens positif
ou négatif Il suffit de s'assurer
que la valeur absolue est inférieure à Pi sur deux. Appliquer la rotation en x entre le Pi
négatif et le Pi positif sur trois est une solution rapide
et facile qui offre tout de même une large plage Nous pouvons également exporter ces valeurs et autoriser la modification de ces
limites OK. Vous pouvez aller plus loin et utiliser les
deux cinquièmes de Pi, ou même utiliser la
fonction
degrés en radiance pour convertir 89
degrés Tant que la caméra ne peut pas passer directement au-dessus ou en dessous
du personnage, OK. Dans le script du joueur,
nous devons apporter quelques ajustements aux commandes de nos
personnages. La caméra étant désormais issue
du bras à ressort, ne tourne
plus, moins pas dans l'espace local. Le bras à ressort tourne et la caméra reste
immobile par rapport à celui-ci. Nous pouvons obtenir les vecteurs de base
globaux des caméras
qui, au lieu d'être
relatifs au nœud parent, seront relatifs à
la scène entière. Nous pouvons également utiliser les vecteurs de base
du bras à ressort lui-même. OK. Et dans ce cas, nous n'avons même pas besoin d'une référence
à la caméra. Nous avons maintenant la caméra facilement
contrôlée par le joueur. Dans la leçon suivante,
nous allons importer et implémenter
des modèles environnementaux dans notre jeu. Je te verrai dans la prochaine leçon.
23. Donjon: Bonjour, mes amis. Dans
la leçon précédente, nous avons ajouté
des commandes de caméra à notre jeu. Dans cette leçon,
nous allons construire une pièce laquelle notre personnage pourra
courir et sauter. J'ai téléchargé le pack d' actifs remasterisé
K Hits Dungeon Ouverture du dossier des actifs. Si nous regardons dans le dossier G LTF. Il existe un grand nombre
de modèles que nous pouvons facilement importer dans
ado pour notre projet. Dans Go, créons d'abord
un nouveau dossier dans
le
dossier des actifs importés nommé Dungeon Lorsque ce nouveau dossier est sélectionné, l'
importation des actifs les
placera dans ce dossier. Tout comme pour les personnages, nous devrons apporter
quelques ajustements
aux paramètres d'importation
de ces actifs. Commençons par la saleté
du sol Large. Double-cliquez sur la ressource
ou sélectionnez Avancé dans
l'onglet des paramètres d'importation pour ouvrir la fenêtre des paramètres
d'importation avancés. Si nous sélectionnons le nœud en trois D de l'
instance de maillage, nous pouvons permettre à Dieu de générer automatiquement
une forme de collision pour cet actif en
activant le bouton physique Un treillis métallique en forme de
collision est visible dans l'aperçu, et une nouvelle section physique est
ajoutée avec plusieurs options. Comme le sol fait partie
de l'environnement, nous nous attendons à ce qu'il subisse des collisions,
mais qu' il ne bouge pas à la suite de ces collisions ou qu'il ne soit pas affecté par des forces externes telles que la gravité. Sa morphologie est statique. Vous avez le choix entre différentes
options pour générer
cette forme
de collision,
et nous pouvons voir que
la forme actuelle a été
produite à l'aide d'un convexe
décomposé Cela convient à la plupart
des objets de notre jeu, mais si nous inclinons l'aperçu, nous pouvons voir que la forme de
collision est nettement au-dessus du
sol à certains endroits Cela empêcherait
les
pieds du personnage de toucher le sol, ce qui ne serait pas très beau. Sélectionnez un convexe simple dans le
menu déroulant. Cette collision comporte
moins de polygones qu'auparavant et pose
le même problème Les pieds du personnage ne
touchaient pas le sol à certains endroits. En sélectionnant Tri Mesh, la forme de collision correspondra exactement
à l'instance de maillage. Comme ces actifs sont à faible teneur en poly, cela ne pose pas vraiment de problème en termes
de performances que si ce maillage était composé de milliers
de triangles. La forme de collision du personnage va toutefois entrer en collision avec
ces rochers Selon la façon dont vous
voulez que votre jeu fonctionne, cela peut être une bonne ou une mauvaise
chose. Il suffit d'en être conscient. Si vous souhaitez ignorer complètement
les roches et n'avoir qu'une
boîte plate pour les collisions, sélectionnez la case correspondant à
la forme de collision. La forme de collision des boîtes ne
sera pas automatiquement configurée pour correspondre à la
taille ou à la forme du maillage. Mais nous pouvons modifier
ses dimensions et positionnement ici
en bas du panneau. Je vais sélectionner des valeurs
premières pour cet étage afin de montrer comment la forme de
collision du personnage interagit
avec les rochers Une fois que votre carreau de sol a
la forme de collision, vous préférez, cliquez sur
Importer pour réimporter l'actif. Examinons maintenant
un objet que nous souhaiterions peut-être
rendre plus dynamique, comme l'actif Boxarg Comme nous l'avons fait pour le carrelage, nous pouvons sélectionner le nœud 3D de l'
instance rencontrée et ajouter de la physique en
cliquant sur le bouton. Puisque nous voulons qu'il entraîne non
seulement des collisions, mais aussi qu'il se déplace
et soit affecté par des forces externes telles que la gravité, sa morphologie doit être dynamique. Sélectionnez ensuite une
forme de collision pour celui-ci. Je vais passer
à un convexe simple. certains objets, vous ne voudrez
peut-être pas tout vous
soucier des collisions
ou de la physique, comme des bannières ou d'autres objets décoratifs de
ce type. Dans ces cas,
il n'est pas nécessaire de modifier les paramètres
d'importation. Répétez ce processus pour tous les actifs auxquels
vous souhaitez appliquer la physique. Ce pack d'actifs contient
de nombreux actifs. Il n'est pas nécessaire de tout
faire maintenant. Vous pouvez toujours modifier
leurs paramètres d'importation et les ajouter ultérieurement à votre
jeu si vous le souhaitez. Nous voulons créer une pièce
avec ces éléments, ce que nous pouvons faire
en cliquant et en faisant glisser n'importe quel élément dans l'
arborescence de la scène pour l'ajouter à la scène Mais le positionnement manuel chaque
actif est fastidieux Sans oublier que nous
souhaiterons peut-être que notre jeu ait des salles
différentes. Tout comme nous avons défini le
personnage comme une scène distincte, nous voulons que les niveaux
de nos jeux soient également des scènes
distinctes. De cette façon, la
scène de jeu peut se charger quel que soit le niveau auquel le joueur
joue actuellement. Supprimons les cases
Floor et CSG. Nous pouvons plutôt les remplacer par un nouveau nœud en trois D pour
représenter un niveau de notre jeu. Appelons ça un donjon. Comme la scène du jeu est
conçue pour jouer à n'importe quel niveau et que les
différents
niveaux
seront probablement éclairés différemment, faisons de la lumière du soleil un
enfant du nœud de niveau. En cliquant avec le bouton droit sur
le nœud Dungeon, nous pouvons l'enregistrer en tant que scène à part entière Dungeon nommé enregistré
dans le dossier des scènes. Ainsi, tous les composants visuels de la scène de jeu sont en fait contenus dans d'autres scènes. Les seuls éléments
de notre scène de jeu devraient être le gestionnaire de
saisie du joueur,
un personnage, un bras à ressort
et une caméra que le joueur peut
contrôler, ainsi que le niveau Cliquez ensuite sur le clapet
pour ouvrir la scène du donjon Ici, nous pouvons modifier notre
donjon séparément des
autres éléments de la scène de jeu comme la caméra ou le personnage Dans la scène des donjons, nous
pouvons ajouter un nouveau type de nœud, un nœud quadrillé,
qui
nous permettra de construire rapidement le niveau
en utilisant les actifs
que nous avons importés Mais la carte Grid nécessite une ressource appelée
bibliothèque de maillages, que nous devons d'abord générer à
partir des modèles importés. le menu principal,
sélectionnez scène nouvelle scène pour créer une nouvelle scène vide et sélectionnez trois scènes en D
dans l'onglet scène. Cette scène ne
représentera rien dans le jeu, mais servira de collection de trois modèles en D à
utiliser sur la carte quadrillée. cochant et en faisant glisser les
trois modèles en D que vous souhaitez dans votre carte quadrillée vers
le nœud racine de la scène, nous les ajoutons à la collection. Les modèles seront tous
à l'origine et
occuperont le même
espace, ce qui est très bien. Nous pouvons filtrer nos
ressources pour
faciliter le processus de sélection en utilisant ce champ. Le filtrage pour GLTF n'
affichera que les fichiers GLTF. En sélectionnant les actifs par groupe, ils pourraient être ajoutés à la bibliothèque de
maillages beaucoup plus rapidement. Une fois que tous les modèles
que vous souhaitez utiliser se trouvent dans la scène, enregistrez la scène non pas dans
le dossier des scènes, mais dans le dossier Donjon
des actifs importés Et nommez-la Dungeon
Mesh Library, avec l'extension T SCN. Ensuite, une scène dans le menu principal, Exporter en tant que bibliothèque Mesh. Enregistrons-le dans
le même dossier, appelons-le Dungeon Mesh Library Cette fois avec l'extension Mb. De retour dans la scène Dungeon, en sélectionnant le nœud Grid Map, nous pouvons attribuer notre nouvelle
bibliothèque de maillages dans l'inspecteur Nous pouvons faire glisser la ressource du robinet
du système de fichiers vers le champ ou cliquer sur le
menu déroulant et sélectionner Chargement rapide Cela présentera une
liste de ressources du projet d'
un type compatible. En sélectionnant notre bibliothèque de maillages nouvellement
créée, nous pouvons voir que les
maillages ont été renseignés dans la grille de
sélection Sélection de l'actif en matière de carreaux de sol. Nous pouvons placer quatre tuiles n'importe où sur la
carte quadrillée en cliquant dessus. positionnant les tuiles,
elles s'accrocheront aux coordonnées de la
grille le
long du plan X D. En élargissant la section
de l'onglet Inspecteur, nous pouvons modifier la taille des cellules sur
lesquelles les carreaux de sol s'
accrochent Comme nous savons que ces
tuiles ont une largeur de 4 mètres, fixons la taille des
cellules XD à quatre. Maintenant, nous pouvons facilement placer une grille de carreaux de
sol trois par trois en cliquant. Et supprimez-les en cliquant avec le bouton
droit de la souris. Ces quatre
tuiles sont toutes allumées pour zéro. Il s'agit de la
coordonnée de la cellule sur l'axe y. Si nous augmentons le sol, les carreaux seront
placés 2 mètres au-dessus et même au niveau du plancher négatif
un, 2 mètres plus bas. Et nous pouvons modifier la différence de hauteur du
sol avec la valeur y. Si nous voulons ajouter des maillages
à la bibliothèque de maillages ultérieurement, nous pouvons revenir à la scène de la bibliothèque de
maillages Ce dernier élément mural
doit être
réimporté avec une version de dénomination
G LTF antérieure Nous pouvons ajouter d'autres maillages à
cette scène. Alors signalez-le. Assurez-vous que la case Fusionner avec
les maillages existants est cochée pour mettre à jour la bibliothèque de maillages
existante afin d'inclure les nouveaux maillages De retour dans la scène du donjon, en sélectionnant la
carte quadrillée, les nouveaux maillages sont ajoutés à la grille de sélection Les
mailles ne mesurent pas toutes 4 mètres. Beaucoup mesurent 2 mètres,
voire 1 mètre ou moins. En changeant les
dimensions de la grille à 1 mètre, je peux effacer les tuiles actuelles puisqu'elles se chevauchent maintenant Sélectionnez plutôt des
coordonnées situées à quelques cellules l'
une de l'autre pour
redessiner les quatre tuiles Mais maintenant, un maillage plus petit peut être placé à des coordonnées
tous les 1 mètre au lieu de tous les 4 mètres. OK. Lorsque vous décidez de l'emplacement
du maillage
sur la carte quadrillée, les touches WASD peuvent également être
utilisées pour faire pivoter le maillage Avec une rotation
autour de l'axe x, axe
S y et de l'axe D Z. Le Wk reviendra
à sa rotation par défaut. Créez une scène de donjon de base
à partir des actifs et enregistrez-la. Si vous souhaitez
placer des
objets qui ne sont pas exactement sur les coordonnées de la
grille, pouvez toujours les ajouter
à la scène séparément de la carte quadrillée et les
positionner manuellement. Revenez ensuite à la scène du jeu. Dans la scène du jeu, le sol du donjon se trouve
au-dessus du personnage Déplaçons donc le personnage
au-dessus du sol. Lorsque nous lançons la scène de jeu, le personnage peut entrer en collision
avec le sol, les murs et tout autre objet de la scène,
ce qui est dû
à la physique générée
par les paramètres d'importation Avec ces outils, vous pouvez créer une grande variété de niveaux rapidement et facilement
une grande variété de niveaux
pour votre jeu,
en ajoutant, en supprimant ou en
modifiant des éléments selon vos besoins. Nous disposons désormais d'une manette de
personnage à la
troisième personne entièrement fonctionnelle , permettant au joueur de
contrôler un
personnage entièrement animé qui marche et saute dans un monde en trois D. OK.
24. Quoi faire ensuite ?: Bienvenue dans mon cours
sur les bases du développement
de jeux et de Gado Ce cours est la suite de l'introduction au
développement de jeux en trois dimensions et à Gado, mais il peut être suivi et appliqué
à tout projet contenant
un personnage que le joueur peut contrôler pour passer d'un niveau à l'
autre Vous pouvez rejoindre
notre serveur Discord pour travailler sur ce cours
aux côtés de vos pairs Dans ce cours, nous
aborderons les éléments essentiels communs à presque
tous les jeux, quel
que soit leur genre. Création d'une scène de titre, menus, transition fluide
entre les scènes, déplacement d'un personnage entre les différents niveaux de votre
jeu, musique de fond, paramètres et
persistance des données entre les scènes, niveaux et les sessions de jeu Lorsque vous aurez terminé,
vous aurez une bonne structure de
base d'
un jeu que vous pourrez développer pour en quelque chose de votre propre
design, quel que soit son genre. Vous acquerrez également des compétences utiles pour travailler avec le moteur de jeu
Gada, organiser et concevoir vos projets de manière à ce qu'ils
soient plus évolutifs Vous
apprendrez à coder avec le script
GD avec tout
expliqué en détail Nous appliquerons les principes de conception
orientée objet dans nos scripts, à savoir l'héritage, l'encapsulation et l'abstraction,
afin de les organiser, personnaliser et de les
réutiliser pour un projet de toute taille Tous les fichiers du projet seront également disponibles sur GitHub, si vous devez revoir
le projet tel qu' il était après avoir terminé
chaque leçon Ces vidéos ont été enregistrées
avec la version 4.2 0.2 de Gadot. Le projet commence
avec des éléments issus des personnages et de donjons de
Ka Kit packs
remasterisés de personnages et de donjons de
Ka Kit
créés par Dans ce cours, j'ajouterai
également des éléments du Basic Guy Bundle
créé par Penzilla et de la musique dans le pack
Barns Music créé par Eric the Tous sont disponibles en
téléchargement gratuit sur H point IO.