Introduction au développement de jeux 3D dans Godot ! | Thomas Yanuziello | Skillshare
Recherche

Vitesse de lecture


1.0x


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

Introduction au développement de jeux 3D dans Godot !

teacher avatar Thomas Yanuziello, Indie Game Developer

Regardez ce cours et des milliers d'autres

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

Regardez ce cours et des milliers d'autres

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

Leçons de ce cours

    • 1.

      Introduction

      1:21

    • 2.

      0-1 Introduction à la programmation

      8:03

    • 3.

      0-2 constantes et variables

      9:11

    • 4.

      0-3 Si Déclarations et conditions

      9:46

    • 5.

      0-4 Pendant Loops et opérateurs

      9:23

    • 6.

      0-5 tableaux et pour boucles

      10:32

    • 7.

      0-6 piles et fonctions

      10:53

    • 8.

      0-7 Match et retour

      9:34

    • 9.

      0-8 Arbre de scène et héritage

      10:21

    • 10.

      0-9 Abstraction et encapsulation

      10:41

    • 11.

      Polymorphisme 0-10

      8:01

    • 12.

      Dictionnaires 0-11

      8:54

    • 13.

      0-12 Débogage

      9:08

    • 14.

      Les bases

      13:51

    • 15.

      Scripts

      9:27

    • 16.

      Contrôles

      15:09

    • 17.

      Importer

      8:47

    • 18.

      Marcher

      12:53

    • 19.

      Rotation

      14:05

    • 20.

      Saut

      12:45

    • 21.

      Gravité

      15:38

    • 22.

      Appareil photo

      12:46

    • 23.

      Donjon

      13:29

    • 24.

      Quoi faire ensuite ?

      1:56

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

Généré par la communauté

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

199

apprenants

2

projets

À propos de ce cours

Dans ce cours, nous couvrirons tout ce que vous devez savoir sur l'utilisation de Godot Engine pour créer un contrôleur de personnage à la troisième personne ; des bases du travail dans l'espace 3D au contrôle d'un personnage et de la caméra dans une scène 3D, y compris.  Nous allons découvrir comment utiliser les mathématiques, la physique et les vecteurs pour obtenir le gameplay à la troisième personne que vous attendez de la plupart des jeux 3D modernes ; avec le bâton gauche pour déplacer et faire pivoter le personnage, et le bâton droit pour faire pivoter la caméra autour d'eux.  Si vous ne connaissez pas le moteur Godot et les scripts dans GDScript, j'ai inclus des leçons pour débutants sur la façon d'écrire des scripts.  Si vous savez déjà utiliser Godot et écrire des scripts, n'hésitez pas à sauter ces leçons et à passer directement à la leçon intitulée Les bases.

Cliquez sur le lien de mon site Web dans mon profil pour rejoindre notre serveur discord !

Vous apprendrez également des compétences utiles pour travailler avec le moteur de jeu Godot, organiser et concevoir vos projets pour qu'ils soient plus évolutifs.  Vous apprendrez à coder avec GDscript, tout étant expliqué en détail.  Nos scripts seront écrits de manière à être hautement personnalisables et réutilisables.  Tous les fichiers de projet seront également disponibles dans GitHub si vous avez besoin de revoir le projet terminé.  Ces vidéos ont été enregistrées en utilisant Godot version 4.2 en utilisant des ressources créées par Kay Lousburg sur itch.io

Rencontrez votre enseignant·e

Teacher Profile Image

Thomas Yanuziello

Indie Game Developer

Enseignant·e
Level: Beginner

Notes attribuées au cours

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

Pourquoi s'inscrire à Skillshare ?

Suivez des cours Skillshare Original primés

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

Votre abonnement soutient les enseignants Skillshare

Apprenez, où que vous soyez

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

Transcription

1. 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.