Dialogue et événements dans Godot ! | Thomas Yanuziello | Skillshare

Vitesse de lecture


1.0x


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

Dialogue et événements 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:40

    • 2.

      Boîte de dialogue

      11:53

    • 3.

      Monologue

      13:12

    • 4.

      Gestionnaire d'événements

      10:31

    • 5.

      Interagir

      11:21

    • 6.

      Choix

      12:33

    • 7.

      Drapeaux

      12:11

    • 8.

      Appareil photo

      15:00

    • 9.

      L'animation

      11:49

    • 10.

      Direction

      11:53

    • 11.

      Modularité

      10:56

    • 12.

      Quoi faire ensuite ?

      1:38

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

44

apprenants

--

projet

À propos de ce cours

Ce cours est la suite des bases du développement de jeux dans Godot.

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

Dans ce cours, nous aborderons la création de boîtes de dialogue, d'événements et d'interactions, puis nous les associerons avec des indicateurs de progression, des commandes de la caméra et des animations de personnages.

Vous apprendrez également des compétences utiles pour travailler avec le moteur de jeu Godot, organiser et designer vos projets pour qu'ils soient plus évolutifs.  Vous apprendrez à coder avec GDscript, tout en expliquant les détails.  Nos scripts seront écrits pour être hautement personnalisables et réutilisables.  Tous les fichiers de 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 en utilisant la version 4.2.2 de Godot.

Ce cours fera partie d'une série destinée à enseigner des morceaux de développement de jeux de taille compacte qui peuvent tous être utilisés de manière interchangeable.  Faites-moi savoir quels types de jeux vous intéressent pour apprendre à créer, et j'essaierai de les inclure dans les futurs cours de cette série.

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. Intro: Bienvenue dans mon cours sur les systèmes de dialogue et d'événements à Gado Ce cours est une suite des bases du développement de jeu dans Gado, mais il peut être suivi et appliqué à tout projet impliquant un personnage que le joueur peut contrôler pour interagir avec des PNJ ou des objets en appuyant sur un bouton et en affichant un Vous pouvez rejoindre notre serveur Discord pour travailler sur ce cours aux côtés de vos pairs Dans ce cours, nous aborderons la création de boîtes de dialogue, d'événements et d'interactions. Associez-les ensuite à l' aide d'indicateurs de progression, commandes de caméra et d'animations de personnages. Lorsque vous aurez terminé, vous disposerez d'un système complet de dialogues et d'événements pour votre jeu, qui pourra être utilisé pour produire des cinématiques de haute qualité et des récits complexes qui réagissent aux choix des joueurs et leur permettent de progresser dans le 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és objet dans nos scripts, héritage, l'encapsulation et l'abstraction, ainsi que d'autres modèles de conception de génie logiciel tels que le modèle Singleton et le modèle composite, afin de les organiser, personnaliser et de les réutiliser pour un projet de toute taille Tous les fichiers du projet sont é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 ressources provenant des packs remasterisés de personnages et de donjons de K Kits créés par K L auberg et du bundle Guy de base Tous sont téléchargeables gratuitement sur point IO. 2. Boîte de dialogue: Bonjour, mes amis. Avant de commencer, votre projet devrait inclure un jeu contenant un personnage que le joueur peut contrôler et un niveau dans lequel il peut se déplacer. Vous devez avoir d'autres personnages pour agir en tant que PNJ ou objets avec lesquels le personnage peut interagir Tout au long de ce cours, nous ajouterons la possibilité au joueur d'interagir avec l'environnement en appuyant sur un bouton, soit pour initier un dialogue avec autre personnage, soit pour interagir avec un objet. Ces interactions permettront au joueur de progresser dans le jeu, décisions et de créer des cinématiques de base avec des comportements de caméra et des animations personnalisés comportements de caméra et des animations Vous pouvez utiliser votre propre projet pour suivre ce cours ou télécharger un projet de démarrage sur mon Github intitulé Godo Dialog Course Main Votre projet peut être en deux ou trois D et presque tous les genres de jeu impliquant une interaction du joueur avec l'environnement ou les NBC Commençons par ajouter une boîte de dialogue à la scène de jeu. Selon les ressources que vous utilisez, vous souhaiterez peut-être faire du nœud racine de la boîte de dialogue un panneau ou un conteneur de panneaux. Mais ces actifs sont si importants que je souhaite les réduire, ce qui obligera le nœud du panneau à ne pas avoir d'enfants, car l'échelle serait héritée, ce que je ne veux pas. Vous souhaiterez peut-être que la boîte de dialogue soit visible au-dessus du FAD pour des raisons artistiques Cela dépend vraiment de la façon dont vous voulez l'utiliser. Je vais faire dessiner le mien en premier derrière tout le reste de l'interface utilisateur. Avec le nœud racine de mes dialogues, juste un simple nœud de contrôle qui ne représente en fait rien de dessiné à l'écran. Je vais ancrer la boîte de dialogue en bas de l'écran, couvrant toute la largeur, et régler l'ancre supérieure aux deux tiers du haut de l'écran. La boîte de dialogue couvrira le tiers inférieur de l'écran, qui, avec ma fenêtre, est d'environ 240 pixels. Ensuite, j'ajouterai un nœud enfant, un panneau pour dessiner la boîte réelle à l'écran, et je mettrai ses ancres sur une épave complète, afin qu'elle corresponde à son parent Donner un nouveau thème au nœud du groupe de dialogue. Nous pouvons ajouter un panneau au thème et lui donner une nouvelle texture de boîte de style pour le dessiner. Je vais utiliser une boîte orange arrondie comme texture de ma boîte de dialogue avec des marges de texture de 256 pixels sur tous les côtés. Cette image est énorme avec ses 1522 pixels. Je vais réduire la taille du nœud à la moitié. Utilisez ensuite le quadrillage et définissez ses dimensions pour qu'elles correspondent au nœud parent de la boîte de dialogue La plupart des boîtes de dialogue contiennent au moins le nom de la personne qui parle et une ligne de dialogue disposée verticalement. Ajoutons un contenant vertical et ajoutons également deux étiquettes à l'intérieur de celui-ci. Un pour le nom de l'orateur et un autre pour une ligne de dialogue. Mais pour la ligne de dialogue, vous pouvez utiliser une étiquette en texte enrichi au lieu d'une étiquette normale. étiquettes de texte enrichi permettent d'utiliser le code BB pour appliquer toutes sortes d'astuces de mise en forme au texte de votre dialogue, telles que le gras, l'italique ou même les couleurs et les animations Vous pouvez exprimer le ton de l'orateur, associer des thèmes connexes à des couleurs uniques ou mettre en évidence des mots clés importants pour aider le joueur à s'en souvenir. Je vais redimensionner la boîte verticale pour l'adapter aux limites de la boîte de dialogue. J'ai tendance à utiliser l' orthographe américaine du dialogue lorsque fais référence à une interface utilisateur affichant du texte. Mais j'utiliserai l' orthographe traditionnelle du dialogue pour faire référence à une conversation entre les personnages d'une scène. Complétons-les avec un texte d'espace réservé afin de voir à quoi ils ressemblent Quelqu'un parle, et il dit un peu d'oram ipsum. activation de l'ajustement du contenu forcera le nœud d'étiquette de texte enrichi à s'étendre pour s'adapter à son contenu, comme le ferait un nœud d'étiquette normal. Définissons la police et la taille de police par défaut pour le thème, en utilisant la police la plus lisible par défaut avec une taille raisonnable et facile à lire. J'en utiliserai 32. En ajoutant une étiquette de texte enrichi au thème, nous pouvons définir la couleur par défaut de la ligne de dialogue et non le nom du locuteur car il s'agit de différents types de nœuds. J'utiliserai le noir pour mieux me démarquer de la boîte orange. Ensuite, nous pouvons ajouter le nœud d' étiquette au thème et utiliser une police différente pour afficher le nom du locuteur. Je vais également donner aux étiquettes des noms une couleur différente et une ombre, pour qu'elles ressortent encore plus. J'utiliserai une police plus sophistiquée pour l'étiquette nominative du haut-parleur. Avant d'écrire un dialogue pour votre jeu, il est conseillé de vous faire une estimation approximative de la quantité de texte qui s'affiche confortablement à l'écran dans votre jeu. Assurez-vous que votre boîte de dialogue est capable d'afficher une quantité raisonnable de texte tout en restant facilement lisible. En utilisant de faux textes fictifs comme celui-ci, nous pouvons trouver le pire des scénarios quant à la quantité de texte que nous pouvons afficher et l'utiliser comme limite stricte lors de la rédaction de dialogues pour le jeu Il doit également y avoir une indication au joueur que le dialogue est terminé et que le jeu attend ses commentaires pour continuer. Ajoutons un bouton à la boîte de dialogue. Comme je veux que la texture des boutons corresponde à l'échelle de la texture de la boîte, je vais l'avoir en tant qu'enfant de la boîte et l'ancrer en bas à droite. Il s'agit d'un bouton unique, donc au lieu de définir sa zone de style dans le thème, j'utiliserai la section de remplacement du thème pour ajouter une nouvelle zone de style de texture qui ne s'appliquera qu'à ce bouton spécifique Je vais utiliser l'icône en forme de flèche. Utilisez les dimensions en pixels de l'image pour définir la taille du bouton et positionnez-le là où il est beau. Je vais créer d'autres boîtes de style pour les autres états des boutons en utilisant la même icône en forme de flèche. Appliquez ensuite une modulation de couleur pour chaque autre état. Gris délavé pour les personnes handicapées, couleurs vert et jaune pour les autres. Le thème des boutons est toujours disponible si nous voulons l'utiliser ultérieurement pour ajouter des boutons thématiques à la boîte de dialogue sans affecter ce bouton Assurez-vous de vérifier l' apparence de votre boîte de dialogue dans le contexte du jeu et d'apporter les modifications nécessaires jusqu'à ce que vous soyez satisfait de son apparence. Une fois que vous êtes satisfait de votre boîte de dialogue, nous pouvons la masquer par défaut en cliquant sur l'icône située à côté dans l'arborescence des scènes. Ajoutons-y ensuite un script et enregistrons-le dans le dossier des scripts de l' interface utilisateur. Prenons une référence à la fois à l'étiquette du haut-parleur et à l'étiquette de texte enrichi de la boîte de dialogue, en les affectant à des variables privées Notre script doit être capable d'afficher n'importe quelle ligne de dialogue prononcée par n'importe quel orateur dans notre jeu, ce qui signifie qu'il aura besoin d'une fonction publique acceptant deux paramètres, qui parle et ce qu' dit. Les deux sous forme de cordes. Les deux peuvent être définis en accédant à la propriété du texte et en l'affectant au paramètre transmis à la fonction Dans les anciennes versions de Godot, l'étiquette de texte enrichi aurait des propriétés distinctes pour le texte et le texte du code BB Assurez-vous d'utiliser la propriété de texte du code BB si vous souhaitez que votre code BB fonctionne. Nous pouvons rendre cela plus fonctionnel en rendant le haut-parleur facultatif, en définissant la propriété visible de l'étiquette du haut-parleur selon que le nom du haut-parleur est ou non une chaîne vide. Si nous changeons l'ordre des paramètres, nous pouvons également rendre le paramètre facultatif en attribuant une valeur par défaut à une chaîne vide Les paramètres facultatifs doivent toujours être listés après les paramètres obligatoires lors de la définition d'une fonction. Nous devons également définir la propriété visible de la boîte de dialogue. Faisons-le dans une fonction publique distincte appelée open. Et aussi une fonction fermée pour le définir sur false. Saisir également une référence au bouton Continuer. Une fois le texte affiché, nous devons indiquer au bouton Continuer de saisir le focus afin qu'il soit accessible à l' aide d'une manette. Connectons le signal appuyé sur le bouton au script, et utilisons-le pour fermer la boîte de dialogue pour le moment. Dans le script du gestionnaire de jeu, nous pouvons récupérer une référence à la boîte de dialogue. Lorsque le jeu démarre pour la première fois, nous pouvons indiquer à la boîte de dialogue d'afficher un message. Bonjour tout le monde. Le nom du haut-parleur étant facultatif, voyons comment il fonctionne sans lui. Cette fois, ajoutons le nom d'un orateur, Ghost. Le fantôme dira : « Boo, je suis un fantôme effrayant », mais un code BB sera appliqué dessus, afin que le joueur ait une meilleure idée de la façon dont la ligne est censée être lue Si vos étiquettes quittent les limites de la zone, elles seront coupées. Mais nous pouvons modifier ce comportement dans les propriétés de contrôle en décochant le contenu du clip Il existe de nombreuses balises de code BB qui fournissent une grande variété d'effets, et vous pouvez même créer les vôtres à l'aide d'un script personnalisé qui hérite de l'effet de texte enrichi Pour obtenir la liste complète des balises BB code, consultez Google Docs. Nous pouvons désormais afficher une boîte de dialogue pour donner des informations au joueur. Dans la leçon suivante, nous allons ajouter une animation de saisie et afficher des séquences de dialogue. Je te verrai dans la prochaine leçon. 3. Monologue: Bonjour, mes amis. Dans la leçon précédente, nous avons ajouté une boîte de dialogue à la scène de jeu. Dans cette leçon, nous allons animer la saisie afin que le texte apparaisse progressivement et permette la boîte d'afficher des séquences de dialogue À des fins de démonstration, je me suis référé à l'utilisation Guram Ipsum pour cette leçon et je vais rendre la boîte de dialogue visible. Lorsque le nœud d'étiquette de texte enrichi du dialogue est sélectionné, développez la section de texte affichée. Nous pouvons voir que le nombre de caractères visibles est une propriété facilement modifiable avec une valeur par défaut négative un caractères visibles négatifs sont évidemment impossibles et sont utilisés pour signifier illimité. Mais si nous ajustons ce nombre en cliquant et en le faisant glisser lentement vers la droite, nous pouvons voir le texte disparaître et se remplir progressivement au fur et à mesure que le nombre de caractères visibles augmente de zéro à la longueur de la chaîne Dans notre script de dialogue, lorsque nous définissons le texte affiché, nous pouvons également mettre à zéro les caractères visibles. Nous voulons ensuite augmenter progressivement le nombre de caractères visibles au fil du temps jusqu'à ce que tous les caractères soient visibles. Comme nous ne savons pas combien de caractères il contient, nous pouvons utiliser une boucle wile pour continuer à répéter le même code tant que la condition est remplie Dans ce cas, la condition sera que le nombre de caractères visibles soit inférieur au nombre total de caractères. Vérification de la documentation relative au nœud d'étiquette en texte enrichi. Nous pouvons voir qu' il existe une fonction appelée get total character count, qui renvoie facilement le nombre total de caractères à l'exception des balises de code BB. Bien que le nombre de caractères visibles soit inférieur au nombre total de caractères, nous pouvons en ajouter un aux caractères visibles. Mais cette boucle et l' ensemble de la fonction vont s'exécuter en une seule image. Le texte entier sera toujours affiché instantanément. Nous devons indiquer à la boucle de s' arrêter brièvement à chaque itération. Nous pouvons indiquer à la boucle d'attendre un signal émis par l'arbre de scène, un signal émis une fois par trame de processus, 60 fois par seconde avec les paramètres de projet par défaut. Cette boucle affichera désormais les caractères à une cadence de 60 caractères par seconde et s'ajustera automatiquement en fonction du réglage de la fréquence d'images du projet. Mais que se passe-t-il si nous ne voulons pas utiliser la fréquence d'images du projet ? Ajoutons plutôt une variable de vitesse de saisie à la ressource de paramètres et donnons-lui une valeur par défaut de 90 caractères par seconde. Dans la scène du menu des paramètres, nous pouvons ajouter une étiquette et un curseur pour permettre au joueur de modifier la vitesse de saisie Et donnez-lui une portée raisonnable. Je vais le régler sur 30 à 120 caractères par seconde avec une valeur d' étape de dix Connectez son signal à valeur modifiée au script. Et modifiez la ressource de paramètres pour qu' elle corresponde et initialisez la valeur dans la fonction prête Consultez le cours sur les bases du développement de jeux de cette série pour plus d' informations sur les paramètres du jeu. De retour dans le script de la boîte de dialogue, nous aurons besoin d'une variable pour enregistrer le temps écoulé depuis le début de la saisie et la mettre à zéro avant le début de la boucle de saisie. Ensuite, à chaque itération de boucle, nous pouvons ajouter le temps écoulé en accédant à la fonction, get process Delta T. Puisque nous savons combien de secondes se sont écoulées depuis le début de la saisie et combien de caractères nous voulons taper par seconde, il suffit de multiplier ces deux nombres pour obtenir le nombre de caractères visibles Voyons à quoi ça ressemble. Nous pouvons même modifier la vitesse de saisie dans les paramètres du jeu. Le journal de débogage nous indique que nous réduisons la précision en convertissant un nombre flottant en entier Nous pouvons soit transformer la vitesse de saisie en virgule flottante, soit ignorer cet avertissement, car nous savons que le curseur a été configuré pour n' utiliser que des entiers Je vais donc ajouter une balise warning ignore avant cette ligne. Godo sait qu'il faut ignorer l'avertissement de réduction de la précision. Cela se produit également dans le script du menu des paramètres pour la même raison. Maintenant, la vitesse de saisie est un peu plus rapide, mais certains joueurs voudront peut-être ignorer l'animation de saisie. Nous allons donc modifier le comportement du bouton de poursuite. Si le joueur appuie sur le bouton Continuer et que le nombre de caractères visibles est inférieur au nombre total de caractères, nous pouvons régler instantanément le nombre de caractères visibles égal au nombre total de caractères. Cela affichera le texte entier et forcera la boucle wile à se rompre car sa condition n' est plus remplie Si le nombre de caractères visibles n'est pas inférieur au nombre total de caractères, cela signifie que la saisie est déjà terminée. Dans ce cas, nous devons fermer la boîte de dialogue. Pour que cela fonctionne avec une manette, le bouton Continuer doit être activé avant que la saisie ne commence. Lorsque l' animation de saisie démarre et que le joueur appuie sur le bouton Continuer, soit il ignore l'animation de saisie soit il ferme la boîte de dialogue, mais pas les deux. Si vous ignorez l' animation de saisie, le joueur aura toujours la possibilité de la lire avant de passer à autre Mais que se passe-t-il si nous voulons qu' un personnage prononce plusieurs lignes de dialogue tout en gardant la boîte de dialogue ouverte ? Pour cela, nous pouvons ajouter une autre fonction publique pour afficher le dialogue. Cette fois, en acceptant un tableau de chaînes comme premier argument. Commençons par appeler notre autre fonction pour afficher la première ligne, en utilisant l'index zéro sur le tableau, le transmettant ainsi que le nom du locuteur pour le faire taper dans la boîte de dialogue Pour pouvoir ensuite passer à la deuxième ligne lorsque le bouton Continuer est enfoncé, nous aurons besoin du script pour nous souvenir la nature des lignes et de la ligne actuellement affichée. Comme la portée de ce tableau se situe uniquement dans le contexte de cet appel de fonction, il est impossible d'y accéder à partir d'une autre fonction. Ainsi, en déclarant une nouvelle variable de ligne, un tableau de chaînes, nous pouvons attribuer sa valeur en haut de la nouvelle fonction, ainsi qu'une autre variable pour se souvenir de la ligne actuellement affichée sous forme d'entier. Nous pouvons également le mettre à zéro en haut de l'appel de fonction et l'utiliser pour indexer le tableau. Ensuite, lorsque vous appuyez sur le bouton Continuer, nous pouvons en ajouter un, puis vérifier s'il est toujours inférieur à la taille du tableau. Si c'est le cas, alors il y a plus de dialogue, nous pouvons donc appeler à nouveau la première fonction. En la remplaçant par la variable privée, que nous avons déclarée ci-dessus et utilisée pour stocker un tableau de chaînes transmises à la fonction multiligne publique. Si vous souhaitez que le nom du locuteur continue d'être affiché, vous devez également le stocker dans une variable. Sinon, le dialogue est terminé et nous pouvons masquer la boîte de dialogue. Mais maintenant, le bouton Continuer ne fonctionnera pas comme prévu si nous n'affichons qu' une seule ligne de dialogue. Nous devrons séparer la fonctionnalité publique consistant à la fonctionnalité publique consistant afficher une ligne de dialogue des détails de la manière dont elle est réalisée en créant une méthode privée qui effectue le. Les fonctions publiques, acceptent une ou plusieurs lignes, peuvent désormais toutes deux faire appel à la fonction privée pour atteindre leurs objectifs en interne. La première fonction peut stocker la seule ligne dans le tableau comme seul contenu et mettre la ligne en cours à zéro, et maintenant elle se comporte exactement comme la fonction multiligne Mais que ce soit vous ou quelqu'un d'autre qui écrive les scripts de dialogue de votre jeu, il existe désormais plusieurs options pour afficher une seule ligne ou plusieurs lignes de dialogue. d'ouvrir la boîte de dialogue et de saisir le focus une seule Il suffit d'ouvrir la boîte de dialogue et de saisir le focus une seule fois pour chaque ensemble de dialogues à afficher Et le bouton de poursuite n'a besoin que d'appeler la fonction de ligne suivante. J'aime généralement organiser les fonctions dans mes scripts de manière à ce qu'elles soient publiques en haut et privées en bas et que les fonctions associées soient réunies. Cela suit deux principes orientés objet : l'abstraction, qui masque les détails de la façon dont les choses sont effectuées en privé dans le script, et l'encapsulation, qui n'expose publiquement que les fonctions que vous souhaitez que les autres voient et utilisent Essayons de simuler un personnage prononce plusieurs lignes de dialogue abord, nous allons déclarer une variable une séquence de dialogue sur un tableau de chaînes et la transmettre dans l'appel de fonction en tant que premier argument, que nous allons renseigner en ouvrant un crochet Mais comme la séquence de plusieurs longues chaînes prendra beaucoup de place, je préfère avoir chacune d' elles sur sa propre ligne, et il est utile d'utiliser l'indentation pour les garder organisées. Ensuite, le crochet de fermeture peut être utilisé pour marquer clairement la fin de ce tableau. En exécutant la scène, nous pouvons voir que la première ligne est affichée. Cliquez sur le bouton Continuer pour afficher la ligne suivante, cliquez sur le bouton Continuer pendant que la ligne est encore en train de taper, nous allons ignorer l'animation de saisie et afficher la ligne complète. Lorsque les quatre lignes sont affichées, cliquez sur le bouton Continuer pour fermer la boîte de dialogue. Mais je ne veux pas avoir à déclarer une variable, renseigner et à appeler une fonction à chaque fois Je préférerais tout faire en une seule ligne de code. En suivant un format similaire, nous pouvons remplacer la déclaration de variable par l'appel de fonction Les parenthèses ajoutent une autre couche d'indentation Notre tableau est déclaré et renseigné dans l'appel de fonction en spécifiant le nom du locuteur. Cependant, le tableau n'a plus de type spécifié, mais comme Godo Script est un langage mal typé, c'est très Nous pouvons en fait supprimer les exigences de type paramètres de nos fonctions de script de dialogue. Mais attention à ne transmettre que arguments valides, sinon vous aurez des erreurs. Nous pouvons désormais afficher des séquences de dialogue plus longues avec une saisie et un saut animés Dans la leçon suivante, nous allons créer des scripts d'événements personnalisés capables d'afficher des séquences de dialogue complexes. Je te verrai dans la prochaine leçon. 4. Gestionnaire d'événements: Bonjour, mes amis. Dans la leçon précédente, nous avons amélioré le système de dialogue avec la saisie, le saut et l'ajout de lignes multiples Dans cette leçon, nous allons créer un gestionnaire d'événements pour gérer dialogue de nos jeux et le synchroniser avec d'autres systèmes. En commençant par la scène du jeu, ajoutons un nouveau nœud de base et nommons-le Event Manager. Le script du gestionnaire de jeu peut récupérer une référence à ce nœud en utilisant Add-on Ready, ainsi que le nœud joueur. Si l'on considère l'arbre de scènes comme une organisation, généralement, si différentes branches souhaitent se demander quelque chose , elles doivent envoyer la demande par l' intermédiaire d'un responsable situé au-dessus d'elles deux. Dans ce cas, un élément du niveau va directement en haut du gestionnaire de scène du jeu pour demander l'autorisation d'utiliser le gestionnaire d'événements pour organiser un événement. Si quelque chose dans notre scène de jeu veut déclencher un événement, il suffit de demander au responsable du jeu de démarrer un événement, passant l'événement comme argument, et nous pouvons également vouloir terminer les événements avec une fonction commune. Le gestionnaire de jeu peut désactiver le nœud joueur afin que le joueur ne puisse pas contrôler le personnage pendant un événement. Et une fois l'événement terminé, nous pouvons rétablir le contrôle du joueur. Une fois que tous les préparatifs ont été faits, dites à l'événement qu' ils sont prêts à être organisés, en communiquant avec le responsable de l'événement. Vous pouvez rendre cela plus flexible en ajoutant également un paramètre booléen facultatif à l'appel de fonction avec la valeur par défaut true Il est désormais possible d'écrire des événements qui ne suppriment pas le contrôle du joueur. Dans le script du joueur, ajoutons une variable publique pour activer et désactiver le contrôle du joueur Dans les mêmes lignes où nous vérifions si le jeu est en pause avant de traiter les entrées, nous pouvons ajouter une condition en utilisant l'opérateur logique ou représenté par deux canaux. Si le jeu est suspendu ou si le joueur a été désactivé, nous revenons et ignorons la saisie Mais si le personnage se déplace lorsque le nœud joueur est désactivé, il continuera à courir dans le même sens jusqu'à ce que le contrôle soit réactivé. Nous pouvons définir la façon dont une variable est définie, ainsi qu'ajouter une fonctionnalité automatique avec un setter. Après une déclaration de variable avec deux points, nous pouvons écrire un bloc de code pour mieux restreindre l'accès à cette variable. créant une fonction définie, en acceptant une nouvelle valeur en tant que paramètre, nous pouvons attribuer la nouvelle valeur à notre variable. Mais nous voulons également nous assurer que si le nœud joueur n' est pas activé, nous indiquons au personnage d'arrêter de bouger. Ce comportement devient automatique chaque fois que la variable activée est définie sur false. À l'instar d'un chef de scène, le travail du responsable d'événements sera de faciliter la communication entre les différentes parties de la scène. Mais ce script n'a pas les mêmes responsabilités qu'un gestionnaire de scène, il n'héritera donc pas de cette classe Il peut simplement hériter du nœud. Je vais quand même l'enregistrer dans le dossier du responsable , car il est toujours considéré comme un gestionnaire. Au début du script, nous aurons besoin de références à tout ce qui peut être couramment impliqué dans un événement. Le personnage, la boîte de dialogue et le FAD sont tous des variables publiques Vous pouvez également ajouter des fonctions supplémentaires au gestionnaire d'événements pour regrouper les comportements couramment utilisés, créer une file d'attente d'événements ou même imbriquer des événements dans d'autres événements. Désormais, n'importe quel script de notre scène de jeu n'aura besoin que de faire référence au gestionnaire de jeu pour pouvoir démarrer un événement , lancer un dialogue, entrer et disparaître, et même contrôler le personnage. Passons à la scène du niveau et établissons un scénario de base dans lequel, lorsque le joueur entre dans cette pièce, un message lui est présenté. Pour cela, nous aurons besoin d'un nœud en trois D avec une forme de collision. Je vais en faire une boîte qui couvre toute la porte de la pièce, afin que le joueur ne puisse pas entrer dans la pièce sans entrer en collision avec cette N'oubliez pas que ces types d' événements déclenchés par la proximité peuvent perturber certains joueurs et doivent être utilisés avec parcimonie La plupart des joueurs préfèrent participer à des événements qui leur retirent volontairement leur contrôle en appuyant sur un bouton. Il n'a pas besoin d'exister sur une couche de collision, masquant uniquement les collisions avec le joueur Il doit uniquement être surveillé par le joueur et ne pas pouvoir être surveillé par quoi que Nous pouvons joindre un script et créer un nouveau dossier en restaurant tous nos scripts d'événements. C'est le nom qui entre dans la pièce, reliant le signal saisi par le corps au script Nous pouvons écrire ce qui se passera lorsque le personnage du joueur entrera dans cette zone. Nous pouvons trouver le game manager en utilisant une notation en signe dollar, commençant par le nœud racine. Nous pouvons demander au game manager de démarrer un événement, en se faisant passer comme argument comme étant l'événement qui doit être lancé. Vous voudrez peut-être le faire en utilisant ad on ready, mais je vous recommande de le faire lorsque l'événement est déclenché. Comme tous les événements ne sont pas déclenchés chaque fois qu'un niveau est chargé dans votre jeu, il n'est donc pas nécessaire de les faire rechercher dans l' arbre des scènes en même temps, alors qu'il serait plus efficace ne le faire que s'ils en ont besoin. Comme nous n'avons pas besoin de la référence à la carrosserie, préfixons-la par un trait de soulignement pour commercialiser le moteur Avant de démarrer l'événement, nous pouvons également vérifier que ce qui a été passé en argument n'est pas nul. Et s'il n'est pas nul, assurez-vous également qu'il possède une méthode nommée run event. En inversant la logique, nous pouvons vérifier s'il est nul ou s'il n'a pas la méthode run event Si l'une de ces conditions est vraie, nous pouvons revenir en ignorant la demande. Je préfère utiliser if not event ici, ce qui signifie la même chose. Imprimons également un message d'avertissement à l'intention du développeur à ce sujet, informant qu'il a commis une erreur qu'il doit corriger. avertissement push affichera un message d'avertissement jaune dans le journal sans perturber le jeu Le script d'événement peut désormais définir cette fonction d'exécution d'événement comme une série d' instructions transmises via le gestionnaire d'événements à n'importe quel autre composant de la scène selon les besoins, et tout peut être synchronisé à l'aide de signaux Pour créer notre scénario, il suffit de passer par le gestionnaire d'événements pour accéder à la boîte de dialogue et lui demander d'afficher un message. Dites ensuite au game manager que l'événement est terminé. En ajoutant un poids au début de n'importe quelle fonction, nous pouvons renvoyer un signal à partir de celle-ci, afin que l'événement sache quand cette tâche est terminée. Passons au script de boîte de dialogue, utilisons la fonction de ligne d'affichage, renvoyons un signal indiquant que le dialogue est terminé. Et faites de même pour la fonction multiligne. En haut du script, nous pouvons donner une définition au signal et l'émettre lors de la fermeture de la boîte de dialogue. L'objectif principal de toute cette infrastructure est de créer des scripts qui se lisent un peu comme un scénario, donnant des instructions claires sur les personnes qui parlent, comment elles agissent, où elles se tiennent, ce que regarde la caméra, etc. Si le joueur entre dans cette pièce , un message lui est alors présenté . Le contrôle a été temporairement retiré au joueur pendant que le message s'affiche. Lorsque vous appuyez sur le bouton Continuer, la boîte de dialogue émet le signal indiquant que le dialogue est terminé, ce qui permet au script de l'événement d'avancer, mettre fin à l'événement et de redonner le contrôle au joueur Nous avons désormais un gestionnaire d'événements qui désactive le contrôle des joueurs lorsqu'un événement impliquant un dialogue se déroule Dans la leçon suivante, nous allons créer un composant interactif avec lequel le joueur peut interagir pour déclencher Je te verrai dans la prochaine leçon. 5. Interagir: Bonjour, mes amis. Dans la leçon précédente, nous avons ajouté un gestionnaire d'événements capable d'exécuter un script d'événement. Dans cette leçon, nous allons ajouter des interactions que le joueur pourra initier. Une façon plus courante de lancer des événements est lorsque le joueur appuie sur un bouton pour interagir avec quelque chose ou quelqu'un. Ouvrez les paramètres du projet, passez à l'onglet de la carte d'entrée. Ajoutons un bouton d'interaction. J'utiliserai E sur le clavier ou Y sur ma manette. Ensuite, dans le script du joueur, nous pouvons vérifier si le bouton d'interaction a été enfoncé, et si c'est le cas, demander au personnage d' interagir avec tout ce qui se trouve devant lui ou avec la personne qui se trouve devant lui. Pour déterminer de qui ou de quoi il s'agirait, nous pouvons utiliser a. Dans la scène du personnage, ajoutons un nœud enfant à l' engin de type 3 D. Nous voulons que le rayon pointe devant le personnage, à une distance raisonnable pour pouvoir interagir avec quelque chose, je vais le régler à 2 mètres. Comme c'est l'engin qui tourne réellement, le raycast tournera avec lui quand vous êtes enfant Le masque de collision détermine quoi le rayon peut entrer en collision Nous voulons que ce rayon trouve des interactions. Nous devons donner aux interactions leur propre couche de collision. ouvrant les paramètres du projet dans l'onglet général, sous les noms des couches, trois couches physiques en D, je vais configurer la couche 5 pour qu'elle soit spécifiquement destinée aux interactions. Le rayon projeté entrera en collision avec la couche 5, mais sera également obstrué par la première couche, empêchant le joueur d'interagir avec un objet situé de l' autre côté du mur élargissant la section sur la largeur des collisions, nous examinerons à la fois les zones, nos interactions et les corps tels que le terrain positionnant la hauteur du faisceau, il est tout à fait logique de le placer quelque part au niveau des épaules, ou du moins entre le niveau de la poitrine et celui des yeux. Mais nous pouvons également profiter de cette opportunité pour mettre en œuvre certaines restrictions de portée dans nos interactions. Positionnons la boîte CSG devant le personnage et imaginons que notre objet interactif ou notre PNJ se trouve au-dessus de la Quelle peut être la hauteur de la boîte avant qu'il ne soit plus possible d'interagir avec la personne ou l'objet qui se trouve au-dessus Puisque le rayon entrerait en collision avec la boîte et non avec ce qui se trouve au-dessus Je pense qu'il est raisonnable d'autoriser l'interaction avec quelque chose qui est 1 mètre plus haut que le personnage, mais pas 1,5 mètre. Je vais donc le positionner quelque part entre les deux. 1,3 mètre semble bien, soit la moitié de la hauteur du collisionneur du personnage Dans le script du personnage, nous pouvons récupérer une référence au nœud cast en utilisant Add on Ready. Mais notez que pour procéder de cette façon chaque personnage devra avoir le nœud cast. En remplaçant l'annotation du signe dollar une fonction, obtenez node ou null. Nous pouvons transmettre le chemin du nœud sous forme d'argument de chaîne, que nous pouvons copier en cliquant avec le bouton droit sur le nœud et en sélectionnant Copier le chemin, ou en cliquant et en faisant glisser le nœud directement entre guillemets. Désormais, pour tout personnage sans nœud de conversion, cette variable sera simplement définie sur null au lieu de générer une erreur. Ajoutons une fonction au script du personnage nommée interact, nous avons appelée à partir du script du joueur lorsque le bouton d'interaction a été enfoncé. Tout d'abord, en vérifiant si le nœud cast existe, nous pouvons ensuite vérifier s'il entre en collision avec quoi que ce soit Nous pouvons ensuite vérifier si ce avec quoi le rayon projeté est entré en collision possède une méthode appelée interaction, et si c'est le cas, l'appeler Si le ray cast n' existe pas, rien ne se passera. Si le rayon projeté ne touche rien, rien ne se passera. Si le rayon projeté touche le terrain comme un mur, le terrain n'aura pas de méthode appelée interaction, donc rien ne se passera. Si le raycast touche quelque chose sur la couche 5, qui possède une méthode appelée interaction, il appellera cette méthode, déclenchant un événement d'interaction Mais si l'on considère les nombreuses choses avec lesquelles le joueur peut interagir dans un jeu, un PNJ et une porte tous deux interagir en appuyant sur un bouton, mais ils n'ont pas grand-chose d'autre en commun Un PNJ peut vouloir hériter des mêmes propriétés et comportements que ceux utilisés par un personnage jouable pour se promener Alors qu'une porte a besoin de propriétés telles que le fait qu'elle soit verrouillée ou non et de comportements tels que l'ouverture ou la fermeture. Utilisation d'une structure d'héritage. Vous pouvez transformer toutes les portes en PNJ qui ne bougent tout simplement pas ou transformer tous les personnages en portes à des portes compte de leurs comportements et propriétés similaires utiliser le comportement interactif en tant que Il est préférable d'utiliser le comportement interactif en tant que parent abstrait des portes et des PNJ, mais cela implique tout de même que tous les PNJ et toutes les portes doivent être interactifs, ce qui n'est souvent pas le ce qui n'est souvent pas Vous souhaiterez peut-être avoir une classe de PNJ qui hérite du personnage, mais également d'une autre classe pour obtenir des fonctions supplémentaires d'interaction Mais Godot n'autorise pas l'héritage multiple. Il serait préférable que le comportement interactif des portes, des PNJ et de tout le reste soit indépendant de la nature de l'objet avec lequel vous interagissez des portes, des PNJ et de tout le reste soit indépendant de la nature de l'objet avec lequel vous interagissez Nous pouvons plutôt appliquer le modèle composite pour y parvenir plus efficacement. En créant un nœud enfant pour représenter l'interaction, nous pouvons ensuite associer un comportement d' interaction à tout ce que nous voulons. Dans notre niveau, nous avons plusieurs personnages différents. Choisissons-en un et attachons-y un nœud enfant pour représenter la composante d'interaction de ce PNJ sous la forme d'un nœud de zone 3 D. Cette zone ne sera surveillée par rien, mais pourra être surveillée par le faisceau de rayons que nous avons créé précédemment Par conséquent, sa couche de collision sera de cinq, elle pourra donc être détectée par le faisceau et son masque pourra être nul puisqu' il ne recherche rien. Il aura besoin d'une forme de collision. J'utiliserai une capsule et je la ferai plus grande que le personnage. n'est pas nécessaire que le rayon pointe exactement sur eux. En ce qui concerne la hauteur de la capsule, nous pouvons appliquer la même logique que précédemment en sens inverse. Cette fois, imaginez que notre personnage est debout sur la boîte. Quelle peut être la hauteur de la boîte avant que notre personnage ne soit plus autorisé à interagir avec le PNJ debout sur le sol ? Je vais définir les mêmes restrictions et laisser le joueur interagir avec un objet situé à 1 mètre plus bas, mais pas à 1,5 mètre. Sachant que le rayon est projeté à 1,3 mètre au-dessus du sol sur lequel se trouve le personnage du joueur, la forme de collision des interactions doit être égale à ce t plus 1 mètre. Il semble raisonnable de le faire 2,6 mètres de haut, ce qui se trouve également être à la même hauteur que le collisionneur du personnage Mais notez que même un objet minuscule comme une clé posée sur le sol, devra être équipé d'un collisionneur d'une telle hauteur pour être percuté par la refonte Nous pouvons joindre un script à cette interaction. Appelons cela le dialogue des mages. Et enregistrez-le dans le dossier des scripts d' événements. Ce script aura besoin de deux fonctions interagir et exécuter un événement. La fonction d'interaction sera sensiblement la même que celle de la leçon précédente, demandant au game manager d' exécuter ce script en tant qu'événement. Pour la fonction Run Event, nous pouvons demander au mage de dire ce que nous voulons. Et mettez fin à l'événement une fois qu'ils ont fini de parler. Dupliquons maintenant ce nœud d'interaction et attachons-le à la porte. Ensuite, dupliquez également le script de dialogue Mage et appelez-le porte cellulaire. Remplacez le script associé à cette interaction, puis modifiez-le pour indiquer quelque chose comme si la porte était verrouillée. En quelques étapes simples, nous sommes en mesure de créer n'importe quel type d'interaction que le joueur peut initier en appuyant sur le bouton d'interaction avec n'importe quel objet ou PNJ Depuis que j'ai modifié l'échelle d' un mur ordinaire pour créer la porte, la forme de collision hérite de sa propriété d'échelle Mais après l'avoir centré dans la porte, il fait toujours un bon travail pour envelopper la porte Essayons-le. Appuyer sur le bouton d'interaction lorsque nous ne sommes face à rien ne fonctionne. Mais si nous nous dirigeons vers le mage, nous pouvons appuyer sur le bouton d'interaction pour lancer un dialogue. De même, nous pouvons également marcher jusqu'à la porte et interagir avec elle. Nous avons maintenant une porte, le joueur ne peut pas encore l'ouvrir, et dans NPC, le joueur peut parler à lui en appuyant sur un bouton Dans la leçon suivante, nous ajouterons des choix de dialogue et des arbres de conversation au système de dialogue. Je te verrai dans la prochaine leçon. 6. Choix: Bonjour, mes amis. Dans la leçon précédente, nous avons créé un composant d' interaction qui peut être associé à n'importe quel élément de notre jeu. Dans cette leçon, nous allons ajouter des options de dialogue ramifiées au système de boîtes de dialogue Tout d'abord, nous devons ajouter d'autres boutons à la boîte de dialogue. C'est à vous de décider comment et où vous souhaitez positionner vos boutons d'options de dialogue. Qu'ils soient dans la même boîte de dialogue , une boîte séparée, flottant au centre de l'écran, accompagnés d'un dialogue ou non. Pour mon jeu, j'aurai mes boutons dans la boîte de dialogue. Ajout d'un autre conteneur vertical à la boîte de dialogue. Appelons-le options, et il contiendra trois boutons nommés option zéro, option un et option deux. Je vais donner à chacun d'eux un texte par défaut et configurer leur texte pour qu'il soit aligné vers la gauche. Si je masque le nom de l'orateur et limite le dialogue à un maximum de deux lignes, tout devrait rentrer dans le cadre. Je vais simplement l'ancrer en bas à droite de la boîte de dialogue et le déplacer vers une position qui lui convient. Maintenez la touche Alt ou Options enfoncée tout en cliquant et en faisant glisser le curseur pour déplacer uniquement le nœud sélectionné et ses enfants En les éditant dans la boîte de dialogue, nous pouvons ajouter quatre boutons. J'aurai la couleur de police par défaut, le noir. Désactivé, gris délavé. Couvrez et appuyez sur tout blanc, puis ajoutez un contour noir pour que le texte blanc soit toujours lisible. Dans l'onglet Constance, je vais définir le plan en deux points. Ensuite, je vais remplacer toutes les zones de style des boutons par des zones de style vides, afin qu'elles s'affichent simplement sous forme de texte normal. En sélectionnant le conteneur vertical Options, j'utiliserai la section de remplacement du thème pour ajouter 12 pixels de séparation entre chacun des boutons d'option afin de les espacer. Prenez le temps d'organiser la disposition de votre boîte de dialogue et d'utiliser un faux texte d'espace réservé pour tester les limites de la quantité d'informations pouvant être affichées en une seule fois, y compris le nombre d'options vous souhaitez présenter au joueur Une fois que vous êtes satisfait de la façon dont tout est affiché, n'oubliez pas de masquer la boîte de dialogue. Nous devrons modifier le script pour pouvoir tout afficher correctement. Prenons une référence aux options sous la forme d'un tableau de ses nœuds enfants en utilisant la méthode Get d'un tableau de ses nœuds enfants children. Et lors d'une fonction publique appelée Options d'affichage, acceptant une ligne de dialogue sous forme de chaîne et un tableau de chaînes pour les options que le joueur choisira. Comme pour la fonction de ligne d'affichage, nous allons assigner au tableau de lignes la seule ligne passée en paramètre, le placer entre crochets et mettre la ligne actuelle à zéro. Lors de l'affichage des options de dialogue, je souhaite que le nom du locuteur soit masqué Je vais donc le définir comme une chaîne vide. Nous pouvons alors demander à la boîte de dialogue de l'ouvrir si ce n'est pas déjà fait et de commencer à taper la ligne suivante. ce qui diffère de l'affichage Cependant, ce qui diffère de l'affichage d' une simple ligne de dialogue, c'est l'affichage des boutons d' option, ce que je ne veux pas voir se produire avant que la ligne ne soit terminée. Pour cela, nous aurons besoin d' un autre signal, émis par la fonction de ligne suivante. Disons que c'est fini de taper. Et attendez ce signal après le prochain appel téléphonique. Nous devrons également définir ce signal en haut du script. Une fois la saisie terminée, le bouton Continuer n' est plus pertinent. Nous devons donc définir sa propriété visible sur falls pour la masquer. Nous pouvons ensuite utiliser une boucle à quatre pour parcourir le tableau de boutons d'option Mais comme nous devons faire correspondre les indices du tableau de boutons aux indices du tableau de chaînes, nous pouvons plutôt utiliser un autre type de boucle à quatre. En utilisant l'alias I, qui en programmation est universellement utilisé pour l'index, suivi du mot-clé, nous pouvons itérer la taille des tableaux La valeur de I commencera à zéro et augmentera de un jusqu'à atteindre la taille de la matrice de boutons, dans ce cas, trois et s'arrêtera. Nous pouvons maintenant utiliser la valeur de i pour vérifier si elle est inférieure la taille du tableau de chaînes passé en paramètre à cette fonction. Si le dialogue comporte un nombre d'options inférieur au maximum. Si cela est vrai, nous pouvons définir la propriété de texte du bouton à l' index sur la valeur de chaîne du même index, et également définir le bouton pour qu'il soit visible. Si l'index du bouton est supérieur au nombre de choix, le bouton ne doit pas être visible. Enfin, nous pouvons indiquer au bouton supérieur de saisir le focus afin qu'il soit accessible avec une manette. Pour que cela fonctionne parfaitement avec nos autres fonctions d' affichage des boîtes de dialogue, nous devons activer la visibilité du bouton de poursuite et des boutons d'option lorsque vous tapez des lignes de dialogue Je vais également déplacer la ligne en indiquant au bouton de poursuite pour attirer le focus d'être également présent. Tout étant affiché correctement, il suffit de dire au script de l'événement quelle option le joueur a sélectionnée. Le type de retour de cette fonction sera un entier. L'index du bouton sur lequel le joueur a appuyé, qui correspond à l'indice du choix qu'il a sélectionné. Un clic suffit pour appeler une fonction sur chacun de nos boutons. Appelons-le lorsque l'option est pressée, avec un paramètre entier nommé index. Cette fonction, tout comme le fait d' appuyer sur le bouton Continuer, permet de fermer la boîte de dialogue et d'émettre un signal. Appelons le signal sélectionné et transmettons l'index à travers le signal en tant qu'argument. En haut du script, nous pouvons donner une définition à ce signal, et cette fois, lui donner également un argument entier nommé choice. La fonction des options d'affichage peut désormais renvoyer un poids sélectionné, ce qui l' obligera à attendre que le joueur appuie sur l'un des boutons, puis à recevoir l'indice entier du bouton sur lequel il a appuyé et à le renvoyer. La dernière chose à faire est de connecter les signaux pressés sur le bouton à cette fonction. Assurez-vous que votre script a été enregistré afin que le moteur puisse trouver cette nouvelle fonction. En sélectionnant chacun des boutons, connectant le signal pressé, sélectionnez le nœud de la boîte de dialogue dans la liste. Ignorez la méthode de réception suggérée et cliquez sur le bouton de sélection. Cela présente une liste de fonctions du script de dialogue dont les paramètres correspondent aux arguments des signaux. Le signal pressé n' ayant aucun argument, seules les fonctions sans paramètres sont compatibles. Cliquez sur le bouton Méthodes compatibles uniquement pour afficher la liste complète des fonctions et sélectionnez les options sélectionnées Pour résoudre le problème de compatibilité, nous devons ajouter nos propres arguments au signal dans la section avancée. À l'aide du menu déroulant, nous pouvons sélectionner n'importe quel type intégré pour l'argument. Celui que nous voulons utiliser est un entier. En ajoutant un argument entier au signal, nous pouvons définir sa valeur comme index du tableau du bouton. bouton d'option zéro correspond à l'index zéro. Cliquez et connectez-vous. Nous pouvons ensuite répéter ce processus avec le reste des boutons d' option, en modifiant la valeur de l'argument de chacun pour qu'elle corresponde à son index dans le tableau. L'argument sera maintenant transmis à la fonction activée , émis par le signal sélectionné et renvoyé par la fonction d'options d'affichage au script d'événement, qui l'a appelé. Pour tester les options de dialogue, modifions le script de l'événement de dialogue principal Similaire à l'affichage d'une seule ligne de dialogue. Nous pouvons attendre les options d'affichage de la boîte de dialogue, fournissant une courte ligne de dialogue, suivie d'un éventail d'options. Cette instruction renvoie exclusivement un entier compris entre zéro et le nombre d'options du tableau. En assignant l' entier renvoyé à une variable, nous pouvons ensuite bifurquer notre dialogue en fonction de sa valeur Vous pouvez utiliser une instruction if pour cela, mais je trouve les instructions match beaucoup plus propres à cette fin. La correspondance des mots clés fonctionne la même manière que le changement dans d'autres langues. Dans le bloc de code suivant l'instruction match, nous pouvons fournir une option suivie de deux points, puis à l'intérieur de ce bloc de code, procéder à ce qui se passera dans ce cas. Et fournissez des cas différents pour chacune de nos options de dialogue. Essayons-le. J'ai réglé la vitesse de saisie du texte au minimum pour tester le bouton Continuer. Si nous parlons au mage, il dira une ligne de dialogue que nous pouvons ignorer. Après avoir sauté, trois options nous sont présentées, qui nous ont permis de nous concentrer, et le bouton Continuer n' est plus disponible En sélectionnant l'une des options, le dialogue se poursuit en fonction de la sélection « we ». Si nous recommençons, nous pouvons sélectionner une autre option. Le mage dit autre chose. Nous pouvons encore simplifier ce script en remplaçant la déclaration de variable par l'instruction match. peut désormais choisir parmi des options de dialogue Le joueur peut désormais choisir parmi des options de dialogue, ce qui permet de créer des arbres de dialogue ramifiés Dans la leçon suivante, nous pouvons permettre au joueur de progresser dans le jeu lors de ces événements. Je te verrai dans la prochaine leçon. 7. Drapeaux: Bonjour, mes amis. Dans la leçon précédente, nous avons autorisé le joueur à choisir parmi une liste d'options et nous avons utilisé sa sélection pour créer un dialogue ramifié Dans cette leçon, nous allons utiliser des marqueurs de progression pour modifier le déroulement des événements. Commençons par faire changer le dialogue d'un PNJ chaque fois que le joueur interagit avec lui Quel que soit le script que vous utilisez pour le fichier de sauvegarde de vos jeux, dans ce projet, nous utilisons une ressource personnalisée nommée progress. Nous pouvons ajouter une variable exportée pour suivre le nombre de fois le joueur a interagi avec le maj sous forme d'entier , la valeur par défaut étant naturellement Dans mon projet, l'enregistrement et le chargement réels des fichiers ont été supprimés. N'oubliez pas que mes démonstrations débuteront toujours par les valeurs par défaut. Pour plus d'informations sur la sauvegarde des informations de progression et des ressources personnalisées, consultez le cours précédent cette série, Les fondamentaux du développement de jeux. Dans le script Mage Dialogue, nous pouvons démarrer notre fonction d' événement d'exécution en abord correspondre la valeur de cette variable. Ensuite, en fonction du nombre de fois que le joueur a parlé au mage, nous pouvons proposer différentes lignes de dialogue. Si le joueur n' a jamais parlé au mage, il serait logique n' a jamais parlé au mage, que le premier commence par une introduction. Nous pouvons ensuite accéder à la même variable et incrémenter sa valeur d'une unité Et la prochaine fois que le joueur parlera au mage, il dira quelque chose de différent et augmentera la valeur d'une unité. En ajoutant une option par défaut, dans le script Gado, celle-ci est identifiée par un trait de soulignement au lieu d'une Nous pouvons fournir une ligne de dialogue répétitive une fois que le joueur a épuisé toutes les options précédentes. La troisième fois, en parlant avec le mage, et à chaque fois par la suite, nous produirons cette ligne de dialogue. Essayons-le. La première fois que nous parlons avec le mage, il se présente. La deuxième fois, ils deviennent des hôtes accueillants. La troisième fois et à chaque fois par la suite, ils nous diront simplement qu'ils sont trop occupés pour parler en ce moment. Sinon, au lieu d' avoir un dialogue répété, nous pourrions effectuer cette interaction fois le dialogue épuisé, afin que ce PNJ ne soit plus interactible Nous pouvons également créer des cycles de dialogue répétitif en redéfinissant la valeur à un nombre inférieur après la dernière option Maintenant, le créateur dira quelque chose de différent à chaque fois en répétant les trois mêmes lignes dans un ordre séquentiel Au lieu de créer une variable distincte pour chaque MPC, vous pouvez envisager d' utiliser un tableau d'entiers Nous devrons initialiser ce tableau pour qu'il contienne un zéro pour chaque MPC Comme j'ai trois PNJ, j'ajouterai trois zéros au tableau Ensuite, chaque MPC de votre jeu peut se voir attribuer un numéro à partir de zéro utilisé pour indexer le tableau Nous pouvons rendre cette erreur plus facile et moins sujette à l'utilisation d' une énumération, d'une liste numérotée J'aime conserver toutes mes énumérations de mon projet dans un seul script appelé En commençant par lui donner un nom de classe Enums. Il n'a pas besoin d'hériter des propriétés du nœud puisqu' il ne sera pas attaché à un Le seul contenu de ce script sera déclarer les énumérations à utiliser tout au long du projet Notre premier numéro sera une liste de tous les PNJ du jeu, Night, Mage et Rogue La convention pour Enums consiste à utiliser une maquette en forme de serpent, parfois appelée étui en forme de serpent hurlant Le script de dialogue Mage peut désormais accéder au tableau et l'indexer avec l'énumération F. Ce sont des pratiques courantes pour dialoguer avec les PNJ dans les jeux, mais elles ne permettent pas vraiment au joueur de progresser dans le jeu Prenons la porte comme exemple de progression et au joueur d'ouvrir la porte lors d'un événement d' interaction, mais uniquement s'il connaît le mot de passe. Le mage doit connaître le mot de passe au personnage du joueur par le biais d'un dialogue distinct avant qu'il ne soit autorisé à l'utiliser pour ouvrir la porte. Dans la ressource de progression, nous pouvons ajouter une variable booléenne exportée si le joueur connaît ou non le mot de passe, qui sera naturellement défini par défaut Les variables booléennes utilisées pour contrôler la progression du jeu sont communément appelées drapeaux En parlant avec le mage, le personnage aura la possibilité de demander à voir le prisonnier. Après avoir sélectionné cette option, le major communiquera le mot de passe au joueur. À ce stade, nous pouvons définir la variable de la ressource de progression sur true, puisque le personnage du joueur connaît désormais le mot de passe. En attachant un script à la porte, nous pouvons ajouter une variable exportée indiquant si la porte est actuellement ouverte et ajouter trois fonctions publiques, vérifier si la porte est ouverte, ouvrir la porte et fermer la porte. Renvoi d'un booléen. Nous allons simplement renvoyer la valeur de la variable is open, afin que les autres scripts puissent facilement obtenir sa valeur, mais pas la définir. Appliquer l'encapsulation. Je déclarerai également une variable pour maintenir la position y de la porte lorsqu'elle est fermée sous forme de flotteur. Et définissez sa valeur pendant la fonction prête comme étant soit sa position y actuelle, soit sa position y actuelle plus 4 mètres, fonction de la valeur de is open. Chacune de ces fonctions peut définir la variable is open puis appeler une fonction privée pour déplacer la porte. Pour ouvrir une porte, je vais déplacer sa position y vers le bas 4 mètres et pour la fermer, remettre sa position à la valeur fermée. Avec une variable d'interpolation. Après avoir vérifié que l'interpolation n'existe pas déjà et qu'elle n'est pas en cours d'exécution, créez une nouvelle interpolation Je veux que le nœud de porte reste interactif lorsque la porte est ouverte Je resterai dans la même position et je me contenterai de me fermer les portes. ouvre cette scène, en ignorant l'avertissement car je n'apporte aucune modification Nous pouvons voir que le nœud maillé de cette porte est un demi-mur. Je vais l'utiliser comme nœud qui est tweed et entre sa position par valeur. Puisque la position est la propriété, nous pouvons accéder à la propriété y de la structure vectorielle à trois avec deux points dans le chemin de la propriété pour passer à la nouvelle position pendant une seconde. Renvoie le signal de fin de l'interpolation via les appels de fonction au cas où un autre script voudrait l'attendre C'est un peu exagéré pour cette démonstration, mais ce script est désormais suffisamment flexible pour fonctionner avec ouverture et la fermeture portes similaires n'importe où dans mon jeu Dans le script de l' événement d'interaction Doors, nous aurons besoin d'une référence au nœud racine des portes. Pour plus de simplicité, je vais simplement utiliser get parent. Nous pouvons d'abord vérifier si la porte est actuellement ouverte. Dans ce cas, nous pouvons mettre fin à l'événement pour redonner le contrôle au joueur, puis dire à la porte de se fermer et de revenir pour empêcher exécution de ce script. Le joueur n'aura pas à attendre que la porte se ferme et pourra continuer à jouer. Si la porte est fermée, nous pouvons vérifier si le joueur connaît le mot de passe ou non. Si le joueur ne connaît pas encore le mot de passe. Nous pouvons présenter un dialogue simple sur la fermeture de la porte et mettre fin à l'événement. Mais si le joueur connaît le mot de passe, je demanderai aux barbares de le dire en ligne de dialogue, de mettre fin à l'événement et de demander à la porte d'ouvrir J'aimerais empêcher le joueur d'interagir avec la porte lorsqu' elle s'ouvre ou se ferme au cas où le bouton correspondrait à celui du joueur. Dans les deux cas, je mettrai la couche de collision du nœud d' interaction à zéro, empêchant ainsi le signal d'interaction de le détecter. Ajoutez ensuite un poids et remettez-le à sa valeur initiale une fois la porte a fini de s' ouvrir ou de se fermer. Nous pouvons voir la valeur en passant la souris sur le masque de bits. Chaque couche est représentée par un seul bit, soit un zéro, soit un en mémoire. Et chaque bit est numéroté à partir de zéro. La couche cinq correspond au bit numéro quatre. Sa valeur représentée sous forme d'entier est alors de deux sur quatre, soit 16. Nous pouvons donc réactiver ce collisionneur en remettant sa couche de collision à 16 Si vous utilisez plusieurs couches de collision, addition de leurs valeurs binaires génère la valeur entière du masque de bits N'importe quel entier peut être utilisé comme masque de bits de cette manière et constitue un moyen extrêmement efficace de stocker jusqu'à 32 indicateurs booléens dans un La porte doit être réglée en utilisant at on ready. Essayons-le. Lorsque vous essayez d'abord d'interagir avec la porte, celle-ci est fermée hermétiquement. Mais après avoir parlé avec le mage pris connaissance du mot de passe, interagi à nouveau avec la porte, l'interaction se déroule différemment et la porte s'ouvre. Une fois la porte complètement ouverte, nous pouvons à nouveau interagir avec elle pour la fermer. Nous avons désormais des indicateurs de progression qui permettent au joueur de progresser dans le jeu à l'aide d'événements. Dans la leçon suivante, nous allons modifier ce que la caméra regarde lors d'événements. Je te verrai dans la prochaine leçon. 8. Appareil photo: Bonjour, mes amis. Dans la leçon précédente, nous avons permis au joueur de progresser dans le jeu en installant et en lisant des drapeaux lors d'événements. Dans cette leçon, nous allons ajouter une caméra cinématique au système de gestion des événements Commençons par la scène de jeu en ajoutant un nœud de caméra en trois D au gestionnaire d'événements. Et définissez-y une référence dans le script du gestionnaire d'événements. Ensuite, au niveau sn, en utilisant l' événement majdialog comme exemple, nous pouvons ajouter un autre nœud C de caméra tant qu'enfant à l'événement d' interaction Déplacez ensuite la caméra et utilisez le bouton d'aperçu de la caméra pour positionner ou faire pivoter la caméra là où nous pensons qu'elle sera belle comme perspective pour notre événement de dialogue Une fois que vous êtes satisfait de son apparence, changez le type du nœud Marker Three D et renommez-le en quelque chose de plus approprié Conserver ses propriétés transformées de position et de rotation dans la scène. Nous pouvons désormais utiliser ce marqueur pour positionner la caméra cinématique pendant l'événement de dialogue En ajoutant un script à la caméra cinématique, je le mettrai dans le dossier des événements Nous aurons besoin d'une fonction publique pour déplacer la caméra vers un marqueur, réglant la position et la rotation de la caméra pour qu'elles correspondent à celles du marqueur et en faire la caméra actuelle. Mais comme les positions et les rotations des enfants sont relatives à leurs parents, nous devrons utiliser la position globale et rotation globale pour nous assurer d'obtenir les bonnes valeurs Ensuite, dans le script de l'événement Maj Dialogue, nous pouvons saisir une référence à ce nœud marqueur et demander au gestionnaire d'événements de déplacer la caméra cinématique vers déplacer la caméra cinématique À la fin de l'événement, nous aurons besoin du game manager pour revenir à la caméra du joueur. Dans le script du gestionnaire de jeu, nous aurons besoin d'une référence à la caméra principale du joueur pour qu'une fois les événements terminés, nous puissions faire de la caméra du joueur la caméra actuelle avant de permettre au joueur de recommencer à jouer. Essayons-le. Lorsque vous parlez avec le mage, la caméra cinématique se déplace vers le marqueur et prend le relais Ensuite, à la fin de l'événement, la caméra du joueur reprend le contrôle Nous pouvons également atténuer assez facilement la transition entre les caméras. En ajoutant une fonction au script du gestionnaire d' événements, appelons-la fade to marker, acceptant le Marker Three D et en renvoyant un signal. Nous pouvons attendre le passage au noir, puis envoyer le marqueur sur la caméra cinématographique Retournez ensuite le fondu à c. Le gestionnaire de jeu peut également entrer et disparaître lorsque vous revenez à la caméra du joueur. Mais cela n'aurait de sens que si l'événement se déroulait avec la caméra cinématique Nous pouvons également rendre ce comportement facultatif en ajoutant un paramètre booléen facultatif à la fonction et en n'utilisant le fondu que si l'événement le demande Ajouter true à l'appel de la fonction de fin d' événement et attendre que Fay marque au début du script La caméra s'estompe désormais lorsqu'elle change de perspective au début et à la fin de l'événement Si vos événements comportent plusieurs marqueurs, vous pouvez les trier sous un nœud parent. Appelons cela des marqueurs de caméra. Et dans le script de l'événement, saisissez-y une référence sous la forme d'un tableau de ses enfants. Le script de l'événement peut demander à la caméra de passer au marqueur zéro, un, deux, etc., comme sur un plateau de tournage. Mais que se passe-t-il si nous voulons que l'appareil photo soit panoramique ? Ajoutons quelques fonctions supplémentaires au script de caméra, direction panoramique, pour déplacer la caméra à l'aide d'un vecteur et panoramique vers marqueur pour déplacer progressivement la caméra directement vers un emplacement spécifique. Les deux parties accepteront une durée pour le pan et enverront un signal pour indiquer à l'événement quand elles seront terminées au cas où nous voudrions l'attendre. Pour changer progressivement quelque chose au fil du temps, nous aurons besoin d'une variable d'interpolation Ces deux fonctions peuvent être simplifiées en une seule fonction privée, appelons-la simplement caméra intermédiaire, acceptant la destination cible, la durée et renvoyant le même signal Comme le panoramique connaît déjà sa destination, il suffit de transmettre cette information à la fonction de caméra intermédiaire, accède à la position globale du marqueur Et la fonction Pan direction peut calculer sa destination cible en ajoutant la direction à sa position globale actuelle. Après avoir vérifié si le préadolescent existe déjà et est en cours d'exécution, si c'est le cas, tuez-le, puis créez-en un nouveau Ensuite, nous pouvons ajuster la position globale de la caméra pour qu'elle soit la destination cible pendant la durée demandée Dans la fonction Pan to Marker, il serait également judicieux de faire correspondre la rotation et la position des marqueurs, mais peut-être pas à chaque fois. Ajoutons un paramètre booléen facultatif pour autoriser ce comportement Nous pourrions dupliquer la fonction de caméra d' interpolation pour en ajouter une autre avec rotation, mais je préférerais ajouter la rotation dans le paramètre booléen à cette fonction, en donnant à la rotation une valeur par défaut du Si l'événement souhaite que la caméra corresponde à la rotation des marqueurs, ajustez également la rotation globale de la caméra pour qu'elle corresponde à la rotation cible sur la durée Par défaut, plusieurs préadolescents se produiront en séquence, mais nous voulons les saper simultanément Nous pouvons ajouter un autre appel de fonction ici en parallèle pour y parvenir. Si nous changeons ces types d' arguments d'un marqueur trois D à un nœud générique trois D, alors n'importe quel nœud trois D peut être utilisé comme marqueur, y compris la caméra du joueur. Ils devront également la définir comme caméra active si ce n'est pas déjà le cas. Dans le script du gestionnaire d'événements, nous pouvons également remplacer ce type de marqueur en trois D par un nœud trois D. La saisie d'une référence au nœud de caméra du joueur le marquera comme privé, sorte que les autres scripts ne le verront pas Nous pouvons ensuite ajouter une fonction qui déplace la caméra cinématique dans la position de la caméra du joueur Dans le script de dialogue Mage. Au lieu d'utiliser le Fade, essayons de régler la caméra cinématique la position de la caméra du joueur et de la déplacer vers le marqueur pendant notre événement avant la première ligne de dialogue Déplacez ensuite la caméra vers le haut et revenez à la caméra du lecteur à la fin. Essayons-le. Ce dialogue ressemble désormais davantage à une scène coupée dans laquelle la caméra se déplace. Mais nous pouvons aller encore plus loin en créant des pistes de caméra qui guideront la caméra autour la scène dans un mouvement de balayage fluide. Commencez par ajouter un nœud de chemin en trois D au nœud d'événement d'interaction. Ce nœud possède une propriété, une ressource courbe en trois D. En cliquant dessus pour le développer, il contient un tableau de points. En ajoutant un point, chaque point contient une position vectorielle à trois positions. En commençant par le premier point situé à l'emplacement des marqueurs d'origine, nous pouvons ajouter d'autres points au tableau. Pour déplacer la caméra à travers les portes, puis vers la fenêtre des gardiens donnant sur la cellule de prison Les autres propriétés des points sont des ancres qui ajoutent du poids au calcul des points situés avant et après eux le long de la courbe Le premier point n' a qu'une ancre extérieure, le dernier point n' a qu'une ancre intérieure, mais chaque point intermédiaire possède les deux. réglage de ces ancrages permet de lisser la courbe selon une formule de courbe de Bézier Maintenant que nous avons un chemin que nous aimerions que la caméra suive, nous devons ajouter un autre nœud au chemin. Le chemin suit trois nœuds D. Deuxième propriété du nœud de suivi du chemin, le taux de progression le déplace d'un pourcentage le long du chemin . Ajouter un nœud de caméra en trois D au nœud de suivi du chemin et lui donner sa rotation initiale en direction du mage. Nous pouvons ensuite cliquer sur le bouton d'aperçu pour voir du point de vue de la caméra Ajustez ensuite la valeur de progression et regardez la caméra parcourir la scène. Nous pouvons maintenant supprimer le nœud 3D de la caméra. Pour ce faire, dans nos scripts, il suffit de récupérer une référence au nœud de suivi du chemin dans le script d'événement. Je vais diviser le dialogue en lignes distinctes pour mieux le synchroniser avec les mouvements de caméra. Nous pouvons également l'utiliser comme marqueur pour positionner la caméra si nous le voulons avant de lancer le mouvement. Nous pouvons ensuite indiquer à la caméra de suivre un chemin, en passant le nœud path follow comme argument, ainsi que la durée. Définissons cette fonction dans le script de caméra. Accepter un chemin à suivre et une durée comme paramètres. La première chose à faire est de relier la caméra au nœud de suivi du chemin, puis de réinitialiser sa position et sa rotation en conséquence. Faire toutes les étapes d'interpolation habituelles et renvoyer le signal lorsque vous avez terminé Nous pouvons ensuite interpoler la propriété de progression du nœud de suivi pour atteindre une valeur de un au fil du temps Et faites-en l'appareil photo actuel. Enfin, le game manager peut relier la caméra cinématique au gestionnaire d' événements tout en mettant fin à l'événement si nécessaire Essayons-le. Après avoir mentionné le prisonnier, la caméra parcourt la scène pour le regarder par la fenêtre Si vous souhaitez limiter la rotation de la caméra tout en suivant la trajectoire, il est facile de la limiter à une rotation uniquement autour de l'axe y ou à une absence totale de rotation Nous avons maintenant une caméra cinématique qui peut prendre nos simples dialogues et les transformer en scènes coupées Dans la leçon suivante, nous ajouterons également des animations de personnages. Je te verrai dans la prochaine leçon. 9. Animation: Bonjour, mes amis. Dans la leçon précédente, nous avons ajouté une caméra cinématique au système d'événements. Et cette leçon animera les personnages lors de nos événements Commençons par une scène de personnage. En sélectionnant le nœud de l'arbre d'animation, le panneau de l'arbre d'animation s'ouvre en bas de l'éditeur affiche la machine à états qui contrôle les mécanismes de mouvement des personnages. Pour plus d'informations sur les bases de l'animation de personnages et des machines à états, consultez le cours d'introduction au développement de jeux en trois dimensions. Pour éviter toute confusion liée aux transitions d'états, nous pouvons séparer les différents types d' animations dans différentes machines à états En cliquant avec le bouton droit dans un espace vide, ajoutons une nouvelle machine à états à celle-ci. Faute d'un meilleur nom, je l'appellerai « divers ». À l'aide de l'outil Connect, ajoutez des connexions entre la locomotion la nouvelle machine à états et vice versa. À l'aide de l'outil de sélection, sélectionnez la transition entre la locomotion et la nouvelle machine à états Développez la section avancée et changez le mode avancé de automatique à activé. Cela nous permettra de déclencher les animations par le biais d'un script au lieu de nous attendre à ce que l'arbre d'animation gère automatiquement la transition, comme c'est le cas avec les mécanismes de mouvement. Sélectionnez l'autre transition, agrandissez la section du commutateur et changez son mode de commutation sur « à la fin », permettant ainsi à toutes les animations de la nouvelle machine à états de se terminer avant de reprendre la locomotion En sélectionnant la nouvelle machine à états elle-même, changez le type de machine à états de root à groupé. La mécanique du mouvement est actuellement la machine à états racine, et cette nouvelle machine à états contiendra des animations similaires qui seront regroupées pour aider à garder les choses organisées. Cliquez ensuite sur l'icône en forme de crayon pour modifier cette nouvelle machine à états. Nous pouvons revenir à la racine de la machine à états en utilisant les boutons en forme de pain situés en haut du panneau de l'arborescence des animations Dans cette machine à états, nous pouvons ajouter toutes les animations qui commencent et se terminent par la pose inactive, qui sont destinées à être jouées une fois et non en boucle. Dans ce pack d'actifs, les animations d'encouragement, d' interaction et de capture correspondent à cette description Pour que la machine à états fonctionne comme prévu, le nombre de transitions depuis le début doit correspondre au nombre de transitions entrant dans la machine à états. De même, le nombre de transitions sortant la machine à états doit correspondre au nombre de transitions menant à l'état final Comme il n'y a qu' une seule transition vers et depuis la machine à états, il ne peut y avoir qu'une seule transition se connectant du début à la fin. Nous avons besoin d'un état intermédiaire entre les deux, l'état qui commence et termine toutes ces animations, la pose inactive. Malheureusement, ce pack d'actifs ne contient pas de pose inactive, mais nous pouvons en créer une facilement. Passez au panneau d'animation en bas de l'éditeur. Et sélectionnez l' animation inactive dans le menu déroulant. Cliquez sur le bouton d'animation à côté de la liste déroulante, puis sélectionnez Dupliquer Renommez la nouvelle pose inactive de l'animation. Remplacez la durée de l' animation de pose inactive à zéro et désactivez le bouclage De retour dans le panneau de l' arborescence des animations, dans la machine à états divers, nous pouvons ajouter deux copies de l'animation de pose inactive. Appelons-les Idle Post start et Idle Post end. Connectez-vous ensuite de la position de départ à la position d'inactivité, puis à chaque autre état à partir de là. Et chacun d'entre eux à la deuxième pose inactive, et enfin, à l'état final. En sélectionnant chacune des transitions depuis le début de la pose inactive, changez leur mode avancé en mode activé. Et les transitions vers la position inactive peuvent changer à la fin. Désormais, le nombre de transitions entrant et sortant de la machine à états correspond au nombre de transitions entre le début et la fin. n'y a aucune possibilité d' ambiguïté pour que l' arbre d'animation puisse s'y déplacer facilement. Nous pouvons avoir un aperçu de l' apparence de ces animations en cliquant sur le bouton de lecture situé à côté d'elles. Et nous pouvons ajouter une courte durée de fondu croisé aux transitions entre et hors de la machine à états afin mieux les intégrer aux états de locomotion Lorsque vous êtes satisfait de la machine à états, nous pouvons l'enregistrer en tant que ressource dans le projet. Après avoir créé les animations de pose inactive pour les autres personnages, cette machine à états peut être chargée dans nœuds de leur arbre d'animation puisqu'ils ont tous les mêmes animations. Dans le script du personnage, nous pouvons ajouter une fonction publique pour déclencher la transition vers l'une de ces animations en passant simplement le nom de l' animation sous forme de chaîne. Il suffit de dire à la lecture de la machine à états de passer à l'animation en ajoutant le nom de la machine à états groupée qui la contient au premier plan, ainsi qu'un séparateur. Mais nous devrons restreindre manuellement le fait de ne permettre que cela se produise à partir de l'état de locomotion en vérifiant d' abord le nœud actuel de la machine d'état Si le nœud actuel n' est pas la locomotion, nous devons ignorer cette demande Cela empêchera le démarrage ces animations en plein saut. Il se peut également que nous ne voulions pas que le personnage puisse se déplacer pendant que ces animations sont en cours de jeu. Ajoutons un paramètre booléen facultatif nommé locked dont la valeur par défaut est Et déclarez également une variable privée pour le script indiquant si le personnage se déplace simultanément ou non En ajoutant un setter à cette variable après avoir défini sa valeur, si le personnage ne peut pas bouger, nous devons également définir la valeur de la direction d'entrée sur zéro pour arrêter le personnage s'il est déjà en mouvement Ensuite, dans toute fonction qui se déplace ou saute, nous pouvons ajouter une instruction conditionnelle vérifiant si le personnage peut se déplacer avant de le laisser se produire Lorsqu'on nous demande d'exécuter une animation, si l'animation bloque le mouvement, nous pouvons définir la variable can move false et la remettre sur true une fois l' animation terminée. Mais nous ne pouvons pas simplement attendre le signal de fin de l' animation, car il sera émis lorsque l'animation en cours se terminera, qui est inactive, pas celle que nous voulons attendre. En plaçant la commande wait dans une boucle while et en continuant simplement la boucle, nous pouvons attendre la fin de chaque signal d'animation à plusieurs reprises jusqu'à ce que le signal spécifique que nous voulons soit émis. Maintenez la touche Ctrl ou Commande enfoncée et cliquez sur le signal. Nous pouvons voir qu'il passe un argument du nom de l'animation qui vient de se terminer. O. Il suffit de comparer cette valeur au nom de l'animation qui, une fois reçu, interrompt la boucle d' attente et redéfinit la variable can move sur true. Enfin, pour l'utiliser dans le cadre du système de gestion des événements, nous devrions recevoir un signal de retour, juste au cas où nous voudrions l'attendre. Disons que l' animation de ce signal est terminée. Nous pouvons émettre et renvoyer le signal si l'animation a été annulée et lui donner un paramètre booléen indiquant si la demande d'animation a été réussie ou non L'argument est de passer faux. Et à la fin de la fonction avec true. Définition du signal et ses paramètres en haut du script. Comme notre gestionnaire d'événements fait déjà référence au personnage du joueur, il est désormais trivial de lui demander de réaliser ces animations Dans le script d' interaction avec la porte de la cellule, attendons et interagissons avec l'animation avant tout dialogue. Dans le script de dialogue Maj, nous aurons besoin d'une référence au personnage Maj pour pouvoir lui demander des animations, ce qui peut facilement être fait en utilisant Add on Ready and Get Parent, puisque cette note d'interaction représente l'enfance du mage Si vous souhaitez inclure plusieurs caractères, exportez simplement une variable pour chacun d'entre eux inclus dans le dialogue. Je vais encourager le mage pendant que je parle en excluant le mot clé await, mais en faisant semblant que l' animation est vraiment furieuse Notez que nous pouvons également donner aux personnages d'autres commandes telles que démarrer le saut ou la direction du visage. Essayons-le. Lorsqu'ils parlent avec le mage, ils se baladent avec colère tout en criant au personnage du joueur dans le dialogue Si nous interagissons avec la porte, le personnage du joueur tendra la main et la touchera avant de lancer le reste de l'événement. Nous avons désormais la possibilité d' animer des personnages lors de nos événements Dans la leçon suivante, nous allons déplacer les personnages vers. Je te verrai dans la prochaine leçon. 10. Direction: Bonjour, mes amis. Dans la leçon précédente, nous avons ajouté des animations de personnages au système d'événements. Dans cette leçon, nous allons dire aux personnages de marcher et de courir à deux. Configurons une scène cinématique de base. Lorsque vous parlez au mage, demandez-lui de marcher vers le mur, de prendre quelque chose sur l'étagère, retourner voir le joueur et de le lui remettre. Comme nous l'avons fait avec la caméra, nous pouvons ajouter des marqueurs à trois nœuds en D qui indiquent au personnage où se déplacer. Tout comme les mises en scène. Nous pouvons en ajouter un en tant qu' enfant du mage pour copier facilement sa position actuelle exacte. Ensuite, dupliquez-le et déplacez le nouveau pour le placer au-dessus des étagères accrochées au mur. Assurez-vous de laisser suffisamment de place pour que le collisionneur du personnage n'entre pas en collision avec le mur avant d'atteindre Si vous avez plusieurs marqueurs dans un événement, il serait utile de les trier sous un nœud parent. En cliquant et en les faisant glisser pour les reparentaliser. Mais si le personnage se promène, puisque tous ces nœuds sont des enfants du nœud du personnage, ils se déplaceront tous vers. Nous pouvons sélectionner les nœuds parents contenant nos marqueurs, développer la section de transformation et cliquer sur le bouton supérieur, ce qui empêchera l'héritage des propriétés de transformation héritage des propriétés de Les marqueurs resteront immobiles pendant que le joueur fait des promenades. Ensuite, dans le script d'événement, nous pouvons récupérer une référence à ce nœud sous la forme d'un tableau de ses enfants. Après une ligne de dialogue, nous pouvons demander au mage de marcher jusqu' au premier marqueur de personnage, d' interagir, puis de revenir au marqueur de personnage zéro et d'interagir nouveau avant d'afficher une autre ligne de dialogue. Dans le script du personnage, nous pouvons ajouter la fonction qui indique au joueur de se déplacer vers un marqueur. Accepter un trois D comme marqueur et une distance autorisée jusqu'à la destination comme valeur flottante pour les paramètres Cela permettra à la fonction de se terminer lorsque le personnage se rapproche suffisamment du marqueur sans avoir à se tenir directement au-dessus de celui-ci. Donnons-lui une valeur par défaut d'un quart de mètre. Retournez ensuite un signal lorsque c'est fait. Ajoutons un signal nommé destination atteinte puis émettons-le et renvoyons-le à la fin de la fonction. soustrayant la position globale actuelle du personnage de la destination, nous obtiendrons un vecteur pointant vers celui-ci, un vecteur avec à la fois une direction et une distance Nos commandes de caractères supposent une longueur vectorielle de un, car c'est ce qui est fourni par le singleton d'entrée Lorsque vous utilisez cette direction pour déplacer un personnage, nous devons d'abord le normaliser, en fixant la longueur du vecteur à un. Il suffit de définir la variable de direction que le processus physique déplace ensuite le personnage. Si nous enroulons tout cela dans une boucle, nous pouvons continuer à exécuter ce code alors que le personnage est plus éloigné de la destination que la distance autorisée En attente du prochain cadre physique Ce code s'exécutera parallèlement au processus physique visant à déplacer le personnage de l'endroit où il se trouve à l'endroit où il va. Lorsque la destination est atteinte, nous pouvons définir leur direction sur le vecteur 30 pour arrêter leur mouvement, mais le personnage ralentira tout de même vers l'avant à partir de là Si nous voulons que le personnage s' arrête plus précisément sur le marqueur, il devra commencer à décélérer avant de l'atteindre Nous pouvons donc diviser cela en deux phases avant et après le point où le personnage commence à décélérer, appelé distance d' arrêt Nous pouvons calculer la distance d' arrêt en prenant leur vitesse x z actuelle, moyenne avec une vitesse nulle, ce qui peut être simplifié en la divisant par deux, puis en la divisant également par leur décélération La distance d'arrêt sera plus longue au fur et à mesure que le personnage se déplacera rapidement et dépendra également du taux de décélération Jusqu'à ce que le personnage atteigne la distance d'arrêt, il accélérera jusqu' à sa vitesse maximale. Lorsqu'ils atteignent la distance d' arrêt, ils commencent à décélérer et s' arrêtent complètement plus ou moins directement à destination Si la distance autorisée est atteinte avant la distance d' arrêt, le personnage s' arrêtera toujours Tout cela peut être fait à l'aide d'une instruction turn rey sur une ligne. Tant que le personnage du joueur interagit avec le mage de face, cela fonctionne bien Mais si le personnage du joueur fait obstacle à l'endroit où le mage veut marcher, cela peut empêcher le mage d'atteindre sa destination. Bien que la navigation dans un environnement statique soit assez simple, recherche dynamique de trajectoire autour obstacles en mouvement est un problème difficile à résoudre. Dans de nombreux jeux plus anciens, les personnages se croisaient souvent ou pouvaient être bloqués pour une durée limitée, puis arrivaient à destination en dernier recours. Ni l'un ni l'autre n'a l'air très bon. La plupart des jeux modernes, y compris AA, choisiront plutôt de faire fonctionner leurs cinématiques dans un environnement entièrement contrôlé et éliminer toute possibilité d'obstruction du chemin. Pour ce faire, toute scène cintrée dans laquelle des personnages se promènent commencera par passer au noir Chaque personnage de la scène peut ensuite être repositionné, si nécessaire avant de commencer la scène Ensuite, lorsque la scène revient, chaque mouvement est soigneusement chorégraphié Nous pouvons ajouter un autre marqueur de personnage pour indiquer où le personnage du joueur doit se placer pendant cette interaction. Mais lorsque le niveau supérieur est activé, les marqueurs des personnages semblent avoir été déplacés vers l'origine de la scène, mais ils conservent leur position globale comme avant Cela complique l'ajout de marqueurs supplémentaires. Désactivons le bouton de niveau supérieur et modifions la position de transformation pour la forcer à être mise à jour, puis remettons-la à zéro Il apparaît maintenant dans la bonne position. Ajoutons-en un de plus et déplaçons-le là où le barbare devrait se tenir Régler sa rotation pour qu'elle soit orientée vers l'âge. Réactivez ensuite le niveau supérieur. Dans le script du personnage, nous aurons besoin d'une fonction qui au lieu de placer le personnage sur un marqueur, définira simplement sa position et éventuellement la fera pivoter définira simplement sa position et directement sur celui-ci Accepter un nœud en trois D comme paramètre et comme paramètre facultatif pour faire correspondre la rotation y avec une valeur par défaut vraie. Nous n'avons pas besoin de renvoyer un signal puisque cela se produira instantanément Définissez la position globale du personnage pour qu' corresponde et, si elle correspond à la rotation, réglez également la rotation y de l'engin en conséquence. Lorsque la cinématique commence, nous passons d'abord au noir. Positionnez ensuite le personnage du joueur sur le marqueur 2 du personnage, en faisant également correspondre sa rotation, avant de revenir en arrière et de reprendre le reste de l'événement Maintenant, même si nous nous retrouvons délibérément sur le chemin du major, la scène cinématique passe au noir pour corriger cela avant de jouer l'événement de manière plus contrôlée afin d'éviter d'éventuels problèmes. Allons rendre la fonction de marche du personnage encore plus flexible en ajoutant l'option permettant au personnage de courir. Ajout d'un paramètre booléen nommé running avec la valeur par défaut false Nous pouvons dire au personnage de courir au début de la fonction et marcher à la fin de la fonction si ce paramètre est défini sur true. Nous pouvons également ajouter une autre fonction qui permettra au personnage de suivre un chemin avec plusieurs points au lieu d'un seul. En commençant par la même définition de fonction que move to maker, renommons-la follow path Remplacez le premier paramètre par path et supprimez le type. Nous supposerons simplement qu'il s'agit d'un tableau de nœuds trois D sans l'appliquer Émettez et renvoyez ensuite le signal de destination atteint. Déclarer une nouvelle variable pour le point actuel du chemin vers lequel nous nous dirigeons, qui débutera à zéro. Tant que ce nombre est inférieur à la taille du tableau, nous devons attendre de passer à ce marqueur. Et nous pouvons transmettre la même distance autorisée et les mêmes valeurs de course Dans la scène du donjon, je suis allée de l'avant et j'ai placé un marqueur vers lequel le barbare pourra marcher après avoir ouvert la porte, et trois marqueurs qui la trajectoire du roge Comme le nœud d'interaction de la porte ne bouge pas, n'avez pas non plus à vous soucier du déplacement des marqueurs. L'interaction avec la porte de la cellule nécessite alors une référence à ces marqueurs, ainsi qu'au personnage voyou. Lorsque la porte s'ouvre, le barbare peut s'éloigner pour atteindre le point zéro Ensuite, le voleur vous remerciera en sortant de la cellule de prison Je vais ajouter une plus grande tolérance en matière de distance autorisée et faire courir le personnage Je redonnerai le contrôle au joueur dès qu'il aura terminé d'utiliser la boîte de dialogue, afin qu'il n'ait pas à rester les bras croisés pendant que le voleur court. Essayons-le. Interagissant avec la cellule, la porte s'ouvre et le barbare s' éloigne sur le côté. Puis le voleur tire des coups de feu et s'enfuit. Nous avons désormais des personnages capables de marcher et de courir lors d'événements. Et la prochaine leçon améliorera la conception modulaire de nos événements. Je te verrai dans la prochaine leçon. 11. Modularité: Bonjour, mes amis. Dans la leçon précédente, personnages se promenaient et couraient pendant des événements. Dans cette leçon, nous allons passer en revue certaines améliorations apportées aux scripts d'événements. Tout au long de ce cours, nous avons créé une variété d'événements différents. Certains se déclenchent lorsque le joueur entre dans une zone spécifique, d'autres lorsqu'il appuie sur un bouton. En regardant ces deux scripts, nous pouvons commencer à voir la similitude entre la fonction run event et quelque chose comme un scénario, qui donne des instructions aux personnages et aux caméras sur un plateau de tournage. Vous pouvez l'imaginer en créant un jeu entier. Il y aura des centaines, voire des milliers de ces scripts, peut-être écrits par plusieurs personnes. Nous voulons qu'ils soient aussi faciles à écrire et à modifier que possible afin de réduire le temps nécessaire à leur production, et qu'ils soient de réduire le temps nécessaire à leur production, standardisés pour réduire les bogues potentiels. Commençons par ajouter une déclaration de nom de classe au script du gestionnaire d'événements. Ensuite, dans nos scripts d'événements, spécifiant le type de gestionnaire d'événements, le moteur produira désormais des suggestions de saisie semi-automatique lors accès à des variables ou à des fonctions dans le gestionnaire d'événements Une fonctionnalité utile pour réduire les bogues dans tous les scripts qui l'utilisent. Ensuite, il serait utile de séparer la façon dont un événement est déclenché de la façon dont il s'est déroulé. Créons un nouveau script dans le dossier des événements. Bien que Godot n'ait pas réellement d'implémentation d' une classe abstraite, nous pouvons toujours prétendre qu'il s'agit d'une classe abstraite, qui n'est jamais destinée à être instanciée de quelque façon que ce soit, Hérité de Aa three D, et donnez-lui un événement d'interaction avec le nom de classe. En déplaçant la méthode d'interaction dans cette classe, tout script d'événement d'interaction du jeu peut alors hériter d'un événement d' interaction pour masquer la fonction d'interaction par héritage Nous pouvons également nettoyer le code de la couche de collision en appelant des méthodes héritées avec des noms appropriés. Comme set interactable, en passant true ou false comme argument La classe d'événements d'interaction peut ensuite masquer les détails de la manière dont cela est réalisé et la standardiser pour tous les événements interactifs Régler la couche de collision sur 16 si elle est interactible ou sur zéro pour qu'elle ne soit pas interactible. Il serait judicieux d' hériter davantage de l' événement d'interaction pour créer une classe commune pouvant être appliquée à toutes les interactions similaires de votre jeu, par exemple en ayant un script pour toutes les portes ou un script pour tous les pickups, par exemple Les seules différences entre leurs interactions similaires variables exportées ou les références à d'autres nœuds. De nombreux événements dans les jeux ne sont déclenchés que sous certaines conditions, et beaucoup deviennent inutiles une fois qu'ils se sont produits une fois qu'ils se sont produits. N'importe lequel de nos scripts d' événements d'interaction peut facilement remplacer la méthode d'interaction pour ajouter des conditions, vérifiant la progression du joueur pour détecter les indicateurs si nécessaire, avant d'appeler la définition de superclasse de l'interaction pour démarrer l' OK. Placer le même drapeau à l'intérieur de l'événement. Nous pouvons également rendre cet événement ininteractif pour éviter que le même événement ne se reproduise Une autre option populaire consiste à utiliser la méthode Ready pour vérifier si les conditions de cet événement sont remplies et à le configurer pour qu'il soit interactif ou non lors du premier chargement dans le C'est souvent le cas chaque fois déclenchement d'un événement nécessite un zonage et un retour au niveau pour le réinitialiser avant de parler à un NBC, par exemple Les conditions de l'événement sont vérifiées uniquement lors du premier chargement. Dupliquons le script d'événement d'interaction et créons également un script d'événement de proximité. Changer le nom de la classe pour qu'il corresponde. Nous pouvons remplacer la méthode d'interaction par aucun corps saisi, acceptant le corps comme un paramètre à trois D. Cette collision déclenchera l'événement, mais le signal saisi par le corps n'est pas intrinsèquement connecté Dans la fonction Ready, nous pouvons connecter manuellement le signal à la méthode appelable Réglons également le masque de collision pour détecter le joueur, c' est-à-dire la couche neuf, le bit huit, deux à la puissance huit égale 256. Désormais, n'importe quel script d'événement peut hériter d'un événement de proximité et ses conditions de déclenchement ainsi que le masquage des collisions sont tous gérés automatiquement Dans ce projet, j'ai placé tous les personnages sur la même couche de collision, sorte que chacun d'entre eux déclenchera des événements de proximité. Ouverture des paramètres du projet, sous les noms des couches, physique en trois D. Ajoutons une couche séparée pour les PNJ. Ensuite, dans chaque scène de PNJ, nous pouvons changer leur couche de collision d'un joueur à autre et leur demander de se masquer mutuellement Désormais, seul le personnage du joueur sera détecté par les événements de proximité. Créons également un autre type d'événement, un événement qui ne soit pas du tout déclenché par le joueur, mais qui puisse être déclenché par d'autres scripts. Le game manager lancera probablement un événement d' introduction lors du premier chargement du jeu Un niveau peut également vouloir déclencher des événements lorsque le joueur y entre, ou des événements peuvent vouloir déclencher d'autres événements. créant un nouveau script dans le dossier des événements, appelons-le événement scripté Cette fois, il héritera du nœud, puisqu'il n'a besoin d'aucun comportement de la classe de nœuds Aa three D. Comme un événement scripté n'a pas besoin de se déclencher, le seul but du script sera garantir l'existence d'une fonction d'exécution d'événement et de fournir un signal qui sera émis une fois l'événement terminé, qui pourra être émis et renvoyé Tout script qui hérite de cette classe peut désormais renvoyer un événement super point run pour automatiser ce comportement En ajoutant une variable au fichier sécurisé du joueur, appelons-la « intro played Ablean », qui prendra naturellement par défaut Créons un événement d'introduction qui ne sera déclenché qu'une seule fois lorsque le jeu chargé pour la toute première fois Pour des raisons de simplicité, je vais simplement le faire disparaître puisque l' état actuel du destin est noir au premier chargement du jeu. Dites ensuite bonjour à tout le monde et réglez le drapeau sur true. Renvoie ensuite l'événement Spot Run, qui émet et renvoie le signal final Et demandez également au game manager de mettre fin à l'événement. Ajout d'une nouvelle note à la scène de jeu pour organiser un événement scénarisé Le gestionnaire de jeu peut en récupérer une référence en utilisant Add-on Ready. Dans la fonction Ready. Nous pouvons maintenant vérifier ce drapeau. Commencez ensuite l'événement d'introduction et attendez la fin du signal. Si le drapeau a été défini sur true, il sera ignoré Exécution de la scène, événement d'introduction ps. Si le joueur sauvegarde et recharge le jeu, l' événement scripté par le script d'introduction ne se déclenchera pas une seconde fois Je vais le démontrer en définissant la variable par défaut dans le fichier sa sur True Ajoutons un autre nœud pour contenir un événement secondaire, qui sera déclenché par un événement principal. Ajouter un script à ce nœud héritant d'un événement scripté Il indiquera simplement un événement secondaire et renverra l'événement Super point run Tout script d'événement du jeu peut désormais attendre l'exécution cet événement secondaire et celui-ci sera exécuté avant de revenir à l'événement qui l'a appelé. Cela peut aider à diviser les événements très longs en segments plus importants, diviser les récits ramifiés en scripts distincts ou à recycler le même événement pour l' utiliser dans plusieurs contextes Nous avons désormais mis en place un système de gestion des dialogues et des événements très complet système de gestion des dialogues et des événements qui peut être utilisé pour créer des récits complexes et ramifiés, des cinématiques captivantes et pour donner au joueur le choix de la manière dont il souhaite progresser dans le Le système est également optimisé pour rendre la production des scripts d'événements assez simple. 12. Quoi faire ensuite ?: Bienvenue dans mon cours sur l' inventaire et les boutiques à Gado. Ce cours s'inscrit dans la continuité du dialogue et des événements de Gado, mais peut être suivi et appliqué à tout projet impliquant de récupérer des objets, les ajouter à un inventaire, de déposer, utiliser ou d'équiper des objets depuis un menu d'inventaire et d'échanger des objets avec un Vous pouvez rejoindre notre serveur Discord pour travailler sur ce cours aux côtés de vos pairs Dans ce cours, nous aborderons différentes méthodes pour récupérer des objets, gérer les données d' inventaire des joueurs, afficher leur inventaire sur l'interface utilisateur dans un menu, permettre au joueur d'interagir avec son inventaire de différentes manières et échanger des objets avec des PNJ. Lorsque vous aurez terminé, vous disposerez d'un système d' inventaire simple pour votre jeu facilement personnalisable dans sa présentation et ses fonctions. 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 allez apprendre à 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, l'abstraction et le polymorphisme, afin de les organiser, de les personnaliser et de les réutiliser pour un projet de toute taille Tous les fichiers du projet sont é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 Gdoersion 4.2 0.2. Le projet commence avec des actifs provenant de K Kits, personnages et de packs remasterisés de donjons créés par Bundle Basic Guy créé par Penzilla et icônes créées par Tous sont téléchargeables gratuitement sur ce site. Les effets sonores réalisés par Valensbyer sont également inclus et sont disponibles sur