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