Transcription
1. Introduction du cours: Salut, tout le monde, Chris, ici. Et dans cette vidéo, j'
ai quelque chose de vraiment cool. J'ai hâte de
partager avec vous tous. C'est mon nouveau cours de
développement sur GidoGame pour créer un jeu de type
survivant Nous avons donc beaucoup
de contenu là-dedans. Je veux dire, c'est plus de 60 leçons et près de 12 heures de vidéo. C'est de loin le
cours de développement de jeux vidéo le
plus long et le plus complet que j'ai jamais proposé. Donc, si vous avez déjà pensé à créer votre propre jeu
Survivors Light amusant, c'est exactement ce que
nous allons faire. Nous allons le construire étape par
étape, à partir de zéro. Nous utiliserons la version 4.4 de
GidoEngine, dont vous
savez probablement déjà qu'elle est gratuite et open source Nous allons donc tout coder
dans le script GD. Quel est le langage
spécialement
conçu pour l'éditeur Gadot Il est convivial pour les débutants, facile à lire et étroitement
intégré au moteur ADO. Cela fonctionne donc à merveille pour créer des
prototypes de jeux comme celui-ci Donc, que vous débutiez le développement de
jeux ou que vous ayez déjà écrit un peu de codage et vous souhaitiez vraiment renforcer vos compétences avec un nouveau projet
intéressant, je pense que ce
cours est fait pour vous Nous allons commencer simplement, en nous
familiarisant avec les éléments essentiels tels que les mouvements du haut
vers le bas des personnages. Ensuite, nous allons vraiment
commencer à l'accélérer, en appuyant sur des concepts
vraiment complexes. Vous allez ajouter les statistiques des personnages, les systèmes de mise à
niveau, la collecte d'objets Nous allons même créer
un système d'apparition qui positionnera tous vos ennemis hors écran afin qu'ils
puissent envahir le joueur
de tous les côtés Bref,
nous allons
vraiment nous familiariser avec le système de scène en deux D
Godos Cela couvrira
tout le reste, des projectiles à la création d'interfaces utilisateur
soignées À la fin du
cours, vous aurez un survivant entièrement jouable, comme prototype de
jeu vu
en arrière-plan, et toutes les connaissances nécessaires pour en
faire un projet de plus grande envergure Alors, qu'en dites-vous ?
Êtes-vous prêt à transformer ces idées de jeux
en quelque chose de réel ? Rejoignez-moi dans le
cours, et
construisons ensemble quelque chose d'
incroyable.
2. Configuration du projet Godot up: Bonjour à tous, Chris
, dans cette vidéo, nous allons
commencer par la première étape de notre projet Survivors Like et GD Script en
téléchargeant le GDOEngine Si vous ne le
savez pas déjà, Gadot est un moteur de
jeu open source gratuit qui possède son propre langage principal, GD Script écrit
spécifiquement pour Gdo, c'est
ce que nous allons utiliser pour
coder C'est un langage de script. Vous pouvez, bien sûr,
utiliser d'autres langages dans Gdo, comme C Sharp, qui bénéficie d'un
support intégré solide avec une
version Mno La plupart des didacticiels que vous
trouverez seront en GDScript, car GD Script est
rapide à utiliser. Il a une très bonne intégration
avec l'éditeur EUI. Il est facile à utiliser et
vous n'avez pas besoin de compiler vos scripts chaque fois que vous souhaitez y
apporter des modifications. Donc, en ce qui concerne la simplicité, en particulier pour les petits projets, GD Script a
beaucoup à offrir Donc, en regardant le site Web de Gado, je vais utiliser la version
actuelle de Gado 4.4 0.1 Plus précisément, je vais
télécharger la version non mono de celui-ci, ce qui signifie qu'il ne supporte pas
C Sharp car la version
GD Script uniquement vous permet d'exporter vers le Web Mais si vous utilisez le Gado Mono, cette fonctionnalité n'est pas prise en charge Gadot 4.5 est donc déjà
en préparation, et il y a quelques fonctionnalités que je trouve plutôt
intéressantes à sortir Mais comme nous
essayons de nous en tenir à cours de
niveau intermédiaire
pour débutants, je ne veux pas submerger ce soit avec tous ces concepts Alors allons-y, cliquez sur
Télécharger et récupérez 4.4 0.1, et nous voulons la version bleue
ici. Ce n'est pas Mono. Cela ne sera que
pour GD Script. Si vous vouliez du C sharp,
vous pouvez utiliser .net. Nous n'en aurons pas besoin pour cette
version du projet. Je pourrais créer une
version C Sharp du cours plus tard si cela a du sens.
Nous verrons comment les choses vont se passer. Vous allez donc
vouloir enregistrer cette installation, puis
ouvrir le GadoEditor Donc, une fois que vous l'avez ouvert, vous devriez être contacté par le chef de projet, qui vous donnera une liste
de vos projets en cours. Vous n'
avez probablement pas grand-chose ici. Il y aura peut-être quelques démos. Mais ce que nous allons
vouloir faire, c'est créer notre nouveau projet. Créons donc un nouveau projet, et vous pouvez lui donner le
nom que vous voulez. Je vais l'appeler script
Survivors, nom subtil, je sais, parce que c'est un script GD, et c'est un style de survivant Je vais donc le mettre dans mon répertoire de
tutoriels, que j'ai
spécialement configuré pour ce type de didacticiels de
longue durée. Définissons-le donc comme
le dossier actuel, et nous devrions voir quelque chose
comme le nom du projet ici et le chemin vers
le projet complet. Parce que j'ai créé Script
survivors A en un mot, cela n'a pas vraiment mis
de séparateur ici. Je vais donc simplement utiliser un tiret comme séparateur par défaut
pour les espaces. Et nous allons vouloir le
moteur de rendu en mode mobile. Il s'agit d'un cours de pixel art, nous n'avons
donc pas vraiment besoin du moteur de rendu
Ford pour quelque raison que ce soit, et nous allons simplement
créer avec Ainsi, une fois votre
projet démarré, vous devriez voir le port d'affichage en
trois D ici L'un des avantages de
Gadot, c'est qu'il dispose de deux
flux de travail complètement distincts pour deux D et trois D, mais qu'il prend en charge les
deux Contrairement à Unity, ce sont des entités
complètement distinctes. Il ne s'agit donc pas de simuler deux
D dans un système à trois D. C'est en fait complètement
deux D. Et si vous regardez sur la gauche
dans cette fenêtre de scène, vous verrez qu'il y a fait quatre types de nœuds ici, deux scènes en D, trois scènes en D
, une interface utilisateur. Et puis si nous cliquons sur autre nœud, il y a la
classe de base ici node, qui ne contient aucun
composant 2d3D Il n'y a donc aucune position nulle part, vous l'utiliseriez pour des
choses comme les systèmes, traitement des
informations de base, non pour les objets réellement
présents dans le monde du jeu. Pour tout ce qui
se trouve dans le monde du jeu , en
général, nous
allons utiliser une scène en deux D. Ce
sera donc une icône de nœud bleu ici
, juste pour faire
la différence. Et puis l'interface utilisateur
sont les nœuds de contrôle. Cela est marqué en vert, par tout ce qui peut être
un bouton à l'écran, texte de combat
flottant, des fenêtres contextuelles d'
interface utilisateur, comme lorsque nous sélectionnons des
récompenses en fonction de ce que vous pouvez obtenir en
passant au niveau supérieur Ce sont tous des nœuds d'
interface utilisateur. Alors, bien sûr, au
fur et à mesure, j'expliquerai plus détail ce qu'est réellement un nœud. Pour le moment, abordons un peu plus l'interface. Nous avons donc le système de fichiers dans le coin inférieur gauche. C'est là que vous
allez avoir tous vos fichiers dans Gdo, y compris actifs importés,
vos fichiers SEN, où vous prenez
un ou plusieurs nœuds, et vous les enregistrez dans une scène, dont vous pouvez créer
des copies n'importe où dans votre jeu Il s'agit donc essentiellement d'un
modèle que vous pouvez réutiliser. Et puis d'autres fichiers Gdo
et non Gudo,
comme les ressources Donc, dans la fenêtre d'affichage ici, vous
avez votre accès X, Y ici. Un
point distinctif vers le bas est en fait la
direction positive de l'axe Y. Donc, si vous
parlez de vous déplacer vers le haut, vous voulez passer à Y négatif, et si vous voulez vous déplacer vers le
bas de l'écran, vous parleriez
d'une valeur Y positive. La droite correspond à un X positif, puis à gauche à un X négatif Cela sera
donc
très pertinent lorsque nous déplacerons nos personnages
sur l'écran. Vous devez vous assurer qu'
ils vont dans la bonne direction et que vous recevez également
les informations nécessaires. Si vous regardez de très
près les 1 200 pixels, du moins pour moi, il y aura les limites de notre interface
utilisateur L'interface utilisateur se trouve donc généralement sur sa propre couche de canevas
séparée. C'est donc une chose complètement
distincte du monde du
jeu en deux D lui-même. On pourrait penser que l'interface
utilisateur de l'interface utilisateur est en quelque sorte
superposée la caméra alors qu'elle permet de
visualiser le monde en deux D. Ainsi, chaque fois que la caméra bouge, tous les éléments de l'interface utilisateur
se déplacent également. Mais les
objets du monde du jeu ne bougent généralement pas avec
la caméra. Donc, si vous déplacez la caméra, l'interface utilisateur restera en place
et tout ce qui se trouve en dessous, les personnages, les ennemis, ne
bougeront pas
avec la caméra. Et c'est l'un des principaux
facteurs de distinction entre
les deux nœuds D et les nœuds de contrôle de l'
interface utilisateur Tout ce qui est un élément d'interface utilisateur
est un nœud de contrôle dans Gadot. Sur la droite, nous
avons l'inspecteur qui est utilisé pour définir
les propriétés de vos nœuds. Lorsque vous écrivez des scripts, vous pouvez leur attribuer une balise at export, qui les marque comme modifiables dans
l'inspecteur C'est vraiment important. Nous allons en faire une grande partie. Vous allez donc le modifier ici. Bien entendu, il existe d'autres fenêtres qui ont une importance variable. Je les aborderai également dans les vidéos
ultérieures. Dans la prochaine vidéo, nous allons donc nous
familiariser avec notre projet. Nous importerons tous les actifs
artistiques dont nous avons besoin,
y compris le son, la
musique, les œuvres d'art et les polices de caractères. Et puis il y a aussi
quelques plugins qui,
selon moi , seraient extrêmement
utiles pour le projet, à télécharger et à utiliser gratuitement. Nous aborderons donc tout cela
dans la deuxième vidéo.
3. Art, son et plugins ~ Importer et installer: Dans cette vidéo, nous
allons donc poursuivre la configuration de notre projet en
installant tous les actifs, le
son et les plugins dans les projets sur lesquels nous
sommes prêts à commencer à travailler. Sur PaySPN, j'ai tous les liens vers
les ressources dont
nous avons besoin pour le cours, tout ce que j'ai utilisé dans le projet de
pré-enregistrement
pour les survivants du script Donc, si vous suivez le lien en haut de la page,
je vais zoomer dessus. Vous pouvez simplement accéder
à chacun de ces liens, et vous n'avez besoin que des
versions gratuites de chaque ressource. Je dois le partager de cette
façon pour respecter la règle de
non-redistribution imposée
par la plupart de ces actifs, mais
il suffit de suivre les liens
vers chaque page de boutique et de
télécharger la version gratuite. Donc, tout d'abord, Pixel Crawler a notre modèle basé sur les personnages que nous
utiliserons pour configurer certaines
armes et certains ennemis C'est vraiment
au cœur de ce didacticiel, c'est
donc sur cela que nous
basons en grande partie sur l'Alpha. Ensuite, passez aux icônes de Raven Fantasy. Pour les éléments de l'interface utilisateur, interface utilisateur de Crimson
Fantasy. La police, je vais
utiliser m5x7. Mais honnêtement, vous pouvez
simplement choisir police de
pixel art qui vous
convient le mieux. Il y a aussi beaucoup de choses sur
Itch Dot IO. Pour certains effets
sonores de base du jeu,
Leo utilise RPG
Essentials SFX gratuitement Et pour ce qui est de la
musique, The Red Hearts prepared to Dev de Tall Beard est une musique
chiptune
absolument parfaite pour le style du jeu
Survivors Light. Cela fonctionne
vraiment très bien. OK, vous téléchargez
tous les fichiers zip, puis vous pouvez faire clic
droit sur le système de fichiers, créer un nouveau dossier pour les illustrations. Je vais mettre tous
les visuels ici. Ensuite, cliquez avec le bouton droit de la souris, créez
un nouveau dossier pour l'audio . Je vais y mettre
tout ce qui se trouve dans la
section Effets sonores ou musique. Ensuite, pour l'ouvrir rapidement
dans l'explorateur de fichiers Windows, ou l'équivalent si
vous utilisez Max ou Linux,
cliquez avec le bouton droit de la souris et cliquez sur
Ouvrir et gestionnaire de fichiers. D'accord. Ensuite, vous
voulez simplement extraire tous les fichiers dans
ce dossier artistique. Voici donc l'interface graphique de
Crimson Fantasy, les icônes de fantasy,
puis le pack gratuit Pixel
Crawler La seule exception est que
pour les icônes fantastiques, il en existe trois ou quatre versions
différentes. J'utilisais juste les feuilles de sprites
complètes. Ils sont les plus faciles
à utiliser dans Gadot car vous pouvez créer une ressource de
texture d'atlas, puis simplement sélectionner l'icône que
vous souhaitez sélectionner pour cela Pour chacun des éléments auxquels vous allez
attribuer une icône, je trouve qu'il est beaucoup
plus facile de travailler de cette façon Et pour Gadot, s'il importe
chaque icône séparément, ce qui est une option
avec ce pack, prend beaucoup de temps chargement dans le moteur Ainsi, lorsque vos images sont regroupées dans un seul fichier comme
celui-ci, c'est beaucoup plus efficace. Je pense que c'est la voie à
suivre. À part cela, je pense que je ne faisais qu'apporter
l'intégralité du répertoire. Je ne change pas les
noms de fichiers ou quoi que ce soit d'autre. En général, dans Gadot,
vous utiliseriez un boîtier en forme de
serpent pour les noms de dossiers de vos
répertoires, mais je pense qu'il est
plus simple utiliser ce que les artistes ont fourni
ici et de le suivre Cela ne devrait donc pas causer de
problèmes ou quoi que ce soit d'autre. Peut-être un peu
optimisé, mais c'est parfaitement bien. Et puis pour le son
des effets sonores, si vous ouvrez le zip, nous
arriverons comme ça. Et pour ce qui est de la musique, je ne
faisais que le box jump des trois Red
Hearts, qui est le premier morceau de musique Vous pouvez simplement sélectionner morceau de musique
que vous souhaitez utiliser pour votre niveau de jeu, mais je pense que celui-ci fonctionne
vraiment très bien. Vous savez, allons-y
et prévisualisons pendant une minute. Oui, donc un
titre absolument génial pour les jeux de
style Survivor, je trouve. Ainsi, une fois que vous avez tout importé,
vous le mettez dans vos fichiers. Si vous rouvrez la fenêtre Gado, vous devriez voir que tout est correctement
importé dans ces dossiers, puis tout devrait s'afficher ici
sur la gauche se peut donc que vous
receviez des messages d'erreur lorsque vous importez
des éléments pour la première fois. Vous pouvez simplement confirmer que
les fichiers sont là, et c'est le principal
élément important ici. Je pense que ces messages peuvent en
quelque sorte être ignorés. Drop Stable n'a même rien à voir
avec ce projet. Cela peut être lié à la
mise en cache sur mon ordinateur. Mais l'important,
c'est que nous avons
les fichiers ici. Vous pouvez
double-cliquer dessus. Vous pouvez voir que cela est
reconnu, comme la musique là-bas et les effets
sonores ici. Il semble donc que nous allions bien. Alors allez-y et effacez ce logo. Nous avons donc besoin de deux plugins
pour le cours. Premièrement, je pense que c'est
une excellente qualité de vie lorsque vous naviguez dans
le système de fichiers ici C'est ce qu'on appelle réduire
des dossiers, car vous
remarquerez peut-être que lorsque vous
ouvrez un ensemble de dossiers de ce type, il n'est vraiment pas facile réduire ou de les
replier tous
pour que vous puissiez voir intégralité de
votre système de
fichiers dans une seule fenêtre. Donc, ce que vous voulez faire, c'est
accéder à l'Asset Lib en haut de la page, puis
rechercher Collapse. Cliquez donc sur le type de
barre de recherche Collapse. Et puis celui
que nous voulons ici, c'est réduire les dossiers.
Alors téléchargez-le. Installez-le OK, je dirais
installé avec succès. Nous voulons maintenant accéder à
Project en haut à gauche, aux paramètres
du projet, puis
à l'onglet plugins ici. Cochez la case activée, appuyez sur Fermer. Et cela crée cette petite icône ici
où vous pouvez tout réduire, et vous pouvez avoir
tous les dossiers, revenir à la racine. Rien n'est étendu, et il est beaucoup plus facile de naviguer dans
le système de fichiers avec cela. Je pense que c'est juste un bouton
très pratique. Cela devrait être là dans
Gadot Basic, honnêtement. L'autre est donc un plugin beaucoup
plus complexe, et nous allons l'utiliser
pour les machines d'État Gadot. Il est également utilisé
pour les arbres de comportement, mais comme l'IA est très
simple et constitue un jeu de survie, nous allons nous en tenir
aux machines d'État ici Il n'est pas nécessaire de le
complexifier avec un arbre de comportement. Nous recherchons donc Limbo AI, et comme je suis en 4.4, je vais utiliser
Limbo AI 4.4, bien sûr Vous remarquerez peut-être qu'
actuellement, au moins, il n'y a pas encore de version 4.5
parce que, eh bien, je veux dire, 4.5 est toujours en développement, donc cela peut fonctionner si vous décidez d'utiliser la version Dv ou si vous rencontrez des problèmes Cela fonctionnera probablement, mais,
vous savez, il se
peut qu'il y ait un bogue ici ou là. Donc, vous savez, une autre raison de s'en tenir à la version
stable de Gado Téléchargeons donc ceci, et ce sera
notre plug-in de machine à états .
Nous pouvons l'installer. Cela prendra un peu
plus de temps car il s'
agit d'un connecteur assez gros. Je vais ignorer
ces messages une fois de plus. Cela peut en fait se produire parce que le
nom du projet est le
même, même si le
répertoire est différent Je vais
donc simplement changer le nom du projet pour que
tout cela cesse d'apparaître. J'espère que cela
résoudra le problème. Je vais donc simplement changer le nom et lui donner le nom de script GD.
S'agit-il d'un tag supplémentaire ? Terminons en disant que je vais
effacer les messages, et je vais simplement recharger le
projet pendant que je suis en avance et je vais juste voir s'
il y a un problème lorsque je rechargerai le Non, d'accord, ça a l'air bien. D'accord. Donc, si nous vérifions les paramètres du
projet
et que vous allez dans Plugins, vous remarquerez que Limbo AI
n'apparaît pas ici Limbo AI est en fait
écrit en C plus, peut-être
pour cela qu'
il n'apparaît pas spécifiquement sous la forme d'un plug in cado J'imagine qu'il l'a fait
pour maximiser l'efficacité du code,
car CPlusPlus est plus rapide que les scripts C Sharp
et GD Mais oui, c'est exactement comme ça. Donc, pour confirmer que
Limbo AI fonctionne, il suffit de créer rapidement une nouvelle scène TD ici
en haut à gauche Et puis cliquez avec le bouton droit
ici sur
le nœud racine, le nœud deux D, ajoutez un nœud enfant et recherchez simplement Tapez State. Vous devriez voir
apparaître l'état Limbo et l'état BT. Tant que vous voyez apparaître ces classes
de Limbo AI, vous savez que le plugin
est correctement installé. Donc, pour récapituler, nous devrions avoir un fichier audio de nos effets sonores
répartis dans cinq dossiers ici, au moins une piste audio Et les illustrations, nous devrions avoir interface graphique de
Crimson Fantasy, les icônes de
Raven Fantasy, et je n'apporterai que le dossier
complet de la feuille de sprites, puis Pixel Crawler
pour notre personnage principal, nos
accessoires de fond et
nos ennemis, accessoires de fond et
nos ennemis, quelque sorte le principal atout artistique de la série de Et puis une police de caractères. J'ai donc apporté m5x7 en
tant que police TTF à points. Je pense que d'autres types
peuvent également fonctionner, mais il vaut probablement mieux s'en tenir au même pour des raisons de cohérence. Et puis nous avons les ajouts, les dossiers
de réduction et Limbo AIA Ce devraient donc être tous
les fichiers externes que nous devons apporter
pour ce cours. Tout le reste
sera constitué de scripts GD que nous écrirons, scènes que nous configurerons ou
d'autres fichiers Gadot que nous créerons, tels que des ressources
pouvant être enregistrées dans un Ce sera donc
tout pour cette vidéo. Ensuite, nous allons
commencer à créer notre personnage de
jeu en deux D de haut en bas et à ajouter quelques
commandes de mouvement de base au personnage, afin qu'il puisse se déplacer
sur l'écran.
4. Mouvement du joueur de haut en bas: Dans ce tutoriel, nous
allons donc implémenter le mouvement des personnages du haut vers le bas pour notre scène de personnage principale. Mais juste avant
d'entrer dans le vif du sujet, je tiens à
souligner que nous pouvons supprimer le dossier de démonstration de Limbo AI qui s'
importe automatiquement avec le plugin lui-même Si vous souhaitez suivre la démo ou la conserver,
vous pouvez le faire. Cela inclut des exemples
sur la façon d'utiliser Limbo AI, mais je vais
vous montrer en vidéo
ces étapes pour la
machine à états en particulier Nous n'en avons donc pas vraiment besoin
pour notre projet. Je vais l'enlever. OK, et maintenant nous sommes prêts à commencer. Nous voulons donc
commencer avec une scène
en deux D dans le coin supérieur gauche Je vais
donc cliquer sur
créer une scène en deux D du nœud racine. Cela va donc nous donner
un nœud de base deux D. Maintenant, la racine de notre personnage, manière générale, nous
voulons être un corps de personnage deux D, qui est un type de nœud deux D. Nous pouvons
donc cliquer avec le bouton droit sur notre nœud deux D et
changer de type, puis nous allons
taper le caractère. Nous trouverons
le corps du personnage deux D. Notez que celui-ci hérite du corps
physique deux D, qui est un objet de collision s'agit d'un type de nœud deux D. Il existe donc
toute une série de classes ou de types d'objets dont le corps
du personnage hérite, et il acquiert tous
les traits de toutes les
classes qui le précèdent Cela signifie donc que tout ce qu'
un corps physique deux D peut faire, un corps de personnage deux
D peut le faire également. Passons donc au corps du personnage 2 D. Et
dès que vous aurez fait cela, un petit panneau d'avertissement en forme de triangle
jaune indiquera que
l'
objet de la collision n'a aucune forme. Nous devons donc cliquer avec le bouton droit de la souris
et ajouter un nœud enfant, qui sera une forme de
collision en deux D, et je vais simplement zoomer sur
le centre 0,00 ici. Vous ne verrez rien pour l'
instant car nous
n'avons pas encore ajouté de sprite Mais commençons par cliquer
sur la forme et sur l'inspecteur sur le côté droit pour créer une
nouvelle forme de cercle. Nous pourrions donc revenir pour le modifier
et réduire sa taille, mais nous avons d'abord besoin du sprite pour vraiment voir avec
quoi nous travaillons Prenons donc le nœud racine et renommons-le en
appuyant sur F deux Et je vais
simplement l'appeler joueur. Vous pouvez également l'appeler personnage
du joueur ou corps
du personnage du joueur en deux D,
selon ce qui vous semble logique. Ensuite, nous allons
enregistrer cette scène, qui est essentiellement
la scène racine et tous les
nœuds enfants dans un seul fichier,
un fichier de scène
TACN à points dans notre projet Donc, si nous appuyons sur Ctrl S pour enregistrer, nous cliquons ensuite dans le coin
supérieur droit pour créer un nouveau bouton de dossier. Et donnons-lui un nom. Je vais faire des personnages,
je vais faire des minuscules, ce qui est généralement le nom
standard de Gadol, Snake Case Donc, si vous avez besoin d'
espaces, vous devez mettre un soulignement puis d'autres
éléments, un peu comme ça Passons donc aux personnages. Ensuite, pour ce qui est des personnages,
je vais créer un dossier pour le joueur juste
parce que je sais à l'avance il y aura un tas de scripts, puis nous pourrons les
combiner le même sous-répertoire Je vais donc créer un nouveau dossier. Joueur. Et disons OK. Nous avons donc player point
TSC et nous allons l' enregistrer dans ce
répertoire ou dossier Sauvegardez donc la scène ici. Ainsi, dans Godot, votre projet est essentiellement composé de
scènes au sein de scènes Vous avez donc peut-être une scène de jeu
principale. Nous avons toute la configuration du système, et en dessous de cela, vous pouvez
ajouter la scène du monde du jeu, c'est-à-dire la carte en deux D et
les objets qui devraient être peuplés. À l'intérieur
de ce monde en deux D, vous aurez, bien sûr,
votre scène de joueur, les scènes de vos ennemis, vos orcs, de vos
squelettes Ainsi, lorsque votre scène
est enregistrée dans un fichier, il est très facile instancier, car
il s'agit simplement de prendre les données
enregistrées, d'en charger une copie et de les
placer dans votre Donc très rapidement, je pourrais
vraiment le démontrer. Si nous cliquons sur ce nouvel onglet, créez un nouveau bouton de scène. Nous pouvons ajouter une nouvelle scène en
deux D ici. Appelons cela le monde. Je vais donc appuyer sur F deux pour le renommer, et ce ne sera que World. Nous pouvons le conserver comme un
nœud standard deux D. Nous n'avons pas vraiment besoin qu'il ait autre
chose qu' une position à l'écran. Appuyons donc sur Control
S pour enregistrer cette scène. Je vais aller à la racine et nous
pouvons simplement enregistrer World Dot
TSN à l'intérieur d'ici OK, maintenant nous voulons ajouter une copie de notre joueur
au monde. Nous pouvons donc simplement faire
glisser la scène du joueur dans la hiérarchie du monde dans l'onglet scène en haut
à gauche. Il vous suffit donc de faire glisser le point
TSN du joueur ici sous World. Et maintenant, il y a une copie
du joueur dans
le monde du jeu. Vous savez donc qu'il est là parce que
vous pouvez le survoler. Je dirais joueur
ici. Vous pouvez voir l'icône représentant le corps du
personnage, deux D, et vous pouvez voir la
forme de collision que nous avons définie. Maintenant, il n'y a pas encore de sprite. Nous allons l'ajouter
dès maintenant. Je vais donc appuyer sur Contrôlez-nous pour
sauver le monde. Nous allons passer au joueur.
Je vais cliquer avec le bouton droit sur le joueur, ajouter un nœud enfant pour lequel nous
recherchons un sprite Donc Sprite two D. Il existe également un nœud Sprite two D animé, et les deux peuvent à peu près être
utilisés aux mêmes fins Ils ont organisé les choses un
peu différemment. Je dirais que pour les personnages des
joueurs, il est en fait plus facile de travailler
avec Sprite two D et de
définir ensuite les propriétés
que vous devez
animer sur le lecteur d'animation Nous aborderons plus
en détail l'animation d'un sprite dans la prochaine vidéo Ajoutons donc un nœud
Sprite two D. Et pour le moment,
nous allons
vouloir charger une texture. Lorsque nous chargeons
la texture ici, nous n'allons pas définir
une seule image de sprite Nous allons en fait
créer une feuille de sprites. Nous obtenons donc notre feuille de
sprites dans le répertoire artistique. Dans le
pack Pixel Crawler, nous avons, je crois, des entités, des personnages,
un corps A et des animations Nous allons donc simplement
commencer par l'idole. Donc, pour ce personnage, vous obtenez une feuille de sprites ascendante et Lorsque vous jouez à deux jeux en D du haut
vers le bas, vous pouvez simplement retourner
la feuille de sprites latérale De gauche à droite, ce qui
signifie que vous n'avez pas besoin de créer une quatrième
feuille de sprites pour la gauche et droite, car vous pouvez simplement
réutiliser la même feuille de sprites, et cela fonctionne tout aussi Cela vous fait gagner du temps
en l'animant de cette façon. Nous voulons donc qu'Idle down démarre
juste pour que nous puissions réellement voir le personnage que
nous cherchons. Nous allons donc le charger ici. Il s'agit donc d'un sprite de
personnage de base. L'idée ici est donc que
vous pourriez
ajouter des vêtements en tant que
sprite supplémentaire, y
apporter des personnalisations, mais les animations restent les mêmes, car vous
développerez le personnage
final pour des
styles et un look fondamentalement différents OK, donc certaines choses ressortent
probablement du lot. Tout d'abord, le personnage n'est
évidemment pas habillé. Il s'agit donc d'un sprite de
personnage de base. L'idée est de prendre vêtements, des
sprites
supplémentaires et de les
ajouter votre animation de base
pour le personnage final,
par exemple sous la forme d'un
chapeau de magicien ou quelque chose comme ça Et l'idée est que vous
pouvez échanger des
sprites pour terminer votre personnage
final Mais pour les animations de base, elles sont fournies ici
dans le pack gratuit, et vous pouvez simplement les
développer à partir de là. Nous allons donc simplement travailler
avec cela pour le didacticiel. Les deux autres
problèmes évidents sont, eh bien, le premier est nous avons quatre copies
du personnage qui
apparaissent à l'écran en même temps. Nous voulons donc faire en
sorte qu'un seul apparaisse. Pour ce faire, nous allons dans l'onglet Animation ici, et nous changeons les
images H en fonction du nombre de sprites qui apparaissent dans
cette feuille de sprites horizontale Je change donc simplement les images
H en quatre. Et maintenant, il ne montre que
la position zéro de l'image, qui est le premier sprite
de cette animation inactive Le troisième problème est que c'est très flou
pour le pixel art. Nous pouvons donc résoudre ce problème dans ensemble de
notre projet en accédant aux paramètres du projet, et nous voulons faire défiler la page vers le bas jusqu'à ce que
je pense que c'est un moteur de rendu Non, des textures. Donc,
le rendu puis le filtre de texture
par défaut
de texture linéaire sont plus appropriés
si vous faites, je suppose, des choses comme l'art vectoriel. Mais pour le pixel art, qui
doit être Pixel Perfect, vous devez le modifier
au plus près. Et dès que vous l'aurez
fait,
chaque pixel sera affiché avec netteté , comme on peut s'y attendre dans un jeu
de pixel art. Et pour ce
qui est du projet, c'est tout ce que vous aurez
à faire pour le
configurer spécifiquement pour
un format de pixel art. Maintenant, le personnage et la forme de collision sont un
peu bizarres ici en ce moment. En général, pour les jeux de haut en bas, vous voulez que la forme de collision se trouve quelque part autour
des pieds du personnage. J'aime donc garder
mes scènes toujours centrées sur 00 afin connaître en gros la position
exacte à laquelle le personnage est
représenté dans le monde du jeu
et le décalage ne serait pas
étrange ou quoi que ce soit d'autre. Donc, ce que nous
voulons réellement faire ici c'est décaler et non la scène de base. Nous voulons le maintenir à zéro,
zéro, sauf le nœud sprite Donc, si vous sélectionnez les deux D du Sprite et que vous
appuyez sur W pour passer en mode déplacement,
vous pouvez cliquer avec le bouton gauche de la souris, le
maintenir enfoncé et le faire glisser vers le haut Si vous voulez l'accrocher à l'axe Y, vous
pouvez maintenir la touche Shift enfoncée, ce qui vous permet de l'empêcher d'aller vers la gauche,
sauf si vous allez très loin. Et nous voulons simplement le
faire glisser jusqu'à ce que les pieds du personnage soient exactement là. Ensuite, nous voulons que la forme de collision
soit une représentation de la zone des pieds du personnage,
car c'est là le personnage serait autorisé à entrer en collision avec d'autres objets Il est donc logique
que la position soit celle où se trouvent réellement
les
personnages dans le monde du jeu en
deux D. Hum, pour s'habituer à
la perspective des deux D, il faut un peu de temps pour s'y habituer parce que c'est un peu moins évident, je suppose, que du trois D, où cela
ressemblerait plus à la vraie vie. Ici, nous devons simplement donner l'illusion que nos personnages se tiennent
réellement là, même s'ils
vont d'un endroit à un autre, c'est dans
cette zone que
le personnage se trouve réellement Nous pouvons donc enregistrer cela ici. Ça devrait être une bonne chose. Juste pour référence, c'était 4,12 pixels. En fait, je vais
simplement arrondir ce chiffre à quatre, juste une petite
préférence pour essayer de tout garder
à des tailles parfaites au
pixel près. Pour un jeu artistique Pix, ce
ne sera probablement pas un gros problème
et cela ne posera aucun problème, mais, vous savez, juste au cas où Maintenant, si nous revenons
à notre scène mondiale, nous verrons que notre personnage se trouve réellement
dans le monde du jeu. Et si nous voulons
jouer au monde entier, nous devons appuyer sur ce
bouton de lecture ici,
qui permet de jouer la
scène mondiale actuelle. Et nous pourrons
voir le personnage très, très petit dans le coin supérieur
gauche. C'est en fait presque
impossible de le voir. Donc, la prochaine chose que nous
voulons probablement est d'ajouter une caméra. Donc, faisons un clic droit sur le
monde, ajoutons un nœud enfant, faisons une caméra deux D. Et même si le monde
crée automatiquement une caméra par défaut, même si vous n'avez pas
ajouté de nœud de caméra, lorsque vous
définissez correctement une caméra, vous
pouvez régler le zoom, ce qui est très pratique pour Pixart car nous
parlons de travailler avec caractères de
48 pixels sur 32 pixels, quelque chose
comme ça. Nous voulons donc prendre le zoom
et probablement augmenter jusqu'à environ trois ou quatre,
nous pouvons voir la caméra Deux D sont maintenant également centrés
sur le point zéro
plutôt que d'être en quelque sorte
cette boîte de toile par défaut ici Nous pouvons effectivement voir que la
caméra est cette ligne rose. Et si nous lançons la scène maintenant, notre personnage devrait être centré beaucoup plus grand
et plus visible. Donc, si vous le souhaitez, vous
pouvez augmenter ce chiffre à quatre. Je pense que trois c'est
plutôt bien pour le moment. Je le modifierai plus tard
s'il le faut. Mais tant que tu peux voir le personnage, je
pense que tu es bon. Autre chose, lorsque
nous jouons au jeu, je pense que je veux que cela
soit beaucoup plus visible. Augmentons donc la taille de la
fenêtre maintenant afin pouvoir mieux concevoir pour un écran
plus
grand afin que, vous savez, lorsque nous
faisons nos aperçus, vous puissiez réellement mieux voir
ce qui se passe Passons donc aux paramètres du projet, et je vais prendre
l'affichage de la fenêtre et le remplacer par
quelque chose de beaucoup plus grand. Je pense donc que quelque chose comme
1980 par 180 serait une bonne chose. Je veux dire, cela dépend la résolution de
votre écran. Pour moi, ça va
être un peu comme ça. OK, je vais essayer
depuis mon écran. Je travaille ici sur un écran
extra blanc assez gros, donc un petit
essai sur erreur. Je pense que ça marchera bien,
car alors je peux toujours voir le bouton « Uh Of » ici. Donc, jouez à la scène principale, faites une pause et arrêtez les boutons
du projet en cours d'exécution, d'ailleurs. Je dirais que
tant que vous pouvez le voir , tout ira bien. Donc, avec notre jeu Canvas, cette taille, j'ai probablement aussi
envie de booster le Zoom. Vous pouvez réellement modifier les propriétés pendant que
les jeux sont en cours d'exécution. Je peux donc simplement prendre ce
zoom et le changer à quatre. Revenons,
et vous verrez que la taille a été immédiatement mise à jour. Donc, si c'est assez grand pour vous, vous pouvez le garder ou
nous pouvons en augmenter jusqu'à cinq. Vous savez, peut-être que je vais vraiment y
faire un zoom 5.0. Pour le moment, vous l'
attendiez vraiment. Passons au code proprement dit. Nous devons donc créer
un script qui étend le corps du personnage en deux D et l'
attache au joueur. Nous pouvons faire tout cela en une seule fois en
cliquant sur le bouton
gauche du joueur, puis en
cliquant simplement sur le bouton attacher un script nouveau ou existant
au nœud sélectionné. Et nous allons simplement l'appeler le script player point gd Et en fait, nous
n'allons pas utiliser le modèle de script de mouvement de base en
deux D. Enfin, si je me souviens bien, pour les joueurs de plateforme, parce que cela
ajoute du saut d'obstacles et, honnêtement, nous pouvons l'écrire beaucoup Alors, appuyons sur Créer, et cela nous
permettra d'accéder à l'éditeur de script ici. Donc pour le moment,
je vais simplement
le garder comme éditeur de script intégré. Mais vous pouvez également cliquer sur ce bouton ici et le
faire flotter si vous voulez passer en plein écran avec
l'éditeur de script, ce qui peut être pratique si vous vous lancez vraiment dans le codage
GD Script Mais ici, ce
script va
être assez rapide et simple,
donc pas vraiment nécessaire. Alors montons au sommet. D'accord, nous pouvons donc voir que notre script étend le corps de
caractère deux D. Cela signifie
que notre script possède la classe de base du corps de
personnage deux D. D'accord, donc si nous survolons le
corps de personnage deux D, vous pouvez voir la hiérarchie des classes ici descendre du corps de
personnage deux D jusqu'à un objet Gadot de
base Cela signifie simplement que
tout au long du processus, il héritera des capacités de chacune de ces
différentes classes Un corps de personnage TD peut
donc faire beaucoup de choses. Nous n'en aurons vraiment besoin que d'un tout
petit peu. Gardez donc à l'esprit que
tout ce qui y est indiqué,
chacune de ces classes, laquelle vous pouvez accéder
en cliquant sur leur nom si vous
voulez en savoir plus à
leur sujet , est quelque chose
que le corps de personnage deux D peut également faire. Donc, lire tout
cela représenterait beaucoup de documentation en ce moment, il
est bon de le savoir. C'est bon de lire au
fur et à mesure, mais un peu bouleversant
pour le moment. Travaillons donc sur notre classe. Nous voulons lui donner un
nom de classe afin que ce script puisse être facilement référencé
à partir d'autres scripts par son nom en allant
au début de la ligne. Puis appuyez sur
Entrée. Passons à la première ligne et saisissons le nom
de la classe player. Maintenant, nous avons défini ce
script comme étant le script du joueur. Il s'agit donc essentiellement
d'un symbole global Maintenant, dans notre projet,
nous pouvons rechercher et
utiliser simplement en faisant référence à utiliser simplement en faisant référence joueur dactylographié exactement comme
celui-ci avec une Vous verrez au fur et à mesure
que nous
avançons dans le cours que cela est extrêmement utile, en particulier pour un script de joueur , que de nombreuses autres classes devront aborder. Travaillons donc sur la
fonction du processus physique du personnage. Tapons donc FU NC pour la
fonction, puis soulignons. Et vous verrez ce
menu se remplir automatiquement avec les méthodes
définies dans
les classes parentes Ce sont essentiellement des
fonctions que nous pouvons remplacer et ajouter du code
afin qu'elles fassent réellement
quelque chose ou modifient ce que la
classe de base a fait à l'origine Nous voulons donc un processus physique ici. Si vous trouvez un
processus physique et que vous appuyez sur Entrée, cela nous donnera la définition complète de la
fonction ici Le nom ici,
souligner le processus physique OK, nous avons donc ici le
nom de notre fonction. Le trait de soulignement
indique qu'il est censé être
privé, qu'il n'est pas accessible depuis d'autres
scripts et qu'il doit uniquement être contenu ou encapsulé
à
partir de ce Le Delta ici est le
nom de notre paramètre, et le float est le type
de notre paramètre. Dans le script GD, vous n'êtes pas obligé de taper vos fonctions Donc, si vous le souhaitez,
vous pouvez supprimer ce virgule flottante et l'appeler
simplement Delta. Mais qu'est-ce que Delta ? Eh bien,
cela finirait par être ce que le collier a
décidé de transmettre à cette fonction, ce
qui, dans ce
cas, rien ne empêche d'être
autre chose qu'un flotteur. On
s'attendrait à peu près à ce que ce soit un char. Dans ce cas, il est donc
préférable de déclarer son type avec
deux points, puis de flotter ici. Je le recommande donc vivement. Et puis voici également un composant
optionnel de la déclaration de fonction. Nous avons cette flèche, qui est
un tiret à côté de la touche zéro. OK, et puis
ici sur la droite, nous avons la
flèche de retour pointant
vers le type de retour d'un vide. Le néant signifie qu'il n'y a aucun retour. Vous ne vous attendez pas
à ce qu'il renvoie réellement quoi que ce soit que vous utiliseriez
dans d'autres fonctions. Donc, pour le saisir manuellement, vous devez faire un trait d'union,
puis une note et un signe Il s'agit de votre flèche de retour
pointant vers le type de retour. OK, donc, bien sûr,
lorsque nous tapons ceci, notre fonction ne
contient vraiment rien dedans. Vous pouvez faire en sorte qu'une
fonction ne fasse rien en
tapant pass en minuscules, il s'agit
donc d'un
mot clé réservé. Mais sans cela,
si j'annule cela, vous verrez cette erreur
apparaître en bas,
indiquant le bloc de fin attendu
après la déclaration de la fonction, ce qui signifie qu'il
devrait y avoir quelque chose ici après la déclaration de la
fonction Et vous pouvez développer
cette liste ici pour voir toutes les erreurs contenues dans
votre script actuel, une
petite fenêtre très pratique. Donc, si vous avez
besoin de copier-coller, vous pouvez simplement
tout sélectionner et copier. Et vous pouvez le coller dans n' importe quelle autre application que
vous utilisez. Peut-être que vous
signalez un bogue ou quelque chose comme ça. OK, donc enfin,
nous pouvons réellement commencer à écrire un code de
fonction. Je sais que je vais un peu lentement, essayant de rester
accessible ici,
surtout dans les vidéos
précédentes, cela deviendra certainement beaucoup plus
intense au fil du cours. Donc, tout d'abord, pour
notre processus physique, nous voulons que le personnage se déplace, ce qui signifie que nous avons besoin
d'
une vitesse et d'une direction dans laquelle le personnage va
se déplacer. Donc, quelque part, nous devons déclarer à quelle vitesse notre personnage se déplace. Nous pourrions donc
le déclarer directement dans la fonction. Mais en fait, ce que je veux
faire pour le moment, c'est créer une
variable d'exportation dans laquelle nous pouvons modifier la vitesse
dans l'éditeur très facilement en allant simplement ici à droite, puis en tapant
la vitesse
que nous voulons. Et nous pouvons également changer cela
pendant le jeu. Tapons donc à la vitesse
Export var et donnons-lui le type de float. Commençons donc par le
faire lentement. Dans Export, il y a un
mot clé qui indique qu'
il peut être
modifié dans l'inspecteur. OK, et puis var signifie
ici variable. La vitesse est le nom
de la variable. Ici, deux points définit le type, puis float est le type. Nous pouvons donc prendre cette vitesse. En fait,
écrivons « pass » ici pour le processus
physique, puis
appuyons sur Control as pour l'enregistrer. Et vous verrez apparaître la vitesse
ici et en haut à droite
pour le script du joueur Assurez-vous que
le nœud du joueur sélectionné, et vous
pourrez le voir. Maintenant, vous pouvez également voir que
la valeur par défaut est 0.0. C'est donc la
valeur par défaut pour float. Pour des raisons de rapidité,
vous voulez probablement attribuer
un vrai chiffre à cela. Je vais donc prendre
ceci et dire égal, allons-y avec 100,0 en appuyant
sur Ctrl S. Maintenant la valeur par défaut se charge
automatiquement ici car nous
n'avons pas défini de valeur personnalisée Si vous définissez une
valeur personnalisée en cliquant ici, disons 150 et appuyez sur Entrée
, la vitesse est de 150. Si nous changeons la valeur par défaut à 200 ici et que nous appuyons sur Enregistrer
dans le script, vous verrez que
la valeur personnalisée remplace
toujours la valeur
par défaut de 200 Je peux appuyer sur le bouton de réinitialisation ici pour le réinitialiser à la
valeur par défaut, donc maintenant c'est 200. Maintenant, je veux que la
vitesse du script soit de 100. Je crois que c'est ce que j'avais
pour le projet par défaut. Nous pouvons toujours changer
cela plus tard et n'hésitez pas à régler vitesse de
vos joueurs vous le souhaitez.
C'est tout à fait. Et c'est ainsi que nous pouvons utiliser la propriété
définie par
notre éditeur dans le script. Les variables d'exportation sont donc très utiles pour permettre de modifier les détails de la
manière dont notre script
modifierait sans avoir
à connaître le fonctionnement réel
du code. OK, nous avons donc notre vitesse. Nous pouvons maintenant écrire
un processus physique. OK, alors voyons voir
ça. Je vais d' abord obtenir la direction d'entrée. OK, donc pour le
moment, nous voulons
déclarer une
variable de direction, donc var direction. Et vous verrez que je suis de
taper ceci dans la fonction. Cela en fait donc une
variable locale de la fonction,
ce qui signifie que dès que les fonctions seront
terminées, elle ce qui signifie que dès que les fonctions sera effacée. Il n'est utilisé qu'à l'intérieur
de la fonction, sauf si nous le renvoyons comme type de retour. C'est donc temporaire, en gros. Et nous allons le définir comme
égal à l'entrée. Maintenant, je sais que je mets
le I en majuscule parce que c'est un nom de classe
auquel nous faisons référence La classe d'entrée
est donc que vous pourriez la
considérer comme une classe globale. Vous pouvez y accéder n'importe où si vous avez besoin qu'il
fasse quelque chose pour vous. Et nous allons utiliser
la classe Import
pour obtenir un vecteur. Un vecteur aura donc une composante X et une composante Y, plutôt
un vecteur deux. Il existe également le vecteur
3 pour les jeux en trois D, qui ajoute l'axe Z. Mais pour les jeux en deux D, vous n'avez qu'un X et un Y,
ce qui, en supprimant simplement
ce troisième axe, rend jeux en
deux D un peu plus simples à
comprendre et à utiliser. Nous voulons donc obtenir
le X négatif ici. Vous pouvez voir les paramètres définis cette fonction, et il y en a en fait d'
autres ici , comme la zone morte,
dont nous n'avons pas besoin. Mais les quatre dont nous avons besoin
sont un X négatif, X
positif, un
Y négatif et un Y positif. Donc, dans l'une des deux vidéos
précédentes, je crois en avoir parlé, mais un X négatif et Gadot
reste à l'écran Nous voulons donc une entrée pour la gauche. Vous pouvez maintenant le voir se
remplir avec
des noms de chaînes
d'action prédéfinis Vous savez, c'est un
nom de chaîne, d'ailleurs, parce qu'il y a une esperluette
devant la chaîne,
qui est entre guillemets,
puis le nom
réel ici, qui se termine par Mais ce sont toutes des actions d'interface utilisateur
par défaut, et ce n'est pas une bonne idée
de les utiliser réellement. Dans le sens de contrôler
votre personnage,
car il contrôle déjà l'interface
utilisateur par défaut. Passons donc aux paramètres
du projet. Projetez donc
les paramètres du projet en haut à gauche, Input map, et nous
saisissons une nouvelle action. Je vais taper à
gauche, puis cliquer sur Ajouter. Donc, notre action de gauche, je vais appuyer sur Ajouter un événement ici, et j'aime utiliser les touches WASD C'est assez standard
pour de nombreux jeux. Je vais donc
simplement taper A ici où il est dit d'écouter
les entrées et une règle. Attribuez-le automatiquement à la clé A, physique ou Unicode. Donc, en gros, A
sur votre clavier. Vous pouvez cliquer sur OK maintenant. Et maintenant, le déplacement vers la gauche
est assigné à A. Et nous voulons faire de même pour le
haut, le bas et la droite. Tapez donc à droite, ajoutez, puis nous cliquons
ici pour attribuer la clé, ajouter un événement, appuyer sur D pour droite. Appuyez sur OK. Maintenant, allons-y. Cliquez sur Ajouter un événement, appuyez sur W pour le haut, ajouter une action, vers le bas, sur Ajouter un événement, S pour le bas, et voici notre saisie de mouvement. Kidob se chargera donc automatiquement convertir
ces touches en action réelle
que nous pouvons utiliser
dans la colonne de fonctions vectorielles de la classe d'entrée
G. Donc, ce que nous voulons faire ici, c'est mettre les noms des
actions que nous venons de taper Nous pouvons donc faire
un devis laissé ici. Et vous verrez qu'il se remplit
automatiquement, et vous pouvez simplement appuyer sur Entrée
ici pour le confirmer pour X
négatif pour
X positif, nous voulons juste Vous pouvez également voir ici
qu'il apparaît en quelque sorte, nous pouvons
donc simplement double-cliquer dessus. Puis le troisième négatif Y, on peut le taper ou
le trouver dans la liste. Tellement bas. Et puis pour un Y positif, oh, j'ai en fait confondu tout. Y négatif est en hausse, Y
positif est en baisse. Je vais donc ajouter un Y
positif ici, puis ici, je vais simplement effacer
le bas et le taper vers le haut. Je suis donc presque sûr
que c'est juste là. Nous le saurons certainement dans
une minute une fois que nous aurons joué au test. Nous voulons prendre la direction
d'entrée, et si elle n'est pas nulle
, nous voulons nous déplacer. Donc, s'il est égal à zéro, nous
voulons simplement arrêter complètement de déplacer notre
personnage. Vous pouvez donc le faire en
disant if direction. Cela vérifie donc
déjà si la direction est égale
au vecteur zéro ou non. Donc, si la direction
signifie qu'elle n'est pas nulle, alors nous pouvons prendre la
vélocité de notre personnage. Maintenant, où avons-nous obtenu
la propriété de vélocité ? Eh bien, notre classique contient le corps du
personnage deux D, et la vélocité est une propriété du corps
du personnage
deux D. Donc, si je devais cliquer avec le bouton
droit sur le corps du personnage deux D et aller sur le symbole de recherche, pourrais faire défiler la page vers le bas
et voir la vélocité je
pourrais faire défiler la page vers le bas
et voir la vélocité
apparaître ici même
dans la liste des propriétés Ainsi, toutes les propriétés ou méthodes, qui sont des fonctions au sein
d'une classe appartenant à une classe parent, seront héritées et utilisables par
cette classe héritante Ainsi, à l'intérieur d'un joueur, nous pouvons prendre la vélocité
et la régler comme nous
voulons que la direction soit
multipliée par la vitesse. Vous allez maintenant voir ce composant
Delta ici. Il s'agit de l'intervalle entre les images. Nous n'avons pas besoin de l'
attribuer ici au
style de mouvement particulier que nous utilisons
, à savoir déplacer et glisser. Il y en a une autre qui
bouge et entre en collision, où vous passez et
le Delta lorsque vous appelez cette fonction, si je
me souviens bien. Il est donc un peu
étrange que, vous savez, le Delta soit automatiquement
pris en compte ici, mais c'est ainsi que cela fonctionne. Ainsi, toute pression sur une touche pour
le mouvement est appuyée. Nous allons
attribuer la vélocité à la direction
multipliée par la vitesse. Ensuite, ici bas,
nous pouvons nous déplacer et glisser. Maintenant, que
se passerait-il en ce moment ? En fait, ce serait
plus simple de le montrer. Appuyons sur Play, et nous n'avons pas encore
sélectionné de scène principale. Choisissons donc la
scène mondiale comme scène principale. Je vais juste parcourir
les annuaires ici
et choisir le monde. Double-cliquez. Nous
avons un personnage. Et si j'appuie sur une
touche de déplacement et que je la
relâche, vous verrez que cela n'
arrête pas notre personnage. Il continuera à glisser, ce qui pourrait être utilisé pour une
sorte de mécanicien d'éclairage. Mais pour des mouvements réguliers, nous voulons en fait ajouter une instruction se ici pour faire suite à notre I. Donc, utilisez et assurez-vous de
mettre les deux points à la fin. Cela déclare donc essentiellement
ce qui suit sous forme de bloc permettant à la fonction de
continuer à exécuter le code. Et nous voulons
prendre de la vélocité. Nous voulons réduire
cela à l'égard de Serrel. La vélocité est égale au vecteur deux. Nous sommes donc en train de créer
un nouveau vecteur deux ici, et nous y mettons des parenthèses Vous pouvez voir que
le troisième type de
construction d' un vecteur
prend une valeur X et une valeur Y. Donc,
entre parenthèses, appuyez sur Entrée. Cela va donc séparer la première parenthèse de
la seconde et
indiquer très clairement la logique X ici, puis la
logique Y juste en dessous Nous voulons donc nous déplacer vers
le point de vitesse x à zéro. Et nous allons simplement le faire
à la vitesse actuelle. Cela signifie donc
que dès que nous lâchons prise, nous réduisons immédiatement la vitesse
à zéro. Il existe de nombreuses
façons de le faire. Vous pouvez le faire diminuer
progressivement au fil du temps si vous utilisez une fonction larp Mais c'est probablement la solution la plus simple.
Nous allons donc nous contenter de ça. Déplacez-vous vers. Ensuite, sur
la deuxième ligne, nous voulons obtenir la valeur Y
pour la nouvelle vélocité. Déplacez-vous donc vers le point de vitesse
actuel Y, nous le faisons approcher de zéro
au changement ou au delta de vitesse. Nous l'enregistrons donc ici,
ce qui signifie que cela va
prendre notre vitesse actuelle, qui peut être, disons, vers la droite à pleine vitesse, et nous allons la réduire
de la vitesse maximale, ce qui signifie qu'elle
va immédiatement descendre
à zéro. Nous approchons de zéro. Ainsi, dès que nous
relâchons nos touches de saisie, notre personnage cesse de bouger, c'est le résultat final de.
En fait, comptez ça. Donc, pour déclarer un commentaire,
si vous voulez le faire, vous mettez une balise de hachage
puis la description Vous pouvez donc conserver vos commentaires en ligne si vous le souhaitez, en général De nos jours, je les place en haut de
la fonction comme ça, donc Control X puis
Control V pour les coller. Et si vous souhaitez que ce
texte apparaisse dans la
documentation générée automatiquement pour votre classe, vous pouvez utiliser deux esperluettes Et enregistrez-le, puis
cela l'
ajoutera à documentation de la
classe de joueur. Et nous pouvons accéder à
cette documentation en cliquant sur l'aide à la recherche ici. Nous recherchons un joueur, notre classe personnalisée, puis cliquons sur Ouvrir, et vous pouvez voir le
nom de nos propriétés, qui dans ce cas fait simplement
référence à une variable qui existe dans le cadre de
la classe locale. Dans ce cas, nous pourrions
simplement parler d' une variable qui est un état local existant à l'intérieur de la classe plutôt que d'une
variable locale d'une fonction. Vous pouvez donc les modifier et
les lire selon vos besoins. Dans d'autres langages de programmation, des éléments tels que les champs ou les
propriétés sont définis beaucoup
plus clairement. Mais je pense qu'en général, pour la plupart des fonctions de
base du script GD, votre propriété et votre variable
finissent par être identiques. Vous ne déclareriez pas
quelque chose comme un champ privé secondaire
comme vous le feriez dans C Sharp. je dirais que dans la plupart des cas, Mais je dirais que dans la plupart des cas, parce que, vous savez, il y aurait toujours
des raisons de le faire d'avoir un soutien privé
pour votre propriété publique. Ici, vous pouvez voir la méthode ici et si nous faisons défiler
les descriptions des méthodes vers le bas. Donc un processus physique. Dès que nous relâchons
nos touches de mouvement, notre personnage cesse de bouger. C'est donc en fait l'une des choses
les plus intéressantes à propos du script
GD, c'est qu'il génère essentiellement de l'
auto-documentation Tant que vous placez les commentaires là où ils sont censés aller
avec les doubles esperluettes, vous pouvez commenter un
champ ou une propriété Vous pouvez commenter une méthode. Et c'est vraiment utile. Cela permet à
d'autres personnes de comprendre
facilement votre code sans lire l'intégralité du script
de haut en bas. Vous pourriez donc faire la
même chose rapidement ici. Donc deux esperluettes et
dites le mouvement de base,
la base, la vitesse de
déplacement de base, du personnage du joueur Contrôlez S save,
puis vous pouvez voir notre documentation
est toujours ouverte ici dans la fenêtre du script. Donc, si je clique sur Player,
vous pouvez voir, oh, maintenant, que notre propriété de vitesse a une description qui
peut être facilement lue. C'est donc très pratique. Gardez cela à l'esprit. Et maintenant, nous
pouvons continuer et appuyer sur Play. Nous allons donc déplacer
notre personnage WASD. Nous allons maintenant voir que
dès que nous arrêtons l'importation, le personnage cesse de bouger. C'est ce à quoi on peut
s'attendre de la part d'un personnage qui se déplace sur quelque chose de normal, comme de
l'herbe, de la pierre ou autre, objets qui doivent être soumis à de la
friction et non à de la glace. Et c'est le mouvement de base nous utiliserons pour le reste
du jeu, en gros. Maintenant, évidemment, les
personnages ne sont pas animés. Nous n'avons pas les animations de
course. Il ne fait pas encore face à la
direction qu'il devrait prendre. Ce sont tous des sujets que
nous aborderons
dans de futures vidéos à l'avenir. Une dernière chose que je voudrais ajouter à une dernière chose que je veux
ajouter à ce personnage,
eh bien, nous sommes
en avance sur les choses, c'est d'ajouter une seule propriété de nom
d'affichage supplémentaire. Je vais donc ajouter une exportation pour
une variable,
un nom d'affichage. Et ce
sera un nom de chaîne de caractères. Et nous allons le
mettre égal à
esperluette, quelle que soit la
valeur par défaut que vous souhaitez, vous pouvez simplement le rendre
joueur et appuyer sur les commandes Donc, pour notre joueur, nous pouvons voir que la propriété du
nom de la chaîne de nom d'affichage est modifiable dans
l'inspecteur Je vais donc changer
cela et le définir sur Jaco, car par défaut,
notre personnage va avoir une arme de lance Je pense donc que cela fonctionne. Dans les jeux Survivor Light ,
vous pouvez
généralement sélectionner
plusieurs personnages. Il est donc logique qu'ils aient tous un
nom d'affichage distinct. Maintenant, très rapidement, il existe
également une propriété de nom que possèdent
tous les nœuds. Cela fait référence au nom du
nœud ci-dessus. Mais vous pouvez voir des choses comme la
collision en forme de deux D. Vous ne portez pas les espaces
et les noms de nœuds. Donc, l'utiliser comme
nom d'affichage peut être un peu étrange. Supposons que
vous ajoutiez une sous-classe comme Fire Dragoon
5. Lire des animations à partir de feuilles de sprites: Dans l'état actuel des choses, notre personnage peut
techniquement bouger, mais le sprite n'a aucune animation Nous voulons donc que notre personnage s' anime lorsqu'il dirige des idoles et, bien
sûr, qu'il anime
aussi l'animation de la mort lorsque nous perdons la partie OK, donc la première chose que
nous allons faire est changer
la feuille de sprites ici Si vous regardez le pack
Pixel Crawler, nous pouvons vous procurer le sprite Idol pour
la nuit, ou vous pouvez utiliser le voleur ou
le magicien si vous préférez Je vais donc prendre ça et l'
apporter ici. Et ce sont essentiellement des sprites orientés vers le
côté. Vous remarquerez que
ce personnage n'a ni haut ni bas. Il y a cependant quelques avantages
à cela. Tout d'abord, si vous
n'animez qu'
une seule direction
puis que vous la renversez, c' est
ce que fait le
survivant standard Il est beaucoup plus facile
de créer des personnages car il suffit d'
animer une seule direction Ensuite, vous pouvez
complètement ignorer arbres
d'animation et vous concentrer uniquement
sur un lecteur d'animation et une machine à états qui
contrôlent la logique selon laquelle
votre personnage passe d'un état à l'autre
, comme
Idle. Pour états qui
contrôlent la logique selon laquelle
votre personnage passe d'un état à l'autre
, comme ces raisons, nous
allons simplement passer à la feuille de
sprites Night Idol ici Vous pourriez utiliser l'idole de manière
pratiquement interchangeable. Plus tard, tu pourrais utiliser
la feuille de sprite Rogue, comme ici, ou celle du
Magicien ici aussi Donc, l'une ou l'autre
de ces options fonctionnera parfaitement, et il existe déjà
la configuration
nécessaire pour avoir trois
classes de personnages. Mais
pour
commencer, il fallait plutôt un chevalier
armé d'une lance . Donc, comme un personnage
s'appelle Agroun, ce spright lui convient parfaitement, et
il sera capable
de lancer OK, nous avons donc notre ensemble de feuilles de
sprites ici. Nous voulons
en faire une animation inactive. Les images He ont
déjà été installées ici, mais nous avons besoin d'un véritable lecteur
d'animation pour le faire. Cliquez donc avec le bouton droit sur le
nœud joueur, ajoutez un nœud enfant. Recherchez un
lecteur d'animation. Ajoutez ça. Ainsi, lorsque vous aurez le lecteur
d'animation, la fenêtre d'animation
sera ici en bas. Vous pouvez cliquer ici
si vous en avez toujours besoin. Et nous voulons passer
à l'animation
, puis à Nu et taper le
nom de l'animation. Nous commençons donc par
l'animation inactive, nous allons
donc simplement taper Idle. Et nous pouvons ajouter
une piste de propriété. Nous allons donc extraire du Sprite two D certaines de ces propriétés, à savoir la texture.
Alors double-cliquez dessus. Nous allons
cliquer avec le bouton droit sur Property Track, ajouter des cadres H, puis Property
Track, Sprite deux cadres en D. V. Enfin, pour le moment, nous avons au moins
besoin du numéro de cadre lui-même. Ajoutez donc et encadrez en tant que propriété. Nous pouvons donc maintenant prendre ce zoom et zoomer un peu sur
notre feuille de sprites abord, je voudrais prendre le temps de capture ici, où il est indiqué 0,033 3 secondes,
et le remplacer par 0,1, ce qui signifie que nous
allons travailler à intervalles de
0,1 seconde ou
d'un dixième de Activez ensuite ce curseur de capture sur
la chronologie. Maintenant, vous pouvez
simplement cliquer
ici pour accéder aux intervalles de 0,1
seconde, ce qui
facilitera grandement le travail. Vous avez peut-être vu
sur cette feuille lumineuse qu'il y a quatre
images d'animation. Nous allons donc les parcourir toutes
les 0,1 seconde, ce qui signifie quatre fois 0,1, nous voulons une animation de 0,4 seconde
. Donc, ici sur le côté droit, tapez 0.4,
puis ce truc qui
ressemble à des flèches qui s' alimentent les unes
dans les autres. Animation en boucle,
vous devez cliquer dessus
pour faire tourner
notre animation en boucle Maintenant, dans notre chronologie d'animation, il n'y a aucune image-clé. Nous voulons
absolument définir une image-clé au début de l'animation pour toutes ces
propriétés Cliquez donc avec le bouton droit sur Insérer la clé. Si vous cliquez ici avec le bouton gauche de la souris,
vous verrez que la valeur la texture est déjà prédéfinie pour cette animation nocturne
inactive. Si ce n'est pas le cas,
vous devez le remplacer la feuille de sprites
Idle À partir de là, vous pouvez glisser-déposer comme ça et le mettre là. Donc, cette image-clé signifie
qu'au début de notre animation, à 0,0 seconde, lorsque cette
animation commence à jouer, la texture de notre sprite sera définie sur cette valeur, ce qui signifie que
dès le début de l'animation, nous modifierons la feuille de sprites Maintenant, les cadres H, nous voulons également cliquer avec le bouton droit
de la souris et appuyer sur la touche Serta. Maintenant, nous avons déjà prédéfini
notre valeur ici comme quatre dans ces deux brillants D.
Vous pouvez donc voir que
lorsque vous appuyez sur la touche Serta, elle ajoute la valeur
actuellement définie comme point
d'image clé
sur la chronologie de l'animation Et chaque fois que ces
images-clés sont touchées, cela signifie
que la valeur
à ce moment-là est cette valeur Maintenant, pour notre jeu artistique Pix, nous allons
presque toujours
utiliser le mode discret
ici à l'extrême droite Vous pouvez voir ces trois points. Cela signifie
que la valeur ne change
pas tant qu'elle n'atteint pas
le point clé de l'image. Dans un jeu qui
ressemble plus à un jeu en trois D, vous pouvez créer une animation
continue, est-à-dire qu'elle
passera progressivement d'une
valeur à l'autre par image-clé Donc, si vous aviez quelque chose
comme une image-clé de position, elle animera
la position
entre la position de départ de zéro et la
position finale de 100 au fil du
temps au fur et à mesure de
la progression de cette
chronologie d'animation Ainsi, une grande partie de l'animation dans les jeux
consiste simplement à modifier les valeurs des propriétés de
votre objet au fil du temps. OK, donc en passant aux images en V, nous pouvons cliquer avec le bouton droit sur insérer une clé. Vous verrez que la valeur ici, si nous cliquons avec le bouton gauche de la souris
sur l'image-clé, est déjà définie sur un.
C'est ce que nous voulons. Encore une fois, si nous examinons
la feuille de sprites Idol, elle comporte quatre cadres en H, cadres
horizontaux et un cadre vertical en
termes de lignes et de colonnes C'est pourquoi nous en avons quatre pour les cadres en
H et un pour les cadres en V. Nous n'
avons pas beaucoup de personnalisation à faire ici. Nous devons simplement nous
assurer qu'au début, il est réglé sur ces valeurs afin que notre animation
fonctionne correctement. Maintenant, ce que nous
devons réellement faire, c'est placer nos quatre images
d'animation ici. Cliquez donc avec le bouton droit sur le premier
cadre et appuyez sur la touche Insérer. Vous verrez que pour le frame, il vous montre
en fait un
aperçu du sprite Cela va s'avérer très utile, mais vous pouvez également cliquer dessus avec le bouton
gauche et voir que la valeur est fixée
à zéro. Nous voulons maintenant passer à 0,1. Si vous n'avez pas encore choisi appliquer la capture au
curseur de la chronologie, vous pouvez le faire ici Il sera ainsi beaucoup
plus facile de passer à 0,1. Je suppose que vous pouvez également saisir
manuellement la valeur si vous souhaitez
accéder à la chronologie. Mais d'habitude, je clique simplement avec
le curseur de la souris. Cliquez ensuite avec le bouton droit sur
la section du cadre, la ligne du cadre et insérez la touche. Vous allez maintenant obtenir une ligne
qui les sépare. Cette ligne signifie qu'il
n'y a aucun changement de valeur
entre ici et ici. C'est juste une continuation
de la même valeur. Nous voulons donc cliquer ici
et le remplacer par un, ce qui signifie que la deuxième
image de l'animation va
maintenant être jouée. Comme la feuille Bright
ressemble à un tableau de valeurs, elle commence à zéro et non à un. En général, en programmation,
c'est ainsi que cela fonctionne. Donc, un est en fait la deuxième
image de l'animation et zéro est en fait la
première image de l'animation. Cliquez avec le bouton droit sur
0,2, insérez une clé,
cliquez sur le point du cadre clé,
puis changeons cliquez sur le point du cadre clé, la valeur en deux, puis passons ici à 0,3. Cliquez avec le bouton droit sur Insérer la clé. Cliquez ici, remplacez-le par trois. Maintenant, vous ne devriez plus voir aucune ligne passer entre
ces cadres. Nous pouvons aller au début ici, appuyer sur Play, et voici notre
animation pour le personnage. Maintenant, encore une fois, comme
nous ne
faisons que de l'animation à gauche et à droite, nous n'aurons
besoin que d'une animation sur une idole, une animation sur la mort et une animation de
course ici. Ensuite, nous
contrôlerons le retournement
du personnage d'une
manière différente . Je te le
montrerai plus tard. Donc, une configuration beaucoup plus simple et beaucoup plus facile d'ajouter de nouveaux personnages si vous le
souhaitez. Dupliquons donc cette animation, car nous
allons en réutiliser une grande partie . Nous allons peut-être
changer la valeur du cadre
He et la texture. Et en fonction du nombre d'images d'
exécution,
nous pouvons également modifier les
images ici. Mais dupliquons-le en
cliquant ici sur l'animation, dupliquons,
puis exécutons. OK, maintenant nous voulons
cliquer sur la texture, et nous voulons faire glisser la
feuille de sprite run et aller ici Nous pouvons voir qu'il y a six
images d'animation. Cela signifie donc
que nous devons changer la valeur des images H ici à six. Nous voulons modifier la durée de l'
animation à 0,6 car nous travaillons actuellement sur
six images, et non sur quatre. Ensuite, nous allons
vouloir passer à 0,4 seconde et ajouter la
cinquième image d'animation. Alors insérez la clé, cliquez ici, changez la valeur en quatre pour la cinquième image
, puis passez à 0,5 seconde. Cliquez ici avec le bouton droit de la souris,
insérez la touche, cliquez sur l'image-clé, modifiez
la valeur 4-5 et appuyez sur Play Et voici notre animation ronde. La duplication permet donc de gagner
beaucoup de temps. OK, maintenant ajoutons l'
animation de la mort pendant que nous sommes sur la bonne voie. Donc, dupliquons
et ajoutons la mort. Ensuite, nous voulons
changer la texture ici, bien
sûr, pour la feuille de décès de la
nuit. Faites donc glisser et déposez la feuille de décès dans l'inspecteur d'images-clés Je peux compter ici. Il y a
six cadres. Alors, cliquons. En fait, nous n'avons pas besoin de changer quoi que ce soit d'autre, car nous le dupliquons simplement. Nous pouvons simplement appuyer sur Play. Mais vous pouvez voir que c'est en boucle. Les personnages ne le font donc
généralement pas. Nous voulons donc désactiver la boucle en cliquant deux fois ici. Cela fera en sorte que l'
animation fasse des allers-retours en boucle. Par exemple, ça va jusqu'à la fin,
puis ça revient au début. Ce serait plus utile pour quelque chose comme
une plate-forme mobile. Nous voulons cliquer
une deuxième fois pour désactiver complètement le bouclage. Passez donc à 0.0, appuyez sur play, et l'animation devrait
s'arrêter là à la fin. Et puis, une fois l'
animation de la mort terminée, nous suffira de
faire quelque chose
comme créer une Game Over
pour notre personnage, et puis ce sera tout. OK, alors quelle animation sera
réellement diffusée
lorsque nous lancerons le jeu ? Eh bien, appuyons sur
Play et découvrons-le. OK, vous pouvez donc voir que l'animation
inactive est là, mais elle ne joue en fait
aucune animation. Euh, nous n'avons pas défini une animation sur
Autoplay au démarrage Nos animations
seront
finalement contrôlées par ce que l'
on appelle une machine à états. C'est ce que nous aborderons
plus en détail dans la prochaine vidéo. Cliquons sur
Animation player et changeons l'animation qui nous intéresse,
de la mort à la fuite. Et nous allons cliquer
ici sur ce petit bouton
Autoplay on Load. Cliquez donc sur le bouton jouer, et vous verrez maintenant
que notre personnage
bouge ou non, il jouera
l'animation de course. Notez qu'il ne change pas non plus automatiquement
les directions. Ce sera un script simple que
nous ajouterons également plus tard. Mais nous avons trois animations
sur notre personnage, et nous avons la
possibilité de
passer de l'une à l'autre en les
appelant par leur nom. Dans la vidéo suivante, nous allons
créer la machine à états avec un état de déplacement qui sera capable de basculer
entre inactif et Exécuter.
6. La machine à l'état du joueur: D'accord, notre personnage possède donc un lecteur
d'animation et peut jouer
à l'animation Run, mais nous voulons passer de l'animation
Idol à l'animation Run
selon qu'
il y a une saisie clé pour
notre personnage ou non. Contrôlons donc cela
avec une machine étatique. Donc, si vous vous en souvenez au
début du cours, nous avons ajouté Limbo AI, qui est une machine à états et système d'arbre des
comportements que vous pouvez utiliser immédiatement dans Gado.
Cela vous permet d' économiser beaucoup de travail, car vous n'avez pas à le faire manuellement Je vais m'en tenir aux
machines de l'État pendant le cours. Je pense qu'ils seront un peu plus faciles
à utiliser à
l'avenir et bien meilleurs pour des configurations
simples comme celle-ci Et pour être honnête, c'est
une configuration très simple. Faisons donc un clic droit sur le joueur situé à la
base d'un nœud enfant. Et nous allons rechercher les limbes
des mots clés. Vous verrez donc ici Limbo HSM états hiérarchiques Comme dans le nœud racine ici, la machine à états elle-même
va contrôler les états, les états limbes, et elle
va pouvoir passer
de l'un à l'autre au fur et à mesure que nous ajouterons
des transitions entre ces états Créons donc le Limbo HSM. Ensuite, je vais
cliquer avec le bouton droit de la souris ici et nous allons
ajouter notre premier état :
ajouter un nœud enfant. Nous voulons donc un état d'incertitude
et simplement le créer. La hiérarchie est donc la machine à états
racine, et
nous pouvons passer de l'un à l'autre de tous les états. Et chacun de ces états
exécutera code
différent en fonction l'état dans lequel se trouve le personnage. Pour ce cours, nous n'
aurons vraiment qu' un état de mouvement
et un état de mort. C'est très simple. Mais
c'est tout de même important parce que nous voulons savoir quand notre personnage doit
passer à l'état de mort, et quand l'état de mouvement va contrôler les animations
inactives et en mouvement. Techniquement, vous pouvez séparer Idle et passer à
leur propre état, mais ils
exécuteront essentiellement le même code, car que
le personnage soit inactif ou en mouvement
, il pourra toujours se déplacer librement Tout dépend de l' animation
qu'il
va jouer. Et je ne pense pas
que cela
justifie nécessairement un État complètement
distinct Faisons donc un
clic droit sur Limbo HSM, et je vais
y joindre un script Cela s'appellera,
disons, player underscore HSM. C'est donc la machine à états
hiérarchiques du joueur. Créons-le. Et puis, ici en haut,
nous allons, bien sûr, lui donner
le nom de la
classe, le joueur HSM manière générale, comme je vais le
montrer dans le système de fichiers ici, si nous effectuons une recherche sur HSM,
peu importe ce que vous comme nom de fichier, avez indiqué
comme nom de fichier,
vous devriez également avoir le nom de la classe ici, mais celui-ci, bien
sûr, est en
majuscules et vous sautez les espaces car il s'
agit d'un symbole de type C'est une très bonne idée de garder ce nom et le
nom du script synchronisés. Le HSM du joueur va donc nous aider
à contrôler le corps du personnage travers les états qui
existent sur le Limbo Nous voulons donc saisir
le joueur et le
définir comme agent contrôlé par
la machine d'État. OK, donc d'abord pour
notre joueur HSM, nous voulons une référence
au joueur que notre machine d'État
va gérer Faisons donc à l'export
un lecteur var de type player. Et si nous avons défini
le nom de classe pour script corporel de
notre personnage en tant que joueur, cela
devrait bien apparaître. Et vous pouvez voir chez l'inspecteur ici à droite
que c'est bel et bien apparu. Donc, si vous le souhaitez, vous pouvez cliquer sur Attribuer et
l'attribuer au joueur dès maintenant. Cela signifie donc que notre machine d'état
hiérarchique des joueurs a
désormais une référence
au joueur. Nous voulons donc nous
assurer que sur Rady, ce script va configurer la machine
à états initialisant avec
le joueur comme agent Créons donc une fonction, soulignons Rady, et le
type de retour sera nul est presque toujours pour les
fonctions prêtes, car il s'agit d'une fonction de nœud par défaut
destinée à configurer votre nœud, comme dans l'un de ces nœuds ici
sur la gauche, quelque chose qui existe dans votre scène une fois que toutes ses
propriétés ont été définies. Ainsi, la fonction ready exécute le code qui, lorsque
l'objet est prêt, effectue les
dernières étapes de configuration C'est très courant à utiliser avant que l'objet ne
commence vraiment à s'exécuter dans la scène, mais en effectuant les étapes de configuration
finales essentielles. Pendant que nous allons de l'
avant, je vais également
présenter de nouveaux concepts. Donc, tout d'abord, la déclaration
assert. Tapons donc assert. Cela signifie donc que vous passez
dans une certaine condition et que vous vous attendez à ce qu'elle soit
évaluée comme vraie. Dans ce cas, nous voulons vérifier que
le joueur a bien
été configuré dans l'inspecteur. Chaque fois que vous définissez une variable
d'exportation ici, vous dépendez essentiellement du concepteur ou de la personne qui
a
configuré le projet de jeu
pour remplir ces champs, et il est très facile et il est très facile de définir l'un d'entre eux, surtout si de
nombreux scripts utilisent ces variables
d'exportation. Ils sont très pratiques pour configurer les choses
dans l'inspecteur, mais ils sont sujets aux erreurs de l'utilisateur. Nous pouvons donc simplement affirmer que
le joueur n'est pas nul. Maintenant, vous voyez que je fais un point d'
exclamation, puis un signe égal. Le point d'exclamation signifie que vous inversez ce que vous
essayez de tester Donc, si joueur est égal à zéro, ce qui serait en fait
deux signes égaux comme ça, alors vous devez vérifier
que le joueur est nul. Mais si vous utilisez un point d'
exclamation et un signe égal, vous dites que le joueur ne l'est pas et chaque fois que vous
faites une déclaration, vous avez également la possibilité
de transmettre un message d'échec facultatif Alors, que voulez-vous qu'il
dise à celui qui exécute le script lorsque cette
condition n'est pas vraie ? Donc, dans ce cas, je
voudrais que quelque chose comme l'agent
du joueur
soit défini sur le HSM Donc une machine à états hiérarchique. Je ne fais donc que le mettre
ici en haut, en mentionnant très
clairement qu'il s'
agit d'une machine étatique hiérarchique. Donc, si jamais vous avez la moindre
question sur la raison d'être du HSM,
eh bien, c'est juste là, alors
montrons-le en action Si je lance la scène, il n'y aura
pas d'erreur
car nous avons défini le nœud du joueur comme référence
dans la
variable d'exportation d'un joueur. Mais si je désactive
le lecteur ici et que nous l'exécutons, vous recevrez un message d'erreur
immédiat Cela va dire que l'
assertion a échoué. L'agent du joueur doit
être défini sur le HSM. L'assertion
n'est donc qu'une vérification pour
s'assurer que ce que vous attendez d'
être vrai est réellement vrai. Écrire des instructions
contre une condition est donc l'idée générale des tests dans le cadre de la programmation
en général. Pour aller plus loin, vous devez écrire des tests unitaires
ou des tests d'intégration à l'aide un framework de test tel que les tests GD Unit ou
GUT Godot Cela
dépasse certainement le cadre de cette série de cours, mais c'est quelque chose à
vérifier si vous avez le temps plus tard,
car en écrivant des tests, assurez-vous que votre code
est réellement bien écrit, et cela peut être
utile à long terme. Détecter les insectes tôt.
Passons donc à autre chose. Nous n'allons utiliser que ces
petites instructions d'assertion comme celle-ci. Vous pouvez
voir comment cela fonctionne. Si la condition
échoue, nous recevons un message nous indique que, oh, avons oublié de définir quelque chose que nous
aurions dû définir. C'est donc très pratique, en fait. Assurons-nous donc
que dans Limbo HSM,
une fois de plus, nous
attribuons le joueur Ensuite, nous allons procéder à la
configuration du HSM lui-même. Je vais donc en
faire une
fonction distincte car elle
va faire plusieurs choses
différentes. Créons donc une autre
fonction ici, fonction. Et quand je dis fonction, je veux vraiment dire FU
et C, il suffit de dire. soulignement a configuré le HSM, puis les parenthèses, la flèche de virage et
le vide
comportaient un espace supplémentaire Donc, ce que nous voulons appeler sur la machine d'état, c'est initialiser, et nous devons transmettre un agent Comme je l'ai mentionné, dans ce cas, l'
agent est le joueur qui
transmet le joueur, puis nous devons
appeler le service de configuration HSM À l'intérieur de la fonction Ready. Soulignez donc la configuration HSM. OK, donc pour passer en revue cela, j'en fais une
fonction privée avec un trait de
soulignement ici, ce qui signifie que nous
ne devrions l'exécuter dans le script HSM de ce
lecteur L'initialisation effectue toute
la configuration en arrière-plan
de la machine d'état, et elle va la faire fonctionner avec le
joueur comme agent L'autre chose que nous devons
faire ici est de définir l'état initial. Alors, quel état allons-nous
exécuter en premier ? Renommons également le nœud Limbo HSM en
player HSM. J'aime aussi garder ce type de synchronisation avec le
script qui y est attaché Donc, jouez HSM ici. Egale au HSM du joueur à l'intérieur
de la fenêtre de scène. Et puis l'état Limbo ici, nous l'appellerons l'état de déplacement ,
puis nous y attacherons un
nouveau script L'avantage
est également que si vous le renommez avant
d' attacher le
script, si vous
cliquez avec le bouton droit sur l'état puis que vous
attachez le script maintenant, vous verrez que le nom du script est également par défaut
le nom du nœud Donc, garder ces trois
choses synchronisées généralement une bonne idée de
garder les choses organisées Et nous allons simplement l'enregistrer
dans le dossier du lecteur par défaut pour le moment, et
héritons de l'état Limbo Créez. OK, donc je vais appeler cela
l'état de déplacement, le nom de
classe de déplacement d'état. Nous pourrions aussi le
réutiliser pour l'ennemi. Puisqu'ils
utiliseront
tous essentiellement la même configuration d'animation. Donc, pour ce
qui est de l'état de déplacement,
nous allons avoir besoin des noms de
deux animations, avoir besoin des noms de
deux animations, à savoir notre animation inactive et notre animation de mouvement,
qui est exécutée. Je vais donc dire
export pour Idl anim, et nous allons
configurer ce type d'installation sur un nom de chaîne Et nous allons utiliser par défaut
la valeur Idle. Maintenant, mettre l'esperluette ici pour en faire un
nom de chaîne est en fait facultatif Lorsqu'elle est déclarée sous
forme de nom de chaîne ici, la variable sera
automatiquement convertie. C'est donc facultatif si vous
voulez le faire en tant que Ah, alors exportons var. Je vais simplement l'appeler run
animation parce que c'
est ainsi qu'elle sera appelée par défaut dans ce projet, et nous ferons une esperluette égale En plaçant quelques commentaires ici deux hashtags font
apparaître les commentaires dans l'inspecteur. Donc, si je passe dans l'inspecteur et que je passe le curseur sur une animation inactive, vous pouvez voir que les
commentaires y
apparaissent automatiquement,
ce qui est très pratique Vous pouvez également voir
comment la propriété est définie sous la forme d'un nom de chaîne dont la valeur par défaut est idle ou
run pour le et pour cela, nous voulons nous assurer en vérifiant dans le lecteur d'animation
que nos noms correspondent. Vous pouvez donc voir que je faisais une idole en
minuscules, une course en minuscules Il est sensible aux caissons lorsque
vous utilisez ces cordes. Assurez-vous donc qu'il
correspond ici et ici, tout ce qui apparaît dans le lecteur
d'animation en mode veille et exécution. OK, donc je vais cliquer avec
le bouton droit sur le nom de
Limbo State ici
et rechercher le symbole Et vous allez voir
qu'il existe un tas de méthodes
spéciales que
ce nœud peut utiliser pour entrer, sortir, configurer et mettre à jour. Ce sont donc des méthodes
spécifiques à l'État. Ils ont un son un peu similaire. À ce que vous auriez sur
un nœud Gadot standard. Mais la différence est
que ceux-ci ne s'exécutent lorsque la machine à états utilise
réellement cet état. La machine à états n'exécute que
le code d'un état à
la fois, et les autres états restent
là passivement jusqu'à ce la machine à états
détermine qu'il est
temps de passer à
un état différent Cela signifie que vous pouvez
écrire quatre ensembles de code et qu'un seul
sera exécuté à la fois,
ce qui est très pratique pour
empêcher que des choses
inutiles se produisent alors que
votre personnage ne
devrait pas le faire. Par exemple, un personnage
ne devrait pas attaquer lorsqu' ne fait que courir et qu'il n'y a aucune attaque. Par conséquent, vous n'autorisez pas exécution de
ce code en le gérant à
l'aide d'une machine à états. OK, nous voulons donc
commencer par cette fonction de saisie. Le mot clé virtuel pour
ces fonctions signifie que, bien qu'il puisse y avoir une implémentation par défaut
pour la fonction, nous pouvons écrire notre
propre code personnalisé, qui change complètement ce qu'il fait lorsque ces fonctions s'exécutent
réellement. Examinons le script
Move State, et nous allons utiliser la fonction de soulignement de
la fonction Enter Alors, que voulons-nous voir se produire lorsque l'état de déplacement entre à l'intérieur
de la machine à états ? Nous voulons donc utiliser
le lecteur d'animation et définir son
animation pour qu'elle soit inactive ou exécutée selon que le personnage bouge ou
ne bouge pas. OK, maintenant, pour ce qui est de notre état de déplacement, comment allons-nous obtenir une référence au lecteur d'animation ? L'idée est donc que
pour notre agent, il n'y aura qu'
un seul lecteur d'animation, le lecteur
d'animation du joueur. Il existe plusieurs
manières d'
obtenir cette référence dans
votre script Move State. Je vais juste essayer de vous montrer
celle qui me vient à l' esprit et qui serait la
plus pratique. Donc, si nous passons au lecteur HSM, nous pouvons exporter une référence
vers le lecteur d'animation Passons donc à l'exportation du lecteur d'animation
var, puis du lecteur d'animation Colon. D'accord, un commentaire pour préciser qu'
il s'agit du lecteur d'animation du joueur, puis nous l'
attribuons dans l'inspecteur. Maintenant, la raison pour laquelle je le
fais dans ce script plutôt que dans les
scripts pour enfants, comme les états, c'est
que je veux juste une seule référence
exportée ici, et ensuite nous l'utiliserons pour obtenir
le lecteur d'animation à partir de nos scripts d'état. Donc, si nous
passons au script Move State, je pourrais très rapidement
obtenir la référence du joueur HSM
ici en haut en faisant quelque chose comme get parent puis
point animation player C'est donc vraiment tout ce que
tu aurais à faire là-bas. Et maintenant, nous pouvons l'attribuer à une variable locale si nous le voulons. Une autre option serait d'
avoir une méthode qui
obtient toujours cela ou de la mettre en
cache ici localement. Il suffit donc de
prendre cette valeur ici, puis de l'affecter
à une variable locale. Donc, var, je dirais le lecteur
d'animation Underscore, qui est du type lecteur
d'animation Ensuite, cela pourrait être sur Enter, mais je le modifierai
pour le configurer plus tard. Nous allons créer le lecteur Underscore
Animation. Egaux, Get parent. Ouais. Vous pouvez le voir
se remplir automatiquement, y
avez supprimé le nom de la
fonction Cela devrait être votre ligne
complète ici. Sur Enter en ce moment,
le lecteur d'animation sera
assigné au lecteur d'animation parent, quel qu' il soit. Cela rend donc les choses un peu
plus faciles que d'avoir une référence à une variable
d'exportation sur
chacun de ces scripts d'état. Les scripts d'état dépendent
plutôt du fait que le parent fasse référence
au lecteur d'animation,
ce qui, à mon avis, est juste,
car un joueur HSM va
vraiment contrôler les animations
du lecteur de toute façon Je pense donc que la configuration a du
sens dans ce cas. Maintenant, plutôt que d'appuyer sur Enter, qui sera appelée chaque fois le personnage entre dans l'état, je vais implémenter
la fonction de configuration. Fonction,
configuration du soulignement, puis saisie automatique qui renvoie Nous allons prendre cette ligne et la
mettre ici comme ça. L'installation ne s'exécute donc qu'une seule fois lorsque la
machine d'état s'initialise Donc, en gros, nous
n'avons pas besoin d'utiliser le lecteur d'animation à chaque
fois que nous entrons dans l'état, juste une configuration. Maintenant, ce que nous voulons voir se produire à Enter, c'est que nous jouions
la bonne animation. À l'heure actuelle, nous n'
avons pas la bonne méthode pour
déterminer l' animation,
car le code correspondant est en fait piégé
dans le script du lecteur cette direction étant définie
sur une variable locale. Nous allons donc devoir
le
retirer plus tard pour que cela
fonctionne pleinement. Mais ce que nous pouvons faire pour le moment, c'est jouer par points dans le lecteur d'animation, et disons simplement que nous devons
commencer par l'animation inactive. Maintenant, non, je mets
la variable ici, une référence à une animation inactive, qui se résoudra
en un nom de chaîne. Cela attend donc un nom de chaîne, mais nous ne le
tapons pas trop fort ici. Nous voulons nous assurer
qu'il s'agit de la variable afin d'avoir toujours la possibilité de la modifier dans l'
inspecteur, si cela a du sens. En
règle générale, si vous souhaitez
modifier
quelque chose, c'est-à-dire une chaîne, vous devez l'extraire en une
sorte de variable
plutôt que de la taper en dur
chaque fois que vous la
référencez dans le même script. Parfois, si le message
ne
doit être utilisé qu'une seule fois à cet
endroit précis, il est parfaitement normal de taper la chaîne de votre code dans
votre code de fonction. Ça peut être bien aussi.
OK, donc l' animation inactive sera
jouée
dès que l'état de déplacement démarrera. Maintenant, pour tester cela,
nous voulons désactiver l'exécution automatique dans
le lecteur d'animation. Ou peut-être que nous ne le savons pas vraiment. Arrêtons le jeu
et lançons-le tel quel,
et il devrait passer dans
l'animation
inactive, du moins c'est et il devrait passer dans ce que je pensais. Essayons donc de désactiver
le jeu automatique au chargement ici. Maintenant, sans Autoplay en cours de chargement, je pense qu'il ne devrait rien jouer Nous avons donc toujours le problème il semble que l'État n' entre
pas parce que l'
animation ne joue pas. Donc, ce que nous pouvons faire pour le prouver c'est de retourner dans
l'éditeur de script. Et je vais
définir un point de rupture ici en cliquant avec le bouton gauche de
la souris à gauche du
numéro de ligne dans le script. Cela signifie que lorsqu' elle atteindra cette ligne de code, elle se cassera et nous
permettra de voir ce
qui se passe dans le débuker Je vais donc appuyer sur Play, mais ça ne va pas toucher, ce qui signifie que l'État n'est jamais vraiment entré.
Il n'est pas actif. Cela signifie donc que nous devons
revenir au script HSM et nous assurer que
l'état de déplacement est réellement actif au
début du jeu Passons donc au joueur HSM. Et je crois que ce que j'
ai oublié, c'est d'appeler set active sur le
lecteur HSM lui-même. Nous voulons donc définir active sur true. Nous avons initialisé, ce qui
exécute le programme d'installation, mais nous ne l'avons pas activé, ce qui fait que la machine
d'état commence à fonctionner Donc maintenant, si nous appuyons sur
Play, nous allons appuyer sur
cette ligne Enter en mode déplacement. Cela prouve donc que l'état de déplacement est réellement
reconnu par la machine d'État. Pour aller un peu plus en détail, vous pouvez regarder la
trace de la pile en bas,
et vous pouvez voir, si
vous lisez attentivement, que la fonction de
saisie de l'état de déplacement s'est exécutée, et qu'elle s'est exécutée après l'exécution du programme d'installation de HSM Vous pouvez également cliquer ici et passer à
la ligne de code, ce qui a provoqué l'
exécution d'Enter à l'état de déplacement Voir set Active true ici, qui appelle la touche Enter
dès le premier état exécuté. Et tout cela s'est produit,
si vous cliquez en bas sur
le HSM
prêt à être configuré Vous pouvez donc voir, en gros, ce qui
a amené Enter à être appelé. C'est donc la fonction Ready du HSM appelée setup HSM, appelée set active puis
set active, qui a fait fonctionner l'état de
déplacement Maintenant, si ce n'est pas déjà fait, vous pouvez décocher ce
point d'arrêt et cliquer ici pour continuer ou appuyer sur la touche F
12 du clavier, et vous pouvez voir que l'
état inactif va fonctionner Si vous souhaitez passer
à l'état run, alors nous prenons run ici et remplaçons play Idle animation par play
run animation, appuyez sur play. Et maintenant, vous pouvez voir
qu'il joue l'animation de course lorsque
l'état entre. Dans la vidéo suivante, nous allons donc nous
concentrer sur le contrôle réel l'état du mouvement à l'aide de la saisie du joueur afin de nous assurer que nous diffusons
la bonne animation au bon moment.
7. Entrées du joueur en tant que composant: Notre état de déplacement consiste à l'animation sur le
lecteur d'animation pour notre personnage, mais pour le moment, il n'a pas
le code permettant savoir quand passer
à l'animation d'exécution, lorsque le
joueur intervient réellement. Pour gérer cela, si nous examinons le script du joueur, nous pouvons voir que c'est
là que la direction
est acquise pour le joueur, et nous le faisons avec une
variable locale pour la direction. Cela fonctionne donc pour cette fonction de processus
physique, mais nous ne pouvons pas utiliser la direction d'entrée
ailleurs qu'ici. Nous voudrions donc l'intégrer
à une sorte de variable de propriété accessible
par d'autres scripts. Maintenant, nous pourrions faire quelque chose comme la direction
VR du vecteur deux, puis changer
ici pour définir la direction de la
variable locale. Et ce
serait probablement l'option la plus simple. Ensemble. Cependant, je pense que si nous continuions sur
cette voie et que nous mettions toutes les informations dans le script
du
personnage du joueur
, nous
briserions vraiment la distinction entre les préoccupations. Ainsi, le script du corps du
personnage du joueur consiste principalement à
déplacer le joueur. Si nous ajoutons toutes les fonctionnalités de
saisie, en
recueillant toutes les informations des
joueurs,
le script
va maintenant servir à deux ou trois objectifs,
voire plus car nous continuons à
encombrer le script du joueur Je vais donc essayer d'en
faire un script de nœud distinct
que notre script de joueur
peut toujours utiliser, mais nous pouvons également faire
référence, disons, nos états afin de gérer
toutes les entrées relatives à notre personnage de
joueur. Faisons donc un clic droit
sur le nœud joueur, et je vais
ajouter un nœud enfant. Tapons le nœud ici. Ce ne sera donc qu'une classe
de nœud de base, create. Et je veux le renommer
en entrée du joueur. Attachons-y un script. Cliquez avec le bouton droit sur
le script pour joindre le script, saisie par le joueur Et nous pouvons lui donner
le nom de la classe, entrée
du joueur afin
qu'il puisse
être facilement référencé dans une variable
d'exportation. Maintenant, à partir de notre script de lecteur, nous devons essentiellement le récupérer, et je vais juste contrôler C, coller dans la
saisie du joueur, pour pouvoir le mettre là. Mais là où nous voulons
réellement obtenir la direction c'est à l'intérieur de la méthode de saisie. heure actuelle, dans le script du
joueur, processus
physique exécute chaque
image de traitement physique de notre jeu, soit environ 60
fois par seconde par défaut. Nous n'appuyons probablement pas sur
les touches 60 fois par seconde, donc cela représente beaucoup d'appels
vectoriels
inutiles et cela n'
aurait probablement pas autant d'importance
pour un personnage à un seul joueur. Mais en général, je
pense qu'il serait peut-être légèrement préférable que le script
du lecteur gère la saisie
de la direction dans la méthode de saisie de la fonction de
soulignement Donc, la fonction underscore
input, en gros, chaque fois qu'un événement d'entrée
est envoyé au jeu, il passe
par cette méthode et voit s'il y a un
code auquel il peut répondre Et pour vérifier si
l' événement est
réellement pertinent pour nous, nous vérifierons essentiellement nom de
l'action sur
l'événement lui-même. Nous allons donc taper if, et je vais
créer une nouvelle méthode si soulignement est une action de mouvement Et nous allons passer
l'événement à cette fonction. Ensuite, nous allons
faire certaines choses. Sinon, nous allons
simplement passer et ne rien
faire pour l'instant. Qu'est-ce que la fonction I Movement
Action ? En général, nous nous prémunissons simplement contre d'autres types d'actions et nous voulons traiter
les entrées uniquement s'il s'
agit d'une action de mouvement. Nous allons donc dire que la fonction
est l'action du mouvement. De type événement, événement d'entrée. Et puis cela va
renvoyer un booléen. Un booléen est donc une
vraie valeur fausse. S'agit-il d'une action de mouvement ? Vrai ou faux ? Donc ça va ressembler à
quelque chose comme ça. Renvoie un événement qui est une action, et nous
allons simplement copier et coller ces
noms pour le moment. OK, nous pouvons donc voir
ici que je répète la même chaîne
que celle qui est là-haut. Donc, en général, j'essaierais les
intégrer dans une variable
distincte. Mais nous pourrions. Oui, pourquoi ne pas
le faire maintenant ? Ensuite, je vais vous montrer une étape que
nous pouvons même franchir. Mettons donc une variable ici, Var left action ou en fait, disons simplement que var left
est de type string name, et qu'elle sera égale
à cette valeur ici. Alors contrôlons C, copiez-le, collez-le ici,
puis je vais le
sélectionner à nouveau. Je vais appuyer sur Control
R pour le trouver et le remplacer, et je vais
le remplacer par le bouton gauche. Maintenant, lorsque vous
utilisez cet outil, il va remplacer ce que
vous avez actuellement sélectionné. Je veux donc le remplacer par le nom de gauche, donc je
vais appuyer sur Remplacer. Maintenant, le second, auquel
il va
automatiquement accéder ou peut-être que ce n'
est pas le cas. Euh, ici, nous voulons garder Ampersand
Quotation à Ampersand
Quotation Alors cliquons sur Next match, et nous verrons
ici que nous voulons le remplacer par
left, alors appuyez sur Remplacer. Et en
gros, ce sera tout. Nous devrions probablement
également nous occuper de ce message d'erreur pour
le moment. Je vais donc déclarer
cette direction lointaine, et nous nous occuperons assigner
correctement dans une minute OK, pour supprimer
le message d'erreur, vous pouvez enregistrer le
script pour le moment. Donc, à l'heure actuelle, l'action
du mouvement
I indique si l'
action est l'action de gauche. Le nom
de l'action associée à
l'événement correspond-il donc au nom laissé ? Maintenant, nous avons trois
autres actions, nous devons
donc vérifier trois
autres conditions ici. Mettons-le donc rapidement en évidence. Je vais sélectionner
ce Control X pour le couper, tapez à droite. Descendez ici, créez une
nouvelle variable var right, le nom de
chaîne est égal à, puis
contrôlez V pour la coller. Nous avons donc correctement
assigné la variable au nom de
chaîne. Et fais la même chose
pour moi. Sélectionnez donc ceci. Contrôlez X pour couper, tapez vers le haut. Descends ici. Var up est de type string name, et est égal à Control V pour le coller N. Et encore une
fois. Ctrl X. Tapez vers le bas,
descendez ici, bas, nom de
chaîne égal à,
Ctrl V, collez-le dedans. D'accord, nous avons maintenant nos quatre
variables qui correspondent
aux noms de chaînes réels que nous
transmettons réellement à des méthodes comme celle-ci. Vous voulez une autre astuce amusante, vous pouvez les
survoler comme ceci, sélectionnant juste derrière l'onglet à effet sinusoïdal
égal,
derrière l'onglet à effet sinusoïdal égal,
derrière l'onglet à effet sinusoïdal égal,
derrière l'onglet à effet
sinusoïdal égal, comme ça. Et vous pouvez vraiment tout
aligner et c'est joli
et tout ça. C'est peut-être un peu plus lisible. À vous de décider si vous le souhaitez ou non. D'accord, mais maintenant l'
important est de terminer cette méthode, nous devons vérifier
les autres actions. Nous allons donc faire de l'espace. Et puis le caractère en
ligne droite, qui est décalé, et juste en dessous du backspace, la ligne
verticale Donc, la
ligne verticale, la ligne verticale, et tu dois maintenir la touche
Shift enfoncée pour le faire,
au moins sur mon clavier. Ces deux
lignes verticales signifient donc ou. Je suppose que vous pourriez
taper ou aimer ça, et ce serait pareil. Et nous pourrions simplement
essayer cela, si c' est un peu plus facile à lire et à faire,
event point is action, et nous voulons Right. Tiens bon. Écrivez le nom de la
variable. Bien. Donc, il
semble que cela fonctionne. Donc,
recommençons ou si j' haut ou si
l'événement
est une action vers le bas. OK, alors j'espère
que cela a du sens. Nous vérifions si l'
événement est une action gauche, une action droite, une action
ascendante ou une action descendante. Maintenant, cette ligne est un peu longue. Vous pouvez le voir comme un point de
coupure à la verticale. Ce ne sont donc que des directives
générales ici. Vous pouvez voir que nous
avons 107 caractères sur cette ligne. Ce n'est pas un problème. Je veux dire, je pense que c'est
assez lisible, mais si vous voulez que votre code descende
plus en plus verticalement, vous pouvez le
diviser ici en appuyant sur Entrée. Maintenant, si j'appuie sur Control S ici, cela va nous poser un problème. On s'attend à une
expression après ou. Il ne sait donc pas actuellement que
nous essayons de
passer aux lignes suivantes. Donc, ce que vous
devez faire, c'est mettre une barre oblique inverse juste après le O, et maintenant il sait que cela
continue sur la ligne suivante Vous pouvez donc continuer comme
ceci, barre oblique inversée sur Entrée pour
insérer une nouvelle ligne, puis une barre oblique inverse sur Entrée
et Maintenant, je dirais que cela
semble plutôt propre ici. Nous avons donc nos quatre conditions, et il va toutes les
vérifier, et dès que l'une d'
entre elles sera vraie, elle redeviendra vraie Et si aucune d'entre elles n'
est vraie, alors c'est faux. Donc, si l'action est
une action de mouvement, nous allons être en mesure
de traiter notre code de mouvement. OK, c'est donc ici que nous
assignons le vecteur. Il y a deux endroits où nous
allons utiliser l'entrée. L'un est pour la direction orientée vers l'
avant et l'autre pour le sens du
mouvement. Nous allons donc obtenir la
variable pour l'entrée. L'entrée Var est de type vecteur deux, nous allons la définir comme étant égale
au vecteur Import point G. Et comme avant, nous voulons la gauche, la droite, le haut et le bas. OK. Et voici notre contribution. Ainsi,
chaque fois que nous appuyons sur une touche, nous voulons définir l'entrée
directionnelle. La direction sera donc simplement égale à la valeur
des importations. Mais vu la direction orientée, c'est un peu spécial. Dans un jeu bidimensionnel à quatre
directions, un personnage ne peut pas faire face au vecteur 00, car cela reviendrait à se
regarder lui-même, non à regarder vers la droite, le
haut, la gauche ou le bas, qui sont les seules
directions qu'il peut regarder. Lorsque nous attribuons
le vecteur orienté, nous ne voulons le faire que si
la direction n'est pas nulle Donc, si l'entrée n'est pas
égale au vecteur 20, donc pour un vecteur
bidirectionnel de zéro, cela signifie
que X est
zéro et Y est zéro, n'oubliez pas que les vecteurs ont des composantes
X et Y. Donc, étant donné que cette
condition est définie, nous pouvons prendre le facage
et le régler sur l'entrée. Et nous allons supprimer
ce petit laissez-passer ici parce que nous n'en avons pas besoin. Et puis en haut ici, var facing as of type vector two. Nous pouvons simplement utiliser par défaut
, disons, le
vecteur à deux points vers la droite,
ce qui fonctionne parfaitement. Si notre personnage est
toujours censé
faire face à droite par défaut lors du chargement, vous pouvez bien sûr le placer
vers la gauche si vous le souhaitez. Ensuite, pour ce
qui est de la direction,
nous voulons le remplacer par vecteur deux ou si vous
voulez être un peu plus sophistiqué, bien que ce soit également la valeur
par défaut, nous pourrions dire que deux points sont égaux au
vecteur deux points zéro. Donc, cela signifie
en fait que nous
déduisons le type de la
variable à partir de l'affectation, et l'affectation
est un vecteur deux, ce
qui signifie qu'
il
sera automatiquement attribué
à un vecteur deux, qui signifie que vous
n'avez pas à taper ce vecteur deux est
égal au vecteur deux Ça a juste l'air marrant. Donc, de même,
vous pouvez également le faire ici. Et faites en sorte que ce soit
un peu moins verbeux, même si les deux fonctionneront
parfaitement ici Le seul inconvénient
est que si vous changez ce vecteur à deux points
en quelque chose comme une chaîne, cela
sera également techniquement correct, car
il est maintenant attribué à la chaîne
du vecteur à deux points à droite, qui signifie qu'il
s'agit désormais d'une chaîne Donc, tu dois faire un
peu attention à ce sujet. Je n'ai pas vraiment vu
cela poser de problème. Je pense donc que dans ces cas, déduire le type
de la variable plutôt que de
le déclarer purement et simplement est parfaitement raisonnable et souvent un
peu plus facile à lire À vous de choisir, vous pouvez faire les deux. Si je regarde bien
les choses, je pense qu'il s'agit essentiellement de
notre script de joueur pour le moment. Nous y reviendrons et y ajouterons
des signaux un peu plus tard. OK, donc dans notre script de joueur, changeons les choses ici. Ainsi, au lieu d'avoir
une variable locale pour direction et
d'attribuer la
direction et
d'attribuer la direction au lieu d'un processus physique, nous
allons appuyer sur
Export var input is
of type player input Et ici, pour les processus
physiques, ce que nous voulons faire, c'est obtenir la
direction du courant à partir de l'entrée. Donc var direction, et je vais déduire le type à partir de la direction du point d'
entrée, sera attribué à
la direction locale, qui sera attribué à
la direction locale,
puis nous l'utiliserons pour le reste de notre script en vérifiant si la direction
est réellement
une valeur qui n'est pas le
vecteur 20, c'est ce que signifie
cette ligne Et si c'est le cas, on prend la direction et on la multiplie par la vitesse. La différence réside désormais
dans le fait que l'entrée est gérée par un script
complètement distinct. Notre script de joueur
est plus épuré et nous avons un composant de
saisie réutilisable qui
peut être utilisé pour designs de
personnages
complètement différents nécessitant le même
type de saisie par le joueur, même si le personnage
gère réellement les mécanismes de ses mouvements de
manière complètement différente. Cliquons donc sur
le script du lecteur, et nous voulons nous assurer
que l'importation est attribuée. Donc, comme avant, nous
pourrions mettre la fonction, soulignement prêt, affirmer que l'entrée n'est pas nulle
et lui donner le message Des entrées doivent être attribuées pour que le corps du personnage
se déplace correctement, lance le jeu, fasse échouer notre
assertion, ce qui est une bonne chose. Cliquez sur le lecteur et assignez
l'entrée au lecteur, réexécutez-le une fois de plus et
vérifiez qu'il fonctionne réellement. Et si vous utilisez le WASD, vous pouvez voir qu'
il se déplace en fonction entrées
de notre script d'importation du
lecteur
8. Changer les animations avec des signaux: heure actuelle, notre entrée directionnelle de haut en bas à gauche à
droite est contrôlée par le script d'entrée du
joueur, mais les animations ne
sont pas encore contrôlées par la
direction de ce script. Donc, si nous examinions
le script Move State, nous pourrions imaginer que nous pourrions simplement
récupérer une référence à l'entrée du joueur et y faire
participer les parents, comme avant. Cette méthode, bien qu'elle
fonctionne généralement bien, dépend du script HSM du
lecteur, qui fait référence à
toutes ces propriétés Si nous modifions le script machine
à
état hiérarchique du
joueur ,
cela peut à tout moment perturber le fonctionnement de
ce script, et le script dépend également en
quelque sorte directement du fait que
le parent possède dépend également en
quelque sorte directement du toutes
ces propriétés. Nous ne serions donc pas
en mesure de le réutiliser sur une
machine à états complètement différente qui n'aurait pas, disons, de
lecteur d'animation exposé. Donc, ce que vous pouvez faire comme autre option est
d'utiliser des tableaux noirs Nous regardons donc ici sur la droite lorsque vous
avez sélectionné le HSM, vous pouvez voir que le
plan Blackboard est une Ainsi, lorsque vous créez
un plan Blackboard, celui-ci indique à tous
les nœuds enfants du système State Machine à
quoi ils auront accès Et dans ce cas, nous voulons la direction opposée
de l'entrée du lecteur. Je vais donc créer un nouveau plan Blackboard
ici sur le lecteur HSM, puis appuyer Nous pouvons aller ici
et ajouter une variable, et nous voulons ajouter
Let's go with facing. Donc, lorsque nous
parlons d'animations, ce qui est plus pertinent pour nous c'est la direction dans laquelle le
personnage essaie faire face plutôt
que la direction dans laquelle il se déplace. Ce serait généralement la
même chose, mais pas toujours. Nous aurons donc en face ici, puis dans le menu déroulant, vecteur deux, afin que nous puissions cliquer sur Gérer ici,
puis ajouter une variable Et nous allons chercher
le vecteur directeur deux. Changez donc le type de
float en vecteur deux. Ensuite, nous pouvons appuyer sur OK.
Donc, pour obtenir cette
direction également et l'utiliser dans les différents
états de notre machine à états, nous voulons passer à la liaison, puis à la direction, nous voulons lier au script d'importation du
joueur. Mais si nous le faisons maintenant,
rien n'apparaîtra. L'une des limites du système Lambo AI
est donc que pour lier une propriété
au plan Blackboard, cette propriété doit
être une variable exportée Donc, si nous passons à la saisie du joueur, nous pouvons prendre les instructions
ici et simplement donner lors de l'exportation, puis les enregistrer. Vous cliquez donc sur Importer le joueur, vous verrez que la
direction s'affiche ici. Techniquement, cela
signifie que vous pouvez changer de direction
avant le début du jeu. Il
sera immédiatement remplacé par cette fonction d'importation
dès que vous appuierez sur une touche Il n'y a donc pas
vraiment d'inconvénient. C'est juste que la direction doit être exposée pour que cela fonctionne. Donc, sur le HSM, nous pouvons maintenant nous lier au script d'importation du
lecteur, et nous allons
rechercher la propriété direction Choisissez donc la direction
et appuyez sur Ouvrir. OK. Donc, si vous lisez ceci maintenant, la direction est désormais liée
à la direction d'importation du joueur, qui signifie que
tout ce que nous avons défini sur direction d'importation du
joueur sera reflété sur
ce tableau noir, et nous pourrons l'utiliser dans nos scripts,
comme l'état de Pendant que nous
y sommes, nous pouvons également configurer le lecteur d'animation
sur le plan Blackboard, ce qui éliminera
la dépendance entre l'état et le HSM Gérons et ajoutons une variable, je dirais un lecteur d'animation. Et passons à taper
et à choisir le chemin du nœud, je crois que c'est ce que nous voulons ici. OK. Cliquez sur OK. Et nous l' attribuons au lecteur
d'animation. Maintenant, si nous lisons un
extrait du Blackboard pour le lecteur Property Animation
Underscore, nous devrions être en mesure d'obtenir une
référence au lecteur d'animation OK, donc maintenant, si nous
passons à Move State, cela
ressemblera davantage à ceci. lecteur
d'animation Underscore sera donc égal
à Blackboard Le Blackboard est donc
créé au moment de l'exécution, sur la
base du plan Blackboard Il s'agit donc essentiellement
de l'objet d'exécution où nous obtenons les
variables dont nous avons besoin. Nous devons donc utiliser
Blackboard point, Get VR, get underscore var, et nous cherchons
le nom de la propriété Donc, dans ce cas, ce sera Animation
Underscore Player La valeur par défaut sera nulle. Nous voulons qu'il se plaint
s'il ne le trouve pas,
car cela signifie que nous avons fait une erreur dans notre configuration Maintenant, nous pouvons essentiellement
supprimer cette ligne maintenant, et maintenant notre script
ne
dépend plus du tout du script HSM Cela
dépend simplement de la configuration du Blackboard pour disposer
d'
un lecteur d'animation,
qui recevra un message d'erreur s'il n'y a pas de
lecteur d'animation dans le Blackboard Maintenant, pour ce qui est de l'orientation, nous devons
juste l'obtenir
lors de la mise à jour, je suppose. Donc, mettez à jour la fonction, le soulignement, et nous allons
obtenir la variable
Blackboard actuelle Ce sera donc la direction de
la réalité virtuelle. Ce sera égal à
Blackboard point Get VR, et nous cherchons une orientation Et nous ne pouvons pas déduire ce type de
variable car nous ne savons pas ce que Git VR va réellement
renvoyer ici Déclarons-le donc
sous forme de vecteur deux. OK, maintenant nous avons
la propriété direction, et notre script n'a
même pas besoin de savoir
quoi que ce soit à propos du script d'entrée du
joueur. Tout ce qu'il faut savoir, c'est que le Blackboard possède une propriété de
direction, et que nous pouvons l'utiliser
pour nos animations Donc, très simplement, si
la direction n'est pas nulle, c'est une forme
abrégée, alors nous
allons jouer l'animation de course
sur le lecteur d'animation. Soulignez donc le lecteur d'animation, jeu de
points, l'animation d'exécution, Ale, le lecteur d'animation, le jeu de
points, l'animation inactive Allons-y, appuyons sur Play
now pour voir si cela fonctionne. Donc, si I WAS et D, alors vous pouvez voir que nous obtenons le mouvement
d'animation
de notre personnage. Maintenant, il y a un gros défaut ici, c'est
que le décalage de
nos sprites ne correspond pas Maintenant, c'est exactement la nature de la façon dont les
feuilles de sprites spécifiques ont été configurées Je pense que la taille de chaque
cadre ne correspond pas. Cela crée donc un décalage. Maintenant, ce serait quelque chose que
vous pouvez corriger dans un éditeur comme A Sprite, si vous êtes l'artiste, ou si vous voulez simplement le
faire fonctionner Dans ce cas, nous pouvons le faire
dans le lecteur d'animation Ainsi, dans le lecteur d'animation, nous pouvons passer par exemple à
vérifier l'animation inactive. Et ici, c'est centré
ici, comme on pouvait s'y attendre. Ainsi, lorsque nous passons à l'animation d'
exécution de Run, nous devons simplement nous
assurer qu' correspond à l'animation inactive. Nous allons donc
vouloir cadrer
la position sur chacune
de nos animations. Ajoutons donc une piste, une piste de
propriété. Voyons voir, le
Sprite two D parce que nous parlons
du décalage du sprite, et
non du décalage du personnage du joueur Ensuite, nous voulons occuper un poste ici. Ajoutons donc une clé. À l'heure actuelle, il est à moins 14. Je vais aller à Idle. Ensuite, nous allons ajouter
la même propriété à l'avance. Positionnez donc deux D, puis
ajoutez l'image-clé ici. Si je fais cela, c'est parce que la position de repos
est déjà correcte, donc je ne veux pas que cela change lorsque je
prépare la course. Pendant que nous y sommes,
examinons Death. Je pense que l'animation sur la mort est vraiment au bon endroit. Il suffit donc d'aller ici, d'
ajouter la piste, de spriter
deux D, de se positionner OK, insérez la clé. OK, et alors ça
devrait être une bonne chose. Nous devons donc maintenant
modifier la valeur
du tour en animation
spécifiquement. Appuyez donc sur Q pour passer en mode
sélection. Cliquez avec le bouton gauche de la souris sur le sprite. Tu devrais avoir cette grosse boîte. Vous pouvez probablement voir d'
où
vient le décalage , car il y a
tellement d'espace vide là-haut. Quoi qu'il en soit,
il suffit d'appuyer sur W, puis déplacer vers
le haut à peu près. Laissez-moi vérifier la transformation.
Oui, moins 27 pixels. Je pense que c'est ce que j'avais et c'est ce qui figurait dans
l'ébauche du projet. Faisons donc un keyframe
. Appuyons sur Play et voyons si c'est mieux. Donc, le WASD est presque là, mais je pense qu'il doit
être supérieur de quelques pixels Passons donc à W
, puis déplaçons ça vers le haut. Essayons 30, appuyons sur W. N,
ce n'est toujours pas le cas. OK, avançons-le davantage. Je vais regarder l'animation inactive. OK. Et c'est là qu'il a les
pieds sur terre. Alors retournons courir. OK, et ses pieds
devraient être là-haut, deux pixels sous le bas. OK, puis
ralentissez, puis exécutez. OK, j'ai oublié de l'encadrer. Permettez-moi donc de le déplacer encore une fois. Je ne pense pas que nous
ayons besoin du décalage X. Imaginons cela à
moins 30 pixels ici. OK, appuyons sur Play
et testons encore une fois. WASD. Cela me
semble correct. Nous allons donc opter pour ça.
Appuyons sur Arrêter le joueur ici. Et pour être clair, pour
une solution à plus long terme, il serait préférable
de corriger les
feuilles de pointes d'animation et de s'
assurer qu' elles ont
toutes la même taille, quel que soit
le
mouvement des animations, afin ne pas avoir
à modifier la position. À long terme, c'est un
peu plus difficile à gérer, il vaut
donc mieux le fixer directement sur la feuille d'animation. OK, donc pour ce qui est du
ralenti et du mouvement de nos personnages, la dernière chose que nous ayons
vraiment à faire pour les mouvements de base de
nos personnages est de le
faire basculer lorsque nous nous déplaçons vers la
gauche, puis de le faire revenir en arrière lorsque
nous nous déplaçons vers la droite Ce sera la prochaine vidéo,
donc je vous verrai dans la prochaine.
9. Inverser un personnage 2D: Nous avons donc notre mouvement de haut en bas à gauche à
droite pour
le personnage, et il peut revenir à l'état
inactif. C'est génial. Ce que nous devons
changer ici, cependant, c'est que notre personnage
doit être
capable de basculer de droite à gauche, selon que nous avons
une entrée gauche ou droite. Nous voulons donc essentiellement inverser le nœud sprite
de gauche à droite Maintenant, Sprite
a directement un flip H ici. Nous pourrions certainement
simplement le dire dans un script personnalisé pour inverser le H fonction de ce que fait l'entrée du
joueur. Pour aller un
peu plus loin de cela. Au lieu de cela, nous pourrions placer un nœud parent qui se retourne tout seul lorsque la direction de l'entrée du joueur change de
direction, puis cela renversera
automatiquement le nœud sprite parce que
le nœud sprite est un enfant de ce
nœud parent deux D. Donc, si je clique sur le nœud du joueur
et que j'ajoute un enfant, ajoutons un nœud deux D, puis je l'appellerai flip deux
face à deux D.
cliquez dessus avec le bouton droit de la souris, joignez un script. Nous allons le placer à l'emplacement
par défaut, le créer, et nous allons faire en sorte que le
nom de classe retourne
deux face à deux D. Et cela va inverser l'échelle X de la transformation, selon que le personnage
est orienté vers la gauche ou vers la droite. OK, alors qu'est-ce que
cela signifie en gros ? Si je prends ce deux D lumineux et que je le place sous le revers
pour faire face à deux D, puis que nous le remettons là où il était auparavant, vers le haut
de la hiérarchie, je vais passer au face à deux D, puis ici sur la
droite, décocher le lien entre X et Y parce que nous
ne faisons que changer l'échelle des X. D'accord ? Ensuite, tapez moins
un pour le X, et vous verrez que le
personnage bascule vers la gauche Si nous saisissons un X,
le caractère fait face à le caractère fait face la direction d'origine,
qui est vers la droite. Bien sûr, vous
devez faire un
peu attention à la configuration. Si vous placez vos armes face
à deux Dno, cela signifie que vos
armes
seront également orientées vers la
gauche ou vers la droite Parfois,
c'est ce que vous voulez, et dans d'autres cas, vous n'utilisez pas votre système de
lancement de projectiles plus tard, vous ne voulez pas qu'il bascule en
fonction de l'échelle de ce nœud Mais si vous deviez, par exemple, mettre une lance dans la main du
personnage, vous voudriez probablement
que le sprite soit orienté dans
la bonne direction
lorsque vous faites face à la bonne direction
lorsque vous faites face droite ou dans la direction gauche
lorsque vous faites Vous devez donc faire attention
aux nœuds que
vous placez ici, car tout ce qui se trouve
face à deux D dans la hiérarchie va désormais
basculer chaque fois que le nœud
parent bascule Gardez donc à l'esprit ce qui est apparenté à quoi, et
tout devrait bien se passer Donc, avant de faire face
à deux scripts D, nous voulons ajouter une variable d'exportation. Et nous allons dire input, qui est du type player input. Pour le moment, le fait de
dépendre de l'entrée du joueur
signifie que ce script est spécifiquement le
script du joueur et qu'il n'est pas nécessairement utilisé par
les scripts ennemis. Pour un script aussi
petit, dans ce cas, il peut être intéressant d'avoir une référence directe à
l' entrée
du lecteur, car
cela vous donne la configuration
la plus simple et la plus
pratique. Ensuite, la seule chose
dont vous avez besoin pour vous assurer, c'est que l'entrée est effectivement
attribuée à l'inspecteur. Nous pouvons donc le faire
avec l'assertion. Faisons déjà une fonction de
soulignement,
puis affirmons que l'entrée n'
est pas nulle et disons pour inverser la référence au joueur, une fois de plus, vous pouvez toujours passer au premier
clic play,
et cela atteindra votre assertion, de sorte que le test est prêt à être Sinon, à ce stade, nous pouvons simplement accéder au
signal depuis l'entrée du joueur et l'utiliser pour inverser ce nœud chaque fois que la direction de
face change. Si je me souviens bien, je n'ai pas encore
mis les signaux. Donc, si nous cliquons avec
le bouton droit sur l'entrée du joueur , si nous
recherchons le symbole, nous voulons aller en haut et
déclarer certains signaux. Un signal est donc comme un événement. Si vous venez
d'autres langues comme C Sharp, c'est un événement. Dans ce cas,
cela signifie que
quelque chose s'est déclenché dans
votre code et que vous souhaitez informer les objets
abonnés que quelque chose s'est produit et éventuellement transmettre des informations
ou des données
contextuelles à l'objet destinataire OK, alors laissez-moi
en déclarer un, puis je vais l'
expliquer un peu plus simplement. Donc signal est le mot clé, puis nous
dirions face à changé, et nous voudrions également transmettre le
sens dans lequel il a changé, afin que nous puissions dire valeur ou face, et ce
sera un facteur de type deux. Nous déclarons donc
le paramètre. Ce que nous envoyons à n'importe quel objet récepteur est
indiqué entre parenthèses ici Le signal est donc confronté à un changement. Ainsi, chaque fois que la propriété de face change dans ce
cas, ici, nous voulons envoyer
un signal qui indique à
tous les objets abonnés
que la valeur de face a changé À ce moment-là, ils peuvent y répondre
dans leur propre code. Cela signifie que vous n'avez pas besoin de
vérifier constamment la propriété d' affichage des données saisies par le joueur à
chaque mise à jour d'image. Il vous suffit d'attendre que le script vous
informe que la valeur a
effectivement changé. Vous disposez donc de ces informations
pertinentes,
et vous n'avez besoin de les mettre à jour
qu' et vous n'avez besoin de les mettre à jour une fois toutes les quelques secondes,
car votre joueur ne
change de direction que toutes les 3 secondes ou de
direction opposée dans ce cas. En d'autres termes, vous devenez
dépendant d'un signal déclenchant votre autre
code plutôt que de vérifier manuellement
en permanence
les modifications d'une valeur. Donc, avec notre
propriété de face ici, nous voulons la prendre et ajouter un setter afin que lorsque la
valeur nominale change, nous émettions réellement le signal
chaque fois qu'elle change Donc, si vous ajoutez
deux points à la fin, cela vous permet de déclarer
vos setters et getters Tu peux juste faire l'une d'entre elles. Tu n'es pas obligée de faire
les deux. Dans ce cas, nous voulons dire valeur définie. Et notez que c'est sur une nouvelle ligne. Donc, dans ce cas, nous
déclarons vraiment une fonction
, en fait. Et cela ne fonctionne
que chaque fois que nous définissons la valeur de cette propriété
sur quelque chose de nouveau. Nous changeons donc la valeur par défaut consiste simplement à définir la valeur ne rien
faire d'autre pour la définir et à créer du code supplémentaire. Ainsi, lorsque nous définissons la valeur, nous voulons prendre le
facage et lui attribuer la valeur. Ce serait donc ce qu'
il fait par défaut. Si vous ne déclarez aucune fonction
setter Getter, le Getter ressemblerait plutôt à ceci, orienté vers le
retour, n' est-ce pas ? C'est
ce à quoi on pouvait s'attendre. Vous accédez à la propriété par son nom, par
face, et elle renvoie
la valeur sur laquelle elle est définie. Donc, si vous n'avez pas besoin de
code personnalisé pour le Getter, vous n'avez pas besoin de le
déclarer car c'est ce qu'il fait par défaut, et c'est ce que
ferait le facing par défaut Maintenant, si vous voulez faire
quelque chose comme émettre un signal, vous avez besoin du code supplémentaire. Maintenant, nous voulons dire que le facing a changé
le nom du point de signal émis, donc nous émettons le signal, ce qui signifie que tout objet s'y
abonnant
sera désormais notifié, mais nous voulons transmettre les
informations du facage Nous passons donc face à face. Nous prenons donc cette valeur, l'
envoyons par le biais du signal, puis dans nos autres scripts, nous allons recevoir
cette information, et nous pouvons décider
quoi en faire. Maintenant, il y a une autre astuce que
je veux montrer ici, à savoir que nous
ne voulons pas que le
changement de face soit émis chaque fois que
nous définissons la valeur nominale. Cela peut être défini sur la même valeur sur chaque image. Je pense que le contrôle
de l'action du
mouvement permet de se protéger contre cela, car cela
ne se déclenche que
lorsqu'il y a une véritable action de
mouvement , ce
qui reviendrait, dans ce cas, appuyer sur la touche droite ou relâcher la touche droite, ou pareil dans les
autres directions. Mais il est toujours bon d' être plus défensif
dans la programmation. Supposez simplement que vos
autres hypothèses ne sont pas nécessairement correctes
, puis pour vous en prémunir. Nous allons donc
mettre un gardien ici. Si la face est déjà
égale à la valeur, cela signifierait
qu'il n'y a aucun changement. Nous voulons donc simplement revenir ici. Il n'est pas nécessaire de définir le facage car la valeur est
déjà attribuée au facage. C'est déjà correct, et nous
n'avons pas besoin d'émettre le signal, et nous ne devrions pas émettre le signal car la valeur
ne change pas réellement. Nous avons donc cette protection contre les mauvais réglages sur la propriété qui fait face. Mais si cette protection est franchie, nous réglons le parement
et nous émettons le signal. Donc, avec tout cela, le signal
va maintenant être émis. Et nous pouvons simplement passer à deux D. Et après avoir affirmé que
Import n'est pas nul, nous savons qu'il est défini. Nous pouvons donc passer à l'entrée faisant face au
point modifié. Vous verrez que le signal est en fait référencé
par son nom ici, et qu'il porte ce petit symbole ou signal
Wi-Fi. Nous avons donc modifié les
faces des points d'entrée. Maintenant, nous
examinons le nom du signal, et nous voulons nous y connecter. Donc, ne vous connectez pas. Et que
voulons-nous y connecter ? Eh bien, ce serait
une fonction appelable que nous avons configurée ici Pour que les choses restent
aussi simples que possible, je pense nous devrions créer une
fonction personnalisée en bas de page. Je vais donc dire souligner le fait de
faire face au changement. Il y aura toujours
une erreur car il
n'y a aucune fonction portant ce nom
dans notre script. Donc, si j'appuie plusieurs
fois sur Entrée, nous dirons fonction,
soulignement lorsque le visage est changé Maintenant, quels paramètres cette
fonction va-t-elle prendre ? Eh bien, il
faudra tout ce qui a été transmis au signal. Donc, dans ce cas, vous
regarderiez dans la direction opposée. Je vais donc dire
P, soulignement face, P comme paramètre, indiquer très clairement
que cette valeur
provient des paramètres qui ont été transmis à
la fonction Et puis il s'agit d'un vecteur deux. Nous n'allons rien
rendre, donc nous retournons le vide. Et maintenant, nous pouvons écrire
le code pour répondre au changement de
face du signal émetteur. OK, donc lorsque le visage est modifié, nous voulons prendre
la direction X du et
l'utiliser pour déterminer si nous devons
faire face à droite ou à gauche. Donc, si le point p faisant face au point
X est une valeur positive, alors nous voulons prendre l'échelle X de ce nœud deux D, le retourner au nœud opposé, et nous voulons la définir égale à la valeur absolue
du point d'échelle X. Lorsque vous prenez la valeur
absolue, vous obtenez un nombre toujours
positif. Donc, pour faire face à la
droite, nous prenons la bonne direction. Nous voulons donc toujours faire face
à la droite chaque fois que l'entrée est
réellement orientée vers la droite. Maintenant, nous n'
allons pas dire autre chose. Nous allons dire autre chose si P
face à X est inférieur à zéro. Nous ne voulons
donc pas ce cas zéro, Nous ne voulons
donc pas ce cas zéro car nos personnages ne
devraient pas être capables de faire face
au point 00 sur le
vecteur deux qui n'existe pas vraiment en
tant que direction de face dans
ce type de jeu en deux D. Nous ne voulons donc
rien faire lorsque c'est le cas. C'est pourquoi je vérifie si la valeur est inférieure à zéro, car une valeur inférieure à zéro serait
en fait orientée vers la gauche. Nous faisons donc le point redimensionné X, et nous allons le définir
égal à moins une
fois
la valeur absolue mise à l'échelle du point X.
OK, donc cela donnera
toujours un nombre positif,
puis nous
allons toujours le rendre négatif fois
la valeur absolue mise à l'échelle du point X. OK, donc cela donnera
toujours un nombre positif, puis nous
allons toujours le rendre Il existe donc probablement
différentes façons de calculer
cela ici, mais je pense que cela
devrait très bien fonctionner. OK, on passe donc à la vue en deux D. Nous cliquons sur
Retourner pour faire face à deux D, et nous attribuons la saisie au joueur. OK, donc c'est là que nous
allons obtenir le signal. Nous allons nous y reconnecter sur Rudy dans notre script face-à-face OK, donc si je clique sur Play, faisons le bon mouvement. Notre personnage fait face à la
droite, et si j'appuie sur la gauche, notre personnage fait face à la gauche. Si nous faisons en haut à gauche,
nous sommes tournés vers la gauche. Si nous faisons en bas à droite,
nous sommes face en bas à droite. Testez simplement les
huit directions lesquelles notre personnage peut se déplacer
à l'aide du clavier, et cela me semble bien. Donc, pour être un
peu avant-gardiste, une chose que nous pourrions faire est de récupérer ce code et de l'extraire
vers une fonction différente, refactorisant pour en faire
une nouvelle Supposons que la fonction soit mise à jour, retournement, et cela nécessitera
la direction orientée vers le haut. Donc face au P, vecteur deux, puis je vais prendre celui-ci, le
couper ici et en cas de changement de
face, je vais appeler la mise
à jour flip P face à face. Maintenant, la raison pour laquelle je le
fais est que je puisse également le réutiliser une fois prêt. Donc, prêt, nous allons simplement dire Mettre à jour », « Flip Import », face au point. Ainsi, lorsque notre script se charge pour la première fois, nous voulons définir la
direction de face immédiatement avant importation
ne vienne réellement de notre lecteur, car il se
peut que nous
décidions, lors de la saisie du joueur, d'exporter cette direction orientée, exporter cette direction orientée, puis de changer
la valeur par défaut du à droite en
vecteur
deux points à gauche parce que, pour raison ou une
autre, nous
voulons que notre orientés vers la gauche par défaut. Maintenant, avec cela, nous pouvons nous y préparer en nous
initialisant automatiquement avec le
bon sens de retournement en fonction de ce que dit
l'entrée Maintenant, il s'agit d'une fonction
publique. Nous pourrions simplement l'appeler à partir d'
un autre script s'il y avait un cas non lié à l'importation où nous voulions changer le
sens de retournement du personnage. Par exemple,
pendant une cinématique,
vous souhaitez peut-être supprimer
toutes les entrées du joueur, et vous souhaitez l'
appeler manuellement. Votre personnage était donc
orienté vers la droite, et dans la cinématique, vous
voulez qu'il soit orienté vers la gauche. Vous auriez donc la
possibilité d'appeler simplement Update flip sur le revers
pour faire face à deux nœuds D. D'accord, cela ouvre certainement
quelques possibilités. Et c'est à peu près tout ce que
nous aurons à faire pour le mouvement WASD
de notre joueur Ça a l'air bien. Je pense que toutes les préoccupations sont assez bien
séparées
10. Calques de carte des carreaux d'herbe et de terre: OK, étant donné que le mouvement et l'
animation de nos
personnages jouent essentiellement à la fois
pour Idol et pour Run, y compris pour le
retournement de direction, y compris pour le
retournement de direction,
je pense que c'est le
bon moment pour commencer à mettre un peu d'arrière-plan
afin que le jeu soit un peu plus joli
plutôt que avoir le fond gris
Gadot par défaut Allons-y et
passons à notre scène mondiale. Si vous ne l'avez pas ouvert, vous pouvez aller en bas à gauche ici. Recherchez simplement le monde, et vous devriez pouvoir
trouver World DottSCN si c'est le même nom que
vous utilisiez comme moi Ensuite, dans la hiérarchie mondiale, nous voulons cliquer avec le bouton droit de la souris
et ajouter un nouveau nœud, et nous recherchons
une couche de cartes en tuiles. Vous pouvez voir qu'il y avait
un autre nœud appelé Tilemap, mais il est obsolète,
je crois, depuis la version 4.3,
et depuis la version 14.41 et
sur le point de passer à la version 4.5, il est vivement
recommandé de
passer aux couches de tuiles,
qui divisent la carte en nœuds de couche
individuels plutôt que passer aux couches de tuiles,
qui divisent la carte d'avoir individuels il est vivement
recommandé de
passer aux couches de tuiles,
qui divisent la carte en nœuds de couche
individuels plutôt que d'avoir chaque couche. Contenu à l'intérieur
d'une carte en mosaïque. Ajoutons donc une couche de carte en tuiles. Et nous allons l'appeler
quelque chose comme sol, donc je vais le renommer en sol Et si vous l'avez
sélectionnée en bas, vous devriez avoir la fenêtre
tilemap Alors ouvrez-le s'
il n'est pas déjà ouvert. Ensuite, nous devons trouver les actifs
artistiques de notre projet. Je vais donc m'intéresser à l'art, puis ensembles de carreaux pour
les environnements
Pixel Crawler, et nous allons avoir envie de
travailler avec les carreaux de sol ici Donc, pour que cela soit activé, nous ne voulons pas
être sur la carte des tuiles, mais plutôt sur l'onglet du jeu de tuiles Regardez dans le coin supérieur
droit pendant que vous avez
sélectionné la couche de carte de
tuiles et vous verrez le jeu de tuiles comme ressource que vous
pouvez attribuer ici. Vous voulez cliquer avec le bouton gauche de la souris
et créer un nouveau jeu de vignettes Une fois que vous l'avez fait en bas, il y aura un nouvel onglet Tilset Donc, une fois que vous l'avez
renommé en sol, regardez en haut à droite
avec cette option sélectionnée, et vous devriez voir un
champ pour le jeu de tuiles. Nous voulons donc cliquer ici et déclarer un nouveau TileSetrSource Vous le faites en bas Il devrait y avoir deux onglets
liés à la carte de tuiles, qui est une carte de tuiles
pour sélectionner et
dessiner ce jeu de tuiles,
qui sert
à configurer vos tuiles, puis une carte de tuiles pour
dessiner vos tuiles. Nous voulons donc passer à Tile set. Vous devriez voir une boîte ici dans laquelle nous pouvons faire glisser les carreaux de
sol. Trouvez donc des carreaux de sol
à l'intérieur du projet. Ce sont donc les sols qui soulignent
les carreaux en PNG, et nous allons simplement
les glisser-déposer ici Il y aura cette petite fenêtre contextuelle qui vous demandera si vous souhaitez créer
automatiquement les vignettes, c'est nous qui
le faisons. Nous allons donc aller de l'avant
et nous rejoindre ici. Ensuite, vous verrez
dans la fenêtre d'aperçu que toutes les tuiles
ont été automatiquement découpées en ressources de
tuiles réelles que nous pouvons utiliser et à partir desquelles nous pouvons
peindre dans le jeu. La façon la plus simple de dessiner serait donc
d'aller sur Tilemap
, puis de sélectionner
individuellement les tuiles que
nous voulions placer Appuyez sur Q pour vous assurer que vous
êtes en mode sélection. Et puis ici, dans
la fenêtre tilemap, nous voulons utiliser les outils de peinture, donc c'est D sur le clavier Ensuite, vous pouvez
cliquer avec le bouton gauche de la souris pour dessiner la tuile. Vous pouvez passer dessus cliquer avec le bouton
gauche de la souris et déposer
une autre vignette. Vous verrez qu'en ce moment, le Tap s'affiche réellement devant le joueur.
Ce n'est pas ce que nous voulons. Ce que vous pouvez faire, c'est simplement déplacer
le sol vers le haut, et cela le triera
automatiquement,
de sorte le sol soit
sous le joueur. C'est donc le
moyen le plus simple de le faire. Donc, même si sélectionner les tuiles une par une comme
celle-ci fonctionnera, c'est très, très fastidieux Donc, ce que nous
voulons probablement faire à la place c'est créer un ensemble de terrains basé sur ces tuiles de gazon, puis l'utiliser
pour dessiner automatiquement tuile
dont nous avons besoin en fonction ce qui est adjacent à cette
tuile, le cas échéant. Ainsi, si vous agrandissez le
jeu de tuiles en haut à droite, vous pouvez accéder aux ensembles de terrain ,
puis ajouter un nouvel élément. Nous allons donc le
laisser dans les virages et les
côtés du match pour étendre le
terrain et ajouter un élément. Et nous pouvons simplement le renommer
, disons que le terrain en
herbe change de couleur quelque chose
d'un peu
plus herbeux, comme Maintenant, en bas,
passez à la série de carreaux, puis nous
allons peindre. Nous allons sélectionner des terrains
dans l'éditeur de propriétés. Nous allons
sélectionner le terrain
défini comme terrain zéro, puis le terrain que nous
dessinons est de l'herbe. Il devrait donc être assez évident de savoir quelles sont les
dalles de gazon ici. Mais pour que les tuiles se construisent correctement
et automatiquement, nous devons sélectionner les tuiles qui sont censées faire partie de
ce terrain en herbe. Vous pouvez donc simplement cliquer avec le bouton
gauche de la souris, maintenir et faire glisser une boîte autour de toutes ces
tuiles de gazon, un peu comme ça. S'il est surligné,
cela signifie qu' il est essentiellement marqué comme
faisant partie de ce terrain. Et c'est de l'herbe foncée ici. Nous pourrions le
configurer plus tard. OK. Ensuite, il se
peut que nous ayons besoin de les faire venir ici également. Nous verrons comment cela se passe et voir
ces carreaux légers. Maintenant, ceux du bas
semblent
plutôt être de l'herbe foncée. Nous pouvons essayer de
les inclure et de voir comment cela se passe, mais ils risquent de ne pas figurer dans la coupe finale pour
le terrain qui
est peut-être
plutôt une teinte d'herbe foncée. Il va donc falloir voir comment
cela fonctionne réellement. OK, nous avons donc sélectionné toutes ces tuiles comme
de l'herbe. Nous voulons maintenant aller en haut à
gauche et marquer les coins et
les côtés qui sont en herbe ou
adjacents à l'herbe. Donc, la façon la plus simple d'y
penser avec cet ensemble de carreaux est simplement que si la zone est
transparente, en général, vous n'allez pas la marquer, et s'il s'agit de gazon solide
ou proche d'herbe solide, vous allez marquer comme étant de l'herbe ou de l'herbe adjacente. Si je clique
ici avec le bouton gauche de la souris et que je fais glisser le curseur, vous verrez que le curseur est en train de
remplir, et nous voulons que ces huit
carrés qui ne se trouvent pas dans
le
coin inférieur droit soient marqués comme de l'herbe, car
cela indique
qu'il y a autre
chose ici en bas . Le carreau
en bas à droite n'est pas l'herbe et ce carreau
le reflète. Il utilisera donc
cette tuile lorsque tout ce qui se trouve à droite en haut à gauche
et dans ces trois coins sont de l'herbe, de l'herbe adjacente, sont de l'herbe, de l'herbe adjacente,
mais pas celui en bas à droite. L'idée est donc d'en avoir un
pour tous ces scénarios. Dans ce cas, vous devez créer
ces six tuiles du haut, ce qui signifie que
s'il n'y a pas d'herbe en dessous, en bas à
gauche ou en bas à droite, en dessous, en bas à
gauche ou en bas à droite,
cette tuile sera
automatiquement attribuée. Nous voulons donc simplement continuer à faire ce genre de choses à
tous les niveaux. Celui-ci
ressemble donc à tous les coins et côtés sauf
en bas à gauche. Et puis celui-ci
est dans le top quatre. Celui-ci est, je pense, exactement comme celui-ci
, encore une fois, dans le top 8 à droite. Et oui, il est possible d'
avoir plusieurs tuiles qui ont le même. Je crois qu'on
appelle ça un petit masque ici. Donc, si nous descendons vers le bas, vous verrez que ce sont
toutes neuf tuiles carrées, bien sûr, car elles sont toutes recouvertes d'
herbe et d'herbe adjacentes. Donc, vous
les rempliriez complètement. Et puis cela remplira tout ce qui se trouve à l'intérieur de
ces carreaux de bord. OK, donc nous
devons juste continuer comme ça. Donc, celui-ci en haut
sera
du milieu de haut en bas,
et de haut en bas de la droite. Ici, nous avons les huit côtés
et les huit coins sauf le coin supérieur gauche. Celui-ci est le quatre
en bas à droite. Ici, c'est tout
sauf en haut à gauche. Les six tuiles du bas, tout sauf en haut à droite, les quatre en bas à gauche, tout sauf en haut à droite, les six de gauche, tout sauf en bas et
les quatre en haut à gauche. Nous avons nos
pièces d'angle ici, et nous avons les pièces
solides en herbe ici. Donc, pour dessiner avec, il suffit
d'aller sur Tilemap,
puis de sélectionner les terrains, Et ce que nous pouvons simplement faire, c'est
prendre cet outil rectangulaire. Permettez-moi de faire un petit zoom arrière sur la
caméra. Et nous allons effectuer un zoom arrière avec molette
centrale de la souris
sur la carte du jeu, et nous pouvons simplement cliquer avec le bouton
gauche de la souris et faire glisser une boîte géante en arrière-plan. Et voici notre herbe
de fond. Maintenant, vous allez voir que ces
carreaux étaient, en fait, plus foncés. C'était un peu difficile
à voir sur mon écran. Alors peut-être que dans le set de carreaux
, il y a aussi de l'herbe foncée qui me semblait vraiment
la même. La solution à ce problème
est donc simplement de retirer les carreaux foncés des carreaux clairs lorsque nous
assignons le gazon Donc, si je clique avec le bouton droit sur l'une
de ces pièces du masque à bits, elle sera supprimée de la tuile si nous enlevons complètement les neuf
côtés, les coins et le centre. Maintenant, si nous le redessinons à nouveau,
cela ne sera plus possible lorsqu'
il s'agira de remplir les tuiles Je vais donc simplement cliquer avec le bouton gauche de la
souris et faire glisser une autre case dessus, et là, nous avons
de l'herbe claire et uniquement de l'herbe claire
pour toute cette scène. Maintenant, dans un jeu de type survivant, votre personnage peut se
déplacer beaucoup sur la carte. Je vais donc en
faire une très grande zone. Nous allons simplement passer d'ici
à là, juste pour qu'
il y ait suffisamment d'espace pour que le personnage
puisse se déplacer. Maintenant, vous pouvez voir qu'
il faut un certain temps pour le remplir, car
cela représente beaucoup de tuiles. OK, je veux aussi
montrer si j'appuie sur E, pour passer en mode Course,
puis sur D pour l'outil de peinture. Ensuite, nous pouvons cliquer
ici avec le bouton gauche de la souris et vous verrez que
les pièces adjacentes sont automatiquement attribuées en
fonction de la tuile au centre Cette tuile n'a donc pas de tuile, elle est
donc automatiquement
reconnue. Oh, j'ai besoin des coins
et des pièces latérales que nous avons assignés sur le terrain. Et je peux continuer à utiliser
le pinceau comme ça. Et vous verrez qu'
il
génère automatiquement les
côtés et les coins. Cela peut avoir certaines limites,
comme le fait de devoir faire un deux par deux et une ligne
pour avoir l'air correct. Cela dépend vraiment de la série de
carreaux, car il existe différentes
manières de construire les carreaux. Mais à tout le moins,
c'est beaucoup,
beaucoup plus rapide que si
vous
deviez attribuer manuellement toutes ces tuiles
latérales et d'angle. Le simple fait de laisser l'ordinateur le
déterminer pour vous en fonction des
règles de terrain que vous définissez, comme nous venons de le faire, représente
un gain de temps considérable Nous allons donc le remplir. Il y a aussi l'
outil Paint Seau ici, nous pouvons
donc simplement cliquer sur cette zone où tous les
carreaux sont identiques. Et oh, eh bien, nous devons également
utiliser E pour supprimer l'effacement. Et maintenant, nous avons cliqué avec
le bouton gauche de la souris et tout est rempli. Comme vous pouvez le constater, il
sélectionnera la région que
vous recherchez. Donc ça pourrait être tout
ça. Si vous voulez le remplir avec
un terrain
carrelé complètement différent,
vous pouvez le faire en un terrain
carrelé complètement différent, définissant une terre battue, en passant
à la terre battue ici et en la déclarant
abaissée. C'est donc un peu plus avancé que ce que
j'avais l'intention de faire, mais définissons un autre terrain avec
cette terre ici,
le genre de terre orangée sur le genre de terre orangée laquelle la terre peut
passer en herbe. Alors, en haut à droite,
déclarons un nouveau type de terrain, et je vais l'appeler terre battue. Ce brun est bon, je pense. Il se peut que vous ne
vouliez pas utiliser, par exemple, un brun sur des carreaux bruns afin de voir plus facilement où vous avez défini et où vous ne l'avez pas fait. Mais si ça marche pour
toi, c'est très bien. Quelle que soit la couleur que vous souhaitez
attribuer, c'est parfaitement correct. OK, nous allons
donc travailler avec la saleté
peinte sur la fenêtre en
carrelage, et nous allons
faire exactement la même chose avec
ces carreaux en terre battue. Ici, nous peignons
les huit en haut à gauche, pas en bas à droite,
puis les six en haut, comme ça. Et je vais juste continuer
comme ça. Celui-ci n'est pas clair, mais je vais choisir
les quatre en haut à droite, et nous verrons s'il
fonctionne correctement. Si, lorsque vous
dessinez réellement avec votre terrain,
cela ne semble pas, vous avez peut-être oublié
l'un des points ici ou là, que ce soit sur
ou en dehors, au centre ou sur les côtés. Il
faut donc parfois un peu d' essais et
d'erreurs pour bien faire les choses. Mais
ça vaut vraiment le coup à long terme. Donc, continuez à vous déplacer, vous savez, dans la même forme. Placez les coins et les côtés là où il y a de la saleté et marquez-le comme étant de la saleté, puis
continuez jusqu'à ce que vous ayez
fini de faire le
tour du cercle. OK, et puis finissez avec les trois
tuiles du bas. Nous allons nous occuper de la saleté claire et passer par-dessus la saleté
foncée pour le moment. OK, et ça a l'air bien. OK, tu sais quoi ?
J'ai indiqué que j' allais m'occuper de
la transition entre la terre battue et l'herbe. Mais en fait, avec
cet ensemble de carreaux, je ne pense pas que ce soit nécessaire ,
car ces carreaux pris
individuellement ont un peu de transparence plutôt que de
l'herbe à côté de la terre. Vous n'avez donc pas à définir le terrain gazonné individuel comme faisant partie de la terre, comme celui-ci, où vous pourriez prendre ces
autres carreaux et dire : « Oh, c'est de l'herbe là-bas,
puis de la terre en bas à gauche ». Parce que c'est de
la transparence ici, donc ce n'est pas vraiment nécessaire. Mais dans d'autres ensembles de tuiles,
vous devrez peut-être le faire. Si vous savez qu'un
coin est censé être de l'herbe,
alors vous le marquez comme de l'herbe à cet endroit coin est censé être de l'herbe, . Donc, avoir deux types de terrain
pour un coin ou un côté. Mais ici, je pense que
nous n'en avons besoin que d'un. Laisse-moi essayer et voir à quoi ça va
ressembler. Je vais donc aller sur Tilemap. Nous allons faire de la saleté, et nous
essaierons de dessiner dessus. Je pense à ce dont
nous avons réellement besoin. OK, donc oui, ici nous
pouvons voir que
les côtés sont marqués comme
transparents. Je me trompe. Je vais donc essayer de marquer
ces côtés comme de l'herbe, mais je ne pense pas
que cela nous donnera le résultat escompté. Je pense que ce que nous
devons faire, c'est simplement avoir deux couches distinctes pour
cet ensemble de carreaux en particulier. OK. Je vais donc
essayer de dessiner avec ça. Donc, mode carte en mosaïque, puis dessinez avec de la terre et
essayons. C'est encore un peu
foiré. Je vais juste essayer une boîte. Oui, ça ne marche toujours pas. Control Z annule donc plusieurs fois. Et ce que nous
allons en fait vouloir c'est simplement peindre avec de
la terre sur l'herbe, ou de l'herbe sur la terre
, selon la couche que
vous voulez placer sur le dessus. Je vais donc cliquer avec le bouton droit sur la
racine, ajouter un nœud enfant. Disons une couche de carte en tuiles. Je vais le renommer pour
être Disons Dirt. Je vais le déplacer sous
terre pour qu'
il apparaisse par défaut au-dessus du sol. Donc tout ce qui est en bas
est en fait en haut. Je ne sais pas pourquoi c'est
configuré de cette façon. C'est juste que je l'est. Ensuite,
nous passerons à la poussière. Oh, et nous voulons réutiliser le
même jeu de tuiles, d'ailleurs. Donc, dans le sol, je vais
cliquer avec le bouton droit sur le
jeu de tuiles et l'enregistrer. C'est en haut, à droite,
d'ailleurs. Alors, sauvegardez-le. Impliquée localement dans le projet. Je peux donc créer un nouveau dossier de jeux de
tuiles, puis je vais simplement dire
ground tileset point TRs save OK, maintenant, si nous cliquons sur terre puis que nous allons
sur l'inspecteur, nous pouvons cliquer sur le menu déroulant,
Quickload, set de carreaux de sol OK, maintenant, avec cette couche de
cartes de tuiles, nous pouvons utiliser les mêmes jeux de tuiles
que ceux que nous avons déjà définis
précédemment C'est en quelque sorte la façon dont
les ressources fonctionnent en général. Il est très facile de les
partager entre
plusieurs nœuds ou
plusieurs scènes, etc. en partageant les
ressources de cette manière OK, donc nous allons
dessiner avec de la terre ici, puis je vais
dessiner avec de la terre ici, et vous
allez voir que la terre repose
parfaitement sur le dessus parce que nous
peignons sur différentes couches, donc cela apparaît juste au-dessus de
l'arrière-plan et il y a de la transparence
ici sur ces bords latéraux, l'herbe
comble essentiellement les trous. L'autre méthode que j'ai
montrée, où toutes les informations de texture, telles que
le gazon et la terre, se dans un seul sprite serait plutôt de
configurer les différents
terrains sur une seule tuile, ce qui est plus
compliqué, honnêtement Je vais donc renommer le
sol en herbe. Parce que nous allons
être plus précis à ce sujet. Nous avons donc deux couches de cartes en tuiles, et il est beaucoup plus facile de
les
manipuler que ne l'
aurait été une carte en tuiles. OK, voyons où nous en sommes. Nous voulons probablement plutôt dessiner un chemin de terre. OK, donc pour que la
terre soit correctement assignée, nous voulons tracer une ligne
deux par deux. Vous voulez donc utiliser
l' outil rectangle
ou le clavier. Si vous ne faites qu'une seule ligne de tuiles, ça va
finir comme ça. Sur la base du
site de tuiles, je ne sais pas comment se baser sur les
informations présentées ici. Il n'y a pas
de vignette transparente en haut et en
bas, donc ça ne marchera pas. Vous devez en fait
faire un chemin de deux pixels de haut comme celui-ci, puis
simplement faire glisser votre boîte, et cela fonctionnera pour cela. Nous pourrions donc simplement créer
des chemins sur le niveau, peu comme celui-ci, vous savez, dessinant
simplement deux chemins larges où
vous voulez qu'ils aillent. Et cela va en quelque sorte rendre un peu
plus intéressant que d'avoir du gazon
ordinaire. Mais c'est
à vous de décider comment vous
voulez, vous savez, organiser cela et le rendre
plus intéressant. Donc, si vous avez déjà joué, disons, à Sim City, c'est exactement ce
que je fais ici en ce moment, par exemple créer le réseau routier et le
placer où je veux. Je ne vais remplir aucune zone
résidentielle où que
ce soit ou quoi que ce soit d'autre. Mais le simple fait d'avoir quelques
tuiles supplémentaires sur la carte est un peu plus intéressant que
de l'herbe. OK. Nous verrons donc si c'est
une bonne chose. Je vais appuyer sur Play. Et oui, notre personnage a quelque chose sur quoi
marcher maintenant, donc c'est un
peu plus intéressant.
11. Placer des arbres comme éléments de carte: Maintenant, je pense que ce
serait une bonne idée d' ajouter des accessoires
au niveau du jeu Nous avons donc également quelques accessoires ici , dans le
dossier d'environnement Il y en a donc
des animés et des statiques. Nous pourrions simplement
commencer par les arbres comme accessoire
le plus simple que nous puissions
ajouter au niveau de jeu Alors allons-y, euh, je ne sais pas. Nous allons double-cliquer ici et vous pourrez voir les
modèles d'arbres là-haut. Nous pourrions donc vouloir
récupérer ces grands arbres, et nous pourrions simplement le faire avec un exemple de nœud Sprite two D. Et nous pouvons les exprimer de
manière très simple. Tout ce que nous avons à faire
, c'est d'accéder
au fichier PNG et de le
faire glisser dans la scène de jeu. Il va créer
automatiquement un Sprite two D ici Il suffit donc de le renommer en Tree puis nous allons
prendre cette texture, et nous n'allons pas
dessiner la texture entière Nous allons en dessiner
une région. Nous voulons donc utiliser
une texture d'atlas afin sélectionner la
région que nous dessinons. Alors cliquez avec le bouton droit ici,
et je vais copier cette image très rapidement car nous allons
cliquer sur le menu déroulant, accéder à la texture Atlas, qui va désactiver temporairement
cette texture Développez-le, puis cliquez avec
le bouton droit de la souris et collez la texture que nous venons de
copier dans l'atlas. Et voilà que
ça réapparaît. Nous voulons maintenant
cliquer sur Modifier la région. Ensuite, à l'intérieur d'ici, nous
passerons au mode Snap, Cid Snap, à la molette
centrale de la souris pour zoomer, et nous allons simplement saisir
cet arbre comme ça, appuyer sur Fermer, et nous avons
un arbre dans la scène OK, maintenant, en
fonction de votre style de jeu, vous pouvez décider d'ajouter des formes de
collision à votre arbre. Vous le feriez de la même manière que vous le feriez avec, par exemple,
un personnage de joueur. Donc, si nous examinons le personnage du
joueur, vous pouvez le voir comme une forme de
collision ici et vous pouvez faire en sorte que les objets entrent en collision avec les arbres Cependant, pour cette démo, nous voulons minimiser
le nombre de collisions que nos ennemis vont
faire avec n'importe quel personnage
du jeu. S'il y a beaucoup d'objets susceptibles d'
entrer en collision dans
le jeu et que nous n'
y ajoutons pas un agent de navigation ou
que nous n'utilisons deux D du corps du
personnage pour qu'ils puissent se déplacer et glisser
le long de la forme de collision, vous allez avoir des
ennemis bloqués Bien plus simple que cela
serait d'éviter la collision et de laisser n' importe quel personnage traverser
l'arbre, l'avoir là. Uniquement pour les visuels.
Nous avons l'arbre ici. Je vais
cliquer avec le bouton droit sur la scène, et nous allons simplement créer un nouveau
nœud pour tous les arbres. Je vais donc dire nœud 2 D, créer, et nous le déplacerons
hors de l'arbre, donc ça devrait être un monde souterrain Et je pourrais juste le
renommer en accessoires. Je vais déplacer l'arbre
à l'intérieur d'ici. Ensuite, nous pouvons simplement dupliquer cet arbre autant de
fois que nécessaire. Je vais donc d'abord cliquer avec le bouton droit de la souris et
enregistrer la branche sous forme de scène. Nous allons mettre l'arbre dans
un nouveau dossier, je pense. Je vais l'appeler.
Allons-y avec Objects. Oui, et je vais
juste le mettre à l'intérieur d'ici. Donc, trois points sur TSN. Nous pouvons appuyer sur Enregistrer N si nous
voulons modifier l'arbre, remplacer par un
autre type d'arbre, puis nous pouvons simplement
passer à la scène. Pour ce faire, il vous suffit de trouver cette petite icône ici
et d'ouvrir un éditeur, afin que vous puissiez modifier cet arbre et le
changer comme bon
vous semble si vous voulez en changer toutes les
copies dans le monde. Permettez-moi de vous en donner un exemple. Nous avons donc l'arbre. Je vais dupliquer
plusieurs fois, puis je vais appuyer sur W pour déplacer
les copies dans la scène. Sélectionnez donc l'arbre 2, W, déplacez-le dans la scène. Le mode Déplacer est ici.
Le mode de sélection est disponible. Vous devez donc le sélectionner
puis passer en mode déplacement. Maintenant, je veux
changer l'arbre, toutes les copies de l'
arbre dans le jeu. Je passe donc simplement à la scène de l'arbre, puis ici sur la droite, nous allons développer l'atlas,
modifier la région, puis sélectionner
cette zone rouge à la place. Alors arbre rouge, appuyez sur
Fermer, appuyez sur Enregistrer, et maintenant, de retour dans le monde, tous les arbres sont du genre à feuilles d'
automne rouges. Maintenant, je vais
retourner dans l'arbre, et je vais annuler cela. Appuyons donc plusieurs fois sur Control
Z. Nous allons simplement opter pour l'arbre vert
standard. Et si vous voulez deux
types d'arbres, trouvez simplement la scène de l'arbre
dans votre hiérarchie ici. Vous pouvez donc simplement cliquer
ici avec le bouton droit de la souris et le dupliquer. Appelons ça l'
automne des arbres et appuyons sur OK. Ouvrez Tree Autumn pour
double-cliquer. Zoomons sur l'arbre, je vais prendre la texture
et modifier la région, et nous pouvons simplement récupérer ces arbres
rouges d'ici. Et maintenant, si nous allons dans le monde, nous pouvons y placer les arbres d'automne, ou nous pouvons simplement y placer l'
arbre en faisant simplement glisser la scène directement dans la scène
mère, le monde Si vous vous y
habituez, vous pouvez remplir la
scène assez rapidement. Maintenant, il y a une chose que je
veux changer ici, et peut-être que je devrai le
démontrer pour que cela soit évident,
c'est qu'en ce qui concerne le tri en Y, la position et la scène arborescente
du sprite importance car nous allons trier en
Y à partir de la position centrale Donc, partout où le personnage
touche le sol, c'est généralement là que nous
voulons positionner le sprite Donc ici dans ce style de jeu parce que je l'ai fait avec
le joueur, non ? Nous voulons donc nous
assurer que les personnages
trient en fonction de leur position. Cela vaut également pour les objets. Pour démontrer pourquoi
c'est un problème, revenons aux accessoires de la scène
principale Je vais passer commande
ici sur la droite. D Y Sort activé dans le
monde entier, faites de même. Accédez à la commande et
choisissez WySort activé. OK. Et maintenant, si nous jouons et que nous déplaçons notre personnage
devant un arbre, eh bien, les caméras ne nous permettent
pas de le faire. Ajoutons donc une caméra de
suivi afin de
pouvoir nous déplacer un peu plus sur
la carte. Je vais prendre
le joueur,
cliquer avec le bouton droit de la souris, ajouter un nœud enfant transformer deux D à
distance, puis sur la droite, nous voulons l'attribuer à la caméra. Nous voulons mettre à jour la position et non la rotation ni
l'échelle, alors décochez-les. OK, maintenant si nous appuyons sur
Play, alors arrête et joue. La caméra va
suivre notre joueur, et c'est une caméra de
suivi de base dans Gudo OK, nous arrivons donc à cet objet. Si nous sommes ici, vous
pouvez voir que nous
trions derrière l'arbre,
ce à quoi nous nous attendions. Mais si j'en arrive à
mi-chemin, les personnages sont
maintenant
pratiquement debout dans l'arbre. Visuellement parlant, nous
voulons toujours que le personnage soit derrière l'arbre jusqu'à ce qu' il arrive
à peu près ici. Sinon, ça a juste l'air bizarre. Donc, pour corriger ce saut
dans la scène arborescente, vous pouvez cliquer ici
pour ouvrir un éditeur. Et nous voulons que ce
sprite soit là. Mais je pense que si vous
déplacez simplement le sprite comme ça, parce que c'est le nœud racine, cela ne résoudra rien Nous allons donc retourner dans le monde, et oui, appuyons simplement sur
Play. Tu vas voir ce que je veux dire. Nous allons aller ici, et
cela va changer la position où ils apparaissent ces arbres,
et non la position d'
où ils sont triés, est-ce pas ? Tu vois que le
problème est toujours là ? Nous devons donc revenir
à la scène de l'arbre, et je vais cliquer avec le bouton droit de la souris. Je vais ajouter un nœud enfant, un nœud, je vais
cliquer dessus avec le bouton droit de la souris et en
faire la racine de la scène. C'est donc le véritable
arbre à la racine, et maintenant ce ne sont plus que
les deux D du sprite Ainsi, lorsque vous insérez un objet
dans une autre scène, la racine apparaît essentiellement
à sa position centrale. Il s'agit donc du centre
du nœud parent racine à deux D, et nous pouvons maintenant
décaler le sprite Donc, si je prends ce sprite, il est déjà décalé, mais vous pouvez simplement le
déplacer en W là où
vous en avez besoin N'oubliez pas que votre position de
transformation est décalée par rapport à la racine, et que la racine est l'endroit où
elle sera réellement instanciée au
point 00 ici C'est pourquoi il
est nécessaire d'avoir une base numéro deux D, puis d'imbriquer un
sprite en dessous Nous voulons donc également faire la
même chose avec l'automne des arbres. Mais vous
remarquerez peut-être que
ces objets étant très similaires, ils répètent en fait
un certain nombre d'étapes. Donc, ce que nous pouvons
réellement faire, c'est avoir une scène héritée basée sur l'arbre vert d'été où nous ne remplaçons
que l'image srt, mais tout
le reste est pareil pour cet arbre Je vais donc supprimer la scène d'automne
ici. Arbre d'automne Supprimons cela. Oh, je dois le supprimer et
fermer la scène. Supprimez-le donc, puis ici, assurez-vous de
le fermer également. Donc, n'économisez pas. Et puis, dans le
monde, il se peut qu'il
ait toujours une copie de la scène parce qu'il ne la supprime pas
complètement. C'est juste que maintenant, il n'y a scène
parentale à laquelle ça pourrait être consacré. Je vais
aussi le supprimer et le sauvegarder. Nous avons donc déplacé toutes
les instances. OK. Et maintenant, en bas à gauche, nous voulons cliquer avec le bouton droit sur Tree, créer nouvelle scène héritée. Nous avons donc maintenant une scène non enregistrée
basée sur la scène parent. Nous pouvons l'enregistrer sous le nom Tree Autumn, et nous voulons le mettre dans le dossier des objets.
Alors, gardez-le. Et la seule chose que nous
changeons ici, c'est le sprite. Appuyez donc sur Modifier la région et récupérez le sprite de l'arbre
d'été, puis appuyez sur Fermer Et si nous revenons
à la scène principale, vous verrez que nous
pourrons à nouveau citer l'automne des arbres. Il semblerait que j'ai vraiment fait une bêtise. Nous devons donc rendre la texture de l'
atlas unique. Sinon, vous vous
retrouvez avec cela où il remplace les arbres. Passons maintenant à la scène de l'automne des arbres, nous voulons prendre
ces deux D lumineux, et le premier réflexe que j'ai eu a été de simplement modifier la région et de la remplacer par
celle-ci ici en bas. Mais c'est en fait incorrect. Et laissez-moi vous expliquer pourquoi. Donc, ici,
il s'agit d'une ressource de texture, et les ressources sont partagées entre toutes les scènes
qui y font référence. Et notre arbre et notre arbre d'automne font
référence à la même ressource Donc, si nous modifions ses propriétés,
comme la région de l'atlas, tout comme la région d'édition
ici sur la scène d'automne, ces mêmes propriétés seront également
mises à jour sur la scène
arborescente d'origine, car elles partagent
la même ressource. Il ne s'agit donc pas d'une nouvelle copie
de la ressource de texture. Il s'agit littéralement de la
même ressource. Nous voulons donc
cliquer avec le bouton droit de la souris ici, puis le
rendre unique dans la scène automnale. Et maintenant, nous pouvons
remplacer cette texture par cette texture ici. Sélectionnez donc l'
arbre d'été et cliquez sur Fermer. Appuyez sur Enregistrer. Si nous passons
à l'arbre vert, vous devriez voir qu'il contient toujours sprite
de l'arbre vert.
Nous pouvons aller dans le monde entier. Il semblerait que certains
de ces arbres n'aient pas été référencés, nous devrions
donc peut-être les
supprimer très rapidement Je vais donc
prendre des accessoires et faire en sorte que ce soit 00. Ensuite, je veux prendre le nœud des accessoires et
le verrouiller Donc, si vous cliquez ici, vous pouvez le verrouiller, et oui, cela devrait l'empêcher de bouger. Donc, si j'appuie sur W et que j'essaie de déplacer le nœud des accessoires maintenant,
il ne bougera pas Donc, une chose importante à noter
est que vous avez un
nœud parent en deux D ici, accessoires, toutes les positions de ses
enfants sont
en fait basées sur la position du parent Donc, si vous avez un
nœud de regroupement comme des accessoires, mais que vous avez toujours besoin
qu'il s'agisse d'un nœud deux, il est
probablement judicieux de le verrouiller J'appliquerais donc la
même chose si vous avez un nœud de
regroupement d'ennemis ou de projectiles, ce que nous
aurons probablement plus tard Maintenant, nous pouvons simplement ajouter
nos arbres aux accessoires, alors je vais juste en ajouter
quelques-uns. OK, donc si je prends cet arbre que nous venons de créer, que j'
appuie sur W et que j'essaie de le déplacer
au-delà du point de cening, vous remarquerez qu'une
fois arrivé ici, il disparaîtra simplement derrière l'herbe et la terre C'est donc pour cela que
le tri est fait. Donc, ce que nous allons
devoir faire c'est en haut à gauche
pour l'herbe et la terre, nous allons
devoir les sélectionner. Je pense que vous pouvez même
les sélectionner tous les deux en même temps. Ensuite, allez sur le côté
droit. Nous cherchons un
ordre, prenons leur indice Z et le
réglons sur
quelque chose comme moins dix, toute valeur négative. Cela fera donc en sorte
qu'ils soient toujours derrière tout ce qui
a un indice Z de zéro. Donc, si nous sélectionnons l'
arbre maintenant, que nous allons sur W et que nous le déplaçons, c'est maintenant corrigé. Il apparaîtra toujours
au-dessus de ces autres objets. Il s'agit donc simplement de la façon dont
nous superposons notre scène. Certains objets peuvent être
triés avec d'autres objets sur
le même index Z, comme le caractère dans l'arbre. Mais d'autres objets, tels que la carte en tuiles, devraient
toujours être en arrière-plan pour ces carreaux de sol ,
car les personnages sont
debout sur le sol Vous devez
donc voir les personnages avant
de voir le sol. OK. Et maintenant, nous voulons
simplement ajouter d'autres arbres
à la scène. Vous pouvez simplement
les sélectionner, les dupliquer et les déplacer vers le haut. Assurez-vous de les placer dans le nœud Props en tant que parent
uniquement pour des raisons de tri Ensuite, nous allons simplement
les sélectionner et
les dupliquer. Vous pouvez en dupliquer
plusieurs à la fois. Donc, si vous
voulez juste un certain modèle, nous pouvons simplement créer un groupe d'arbres et les
copier tous. Vous pouvez même les déplacer
dans leur propre sous-groupe, comme dans le cas d'un
arbre parent, puis
nous aurons un tas d'arbres
différents et
vous pourrez les masquer afin de ne pas avoir
autant de nœuds d'arbres qui nous aurons un tas d'arbres
différents et
vous pourrez les masquer afin de ne pas avoir
autant peuplent Si ça t'
aide. OK, alors déplaçons
un peu plus quelques arbres, et je pourrais juste
sélectionner ces dix arbres. Et je vais, oui, essayons le blocage
que j'ai mentionné. Je vais simplement cliquer avec le bouton droit de
la souris et ajouter un nœud enfant. Disons nœud deux
D, bloc d'arbres. Je vais attraper tous les arbres, déplacer sous le bloc d'arbres. Il suffit donc de les sélectionner tous. Maintenant, je pourrais enregistrer cette scène de
blocs d'arbres dans le projet, et nous allons vouloir
enregistrer ce bloc d'arborescence d'objets. Maintenant, nous pouvons simplement dupliquer
le bloc d'arbres, contrôler D W, déplacer comme
ça et simplement remplir la scène selon nos besoins avec des arbres où
nous voulons qu'ils soient. moment donné, vous voudrez
probablement personnaliser un
peu plus, mais je pense que c'est un moyen
rapide de prototyper la scène, et j'espère que cela
ne semble pas trop mal lorsque nous appuyons sur Play
et que nous avons zoomé Mais oui, si je le faisais
arbre par arbre, cela prendrait probablement 20
minutes ou quelque chose comme ça. Donc, si nous devons apporter
quelques personnalisations,
comme ici, si nous zoomons,
je vois que cet arbre, vous savez peu près de la route,
peut-être que je voudrais le modifier pour que je
puisse appuyer sur Q puis cliquer dessus avec le bouton
gauche Nous pouvons voir que cela fait partie
du bloc 3 de Tree. Nous pouvons cliquer avec le bouton droit de la souris
dans la hiérarchie et créer des enfants modifiables Et puis pour
celui-ci, en particulier, nous pouvons maintenant sélectionner les
arbres et les déplacer. Donc, comme ça, nous
avons une sorte de bloc d'arbre
personnalisé. OK, et on peut le cacher.
Alors maintenant, nous n'avons affaire qu'à 15 blocs d'arbres au
lieu de 150 arbres. Nous pouvons jouer, passer en mode jeu et simplement nous promener dans
notre monde de jeu. Et à partir de ce zoom, c'est assez difficile à deviner Il suffit de copier-coller la même configuration
d'arbre dix fois, mais c'est beaucoup
moins ennuyeux que d'avoir de l'herbe, non ? Par exemple, nous avons le
chemin, nous avons de l'herbe. Si nous y trouvons des fleurs
ou d'autres objets, cela pourrait presque
ressembler à un niveau de jeu légitime Oh, et voici un
arbre que nous pouvons réparer. Donc, vous savez,
quelques tests de jeu. Tu peux trouver des trucs
comme ça.
Zoomons et corrigeons ce problème très rapidement. Cela fait donc partie du bloc 2 de
Tree. Si vous regardez à l'
écran, vous
pouvez voir le nom
du nœud que nous
survolons Il s'agit donc du nœud parent, celui
dans lequel
la scène est
Enstus, le bloc d'arbre, et
non
de ses nœuds enfants contenus dans cette Pour le rendre modifiable,
cliquez avec le bouton droit de la souris sur Tree Block
2, enfants modifiables Appuyez sur Q pour passer en mode sélection, sélectionnez cet arbre,
déplacez-le, et nous pouvons également saisir
celui-ci, le
déplacer et simplement apporter ces
petites modifications Et oui, à en voir le zoom arrière, on
dirait qu'aucun
arbre n'est plus sur la route. C'est donc probablement
le strict minimum de ce dont nous avons besoin pour continuer.
12. Ajouter des souches et fixer le tri en y: Je cherchais donc dans
le pack Pixel Crawler des fleurs qui pourraient être disposées autour de la scène pour l'
embellir un peu Je ne l'ai pas vraiment vu dans la version gratuite, malheureusement. Mais je suppose que nous avons
ces problèmes ici. Nous pouvons essayer de
nous en servir comme accessoire pour combler un peu les lacunes et rendre les
choses
un peu moins ennuyeuses Nous allons donc prendre cela et créer
une nouvelle scène de souche à partir de celui-ci. Je vais donc
répéter les mêmes
étapes avec l'arbre. Je vais le déplacer vers la scène. Passons à la texture. Cliquez avec le bouton droit sur Copier. Copiez donc cette texture. Ensuite, dans le menu déroulant, cliquez sur une nouvelle texture d'atlas, puis nous allons
coller l'atlas ici. Comme ça. D'accord, vous
devriez voir l'image dans son intégralité. Nous voulons maintenant modifier la région et sélectionner le moignon que nous
voulons utiliser dans notre scène Donc, euh, je pense que celui-ci a une souche
légèrement moins rougeâtre, qui ressemble plus
à notre arbre actuel Alors faisons-le. Appuyez sur Enregistrer. Je vais maintenant cliquer dessus avec le bouton
droit et l'enregistrer dans une nouvelle scène. Nous allons donc dire stump point TACN. Maintenant, si vous vous souvenez bien, nous voulons également compenser
cette souche Il se peut que nous en ayons besoin de toute façon. Je pense que dans ce cas, il faut que ce soit
quelques pixels plus bas. Cela signifie donc que nous avons besoin d'un autre
nœud deux D dans la racine. Cliquez donc avec le bouton droit sur Ajouter un nœud enfant, nœud deux D, puis
cliquez avec le bouton droit de la souris pour en faire la racine. Bon, maintenant c'est juste
un Sprite deux D. D'accord, donc la texture du moignon
est un Sprite deux D, puis la racine Maintenant, nous allons enregistrer
la scène de la souche. Prenez le sprite, appuyez sur W, déplacez-le probablement vers
le haut pour le trier en
Y. Retournez dans le monde.
Maintenant, nous avons le moignon Créons d'autres souches et créons d'autres souches
tout au long de la scène S'il vous arrive de
sélectionner accidentellement l'herbe ou la terre, il vous suffit de
monter en haut à gauche et de verrouiller les
nœuds comme ça. Et maintenant, vous ne devriez pas être en
mesure de les sélectionner, je crois. Donc, si nous appuyons sur Q et sélectionnons le moignon ou
autour du moignon, OK À présent, ces nœuds ne
devraient pas pouvoir être sélectionnés en cliquant
sur la carte Passons aux
souches d'ici. Ils n'utilisent pas cette
bonne scène de base. En fait, je vais simplement les
sélectionner et les supprimer. Et débarrassons-nous également du
nœud deux D. OK, recherchez une souche dans le
projet. Transférez ça dans des accessoires comme ça. OK, maintenant on fait un zoom arrière. Nous trouvons ce puisard, appuyons sur W pour le déplacer, le
positionnons où vous le souhaitez Vous a contrôlé pour le dupliquer. OK, maintenant son nom provient du fait qu'il est considéré comme un accessoire, donc c'est plutôt
ce que nous recherchons Et il suffit de mettre quelques souches
sur la scène, vous savez, objets que vous pouvez rencontrer et qui sont plus intéressants à
regarder que de l'herbe Bien sûr, le pack
contient d'autres éléments comme des bâtiments pour, par
exemple, un jeu de bricolage Je ne pensais pas qu'ils étaient
les plus appropriés. Et si vous voulez vraiment y
construire des bâtiments, je pense que vous pourriez commencer
à dire que vous avez vraiment besoin de formes de collision et éventuellement d'agents de navigation pour rendre les choses plus crédibles Mais nous restons aussi
simplistes que possible, parce que nous
faisons juste, vous savez,
un jeu très simple semblable à un
survivant Je pense qu'il y en a déjà assez dans
le cours pour ne pas
submerger qui que
ce soit, mais si au final,
vous voulez vraiment comprendre les agents de navigation
et
les souches, faites-le moi savoir ce soit, mais si au final, vous voulez vraiment comprendre agents de navigation
et
les souches, faites-le moi J'ai quelques vidéos sur
YouTube pour ce genre de choses. Si vous recherchez l'agent de navigation du
didacticiel Chris, vous devriez
être en mesure de les trouver, si vous voulez
commencer. Mais oui, ça a l'
air d'être une bonne
mise en scène . C'est bon, joue Allons courir partout. Notre scène. Nous avons les souches. Maintenant, nous pouvons simplement
le parcourir. C'est bon. Maintenant, ici, c'est
un peu moins bien. Nous pouvons constater que le tri
sur cet arbre n'est pas correct. En fait, l'arbre ne
trie pas du tout. Je pense donc que
nous devons aborder la scène des arbres d'automne
et essayer de résoudre ce problème. OK, alors passons à vue de la scène
locale en haut à gauche. Nous regardons la scène automnale des
arbres. Cliquez sur la racine. Et peut-être que ce
dont nous avons besoin ici, c'est vérifier pourquoi le tri est
activé pour cette scène, et vous devrez peut-être le faire également
dans la scène parent. Le tri Y est donc activé. Notez que mes jeux
sont toujours en cours d'exécution Je peux
donc revenir en arrière et voir immédiatement si
cela a fonctionné ou non. Et actuellement, ce n'
est pas le cas. Alors laisse-moi voir cet arbre dans le monde. Cela fait-il réellement
partie du parent ? Oh, tu sais ce que ça doit
être ? Ce sont les Tree Blocks. OK, nous devons donc aller
dans les blocs d'arborescence,
cliquer sur le bloc d'arborescence pour
commander YSort Enabled Ah oui, lorsque vous créez un
nouveau niveau de hiérarchie,
si vous souhaitez toujours que le tri Y soit présent, vous devez attribuer YSordEnabled
au niveau parent Donc, Props a activé YSorting,
mais pas Tree Block. Maintenant Tree Block le fait. Donc, si je reviens au jeu,
c'est pourquoi trier. OK, nous voulons donc pouvoir
marcher sur les souches et voir à ce que nous
puissions trier
devant et
derrière la souche Et dans l'
ensemble, cela fonctionne. Maintenant, j'ai aussi remarqué qu' il y avait un petit
problème avec les arbres. Ils font le tri, ou moins c'est eux qui faisaient
le tri, attendez. Laissez-moi vérifier avec l'arbre ici. Oui, celui-ci est en train de trier. Mais la position d'où il est
trié est plutôt étrange. Donc, ce que je
veux vraiment faire, c'est passer la scène de l'arbre de base pour qu'
elle s'applique aux deux arbres, et m'assurer que vous êtes en mode
local ici si le jeu s'exécute
en haut à gauche. Sélectionnez le nœud Sprite two D car nous contrôlons
le décalage du Sprite Appuyez sur W, puis déplacez-le vers le bas, probablement
quelque part comme là. Je vais revenir au jeu maintenant. Et puis tu essaies
de marcher comme ça, tu devrais voir que le
tri en Y est bien meilleur. Nous voilà donc
debout devant
l' arbre, comme on pouvait s'y attendre. Et puis nous voilà
debout derrière l'arbre. C'est donc bien mieux.
Vous devez obtenir ces compensations correctement, sinon les choses ne se passeront
tout simplement pas bien Et cela semble
être la plupart de ce
dont nous avons besoin ici pour les accessoires de niveau Je pourrais aussi créer un groupe de
souches, donc je pourrais simplement prendre
ces 16 souches et leur donner un parent Faisons donc un clic droit et
revenons à un nouveau nœud. Ensuite, nous allons créer un nœud deux D. Maintenant, toutes ces souches
ont été regroupées sous un nœud deux D. Nous allons
appeler cela le bloc de souches Nous allons cliquer ici avec le bouton droit de la souris,
enregistrer le bloc de souche tant que scène à part entière dans
le dossier des objets Et maintenant, nous pouvons simplement dupliquer
notre moignon, appuyer sur W, le
déplacer sur notre
écran, et simplement,
vous savez, mettre des souches
ailleurs Ce n'est donc pas exactement comme la génération
procédurale ici, mais une idée similaire
où nous essayons simplement remplir le mappage
avec le modèle. Parmi les paramètres, qui consistent simplement
à dupliquer les positions
des souches,
puis à les Ça a donc l'air un peu différent. Et on peut rejouer
un jeu une fois de plus. Nous avons le tri Weiss
qui fonctionne plutôt bien ici. Peut-être que pour le moignon, nous
voulons le modifier de quelques
pixels afin de pouvoir
passer à la scène du moignon Passons ensuite à la vue
locale et déplaçons le sprite de deux D vers
le bas de quelques pixels Voyons donc comment
cela se passe en ce moment. Euh, peut-être que j'ai confondu la
direction. En fait, peut-être
devons-nous le faire plus comme ça, puis appuyer sur Enregistrer. Nous allons donc le déplacer vers le haut. OK,
c'est derrière le moignon C'est devant le moignon. OK. Oui, ça a l'air
un peu correct. Ainsi, juste le bas
du moignon doit être en dessous
du point 00 du parent Et nous allons nous promener. Oui, nous ne verrons que des
souches et des arbres. Il n'est pas vraiment nécessaire d'être
très varié ici, car l'accent est mis uniquement sur le
combat, il s'agit de monter de niveau, d'obtenir des notes et ce
genre de choses Mais
le fait d'avoir quelque chose en arrière-plan
le rend plus intéressant. Je voulais donc simplement
passer en revue tout cela. Vous pouvez, bien entendu, déplacer
manuellement certaines de ces souches si elles
se retrouvent sur la route de la
même manière qu'auparavant Alors partons à la découverte du
monde entier. Trouvons cette souche qui était
sur la route, d'accord ? Je vais appuyer sur Q, nous allons le sélectionner. Nous voyons donc le bloc 3 de Stump ici
sur la gauche. Cliquez avec le bouton droit de la souris et sélectionnez « Enfants
modifiables ». Cliquez ensuite sur le moignon, éloignez-le et
faites de même avec les
autres souches que vous trouverez Et en voici une. OK, je vais donc
sélectionner ce nœud, bloc 2 de
Stump. Nous
modifierons les enfants Cliquez ensuite sur le moignon
individuel, W pour le déplacer, éloignez-le, et c'est fait D'accord, nous pouvons également le faire
avec cet arbre ici. Cela fait donc partie du bloc 5 de
Tree. Rendons-le modifiable. Sélectionnez l'arbre, déplacez-le. Oh,
il y en a un autre ici. Intéressant J'ai dû dupliquer un
bloc d'arbres au même endroit Oui, c'est vrai. Passons
par ici. C'est bon. OK, je ne vois pas vraiment d'
autres arbres sur la route. Il y a une souche ici, donc je vais essayer de
la réparer aussi. W pour le déplacer,
le mettre de côté. Rendez le parent modifiable
si nécessaire. Et ça
va probablement presque bien se passer. Une dernière. Des
enfants tellement modifiables. Alors sélectionnez-le. Rendez le parent modifiable, sélectionnez le nœud individuel, éloignez-le.
Et c'est en gros ça. Donc
, réduisez tout ne pas
encombrer votre hiérarchie C'est l'une des raisons pour lesquelles j'ai créé le nœud accessoire au départ Euh, si vous aviez des textures de
fleurs ou d'autres doodads, peut-être des rochers, vous les mettriez probablement sur
une couche séparée de rochers ou de
doodads ici
et vous les positionneriez une couche séparée de rochers ou de
doodads ici simplement sur un indice Z
supérieur à celui de l'herbe et de la Ce serait une bonne
façon de commencer. Alternativement, ils peuvent être
leurs objets individuels vus. Mais je ne suis pas sûr
de la performance. Je suppose que si cela
fait partie de la carte des tuiles, c'est probablement bien
mieux que s'ils étaient, vous savez, leur propre
nœud dans la scène du jeu. Mais tant que vous n'en
avez pas trop, ce n'est probablement pas un euh Ce sera
donc essentiellement
la
partie du cours consacrée à la cartographie des tuiles Et à partir de là, nous pouvons
simplement passer à la configuration des armes et des ennemis,
à
gagner de l'expérience, à la montée en niveau, aux PV, à toutes ces fonctionnalités qui
ressemblent à celles d'un RPG Rogue
13. Projectiles survenus avec un minuteur: Le personnage peut se
déplacer. Nous avons une
sorte de
monde de jeu sur lequel jouer. Ensuite, nous devons
créer une attaque
chronométrée qui créera
un projectile que nous
pourrons utiliser pour attaquer ennemis sans avoir besoin autre saisie clé
de la part du joueur Dans les jeux de survie, vous
finissez généralement par accumuler un tas
d'armes différentes, se
déclenchent automatiquement pour vous La seule chose à craindre
est de vous promener sur l'écran et de laisser les armes faire le travail
tout en évitant les ennemis. Et c'est essentiellement
la boucle de jeu. Alors commencez par ça. Créons le
script et le joueur de notre arme. Donc, dans cette scène en deux D, je vais
cliquer avec le bouton droit sur la racine. Nous allons ajouter un nouveau
nœud enfant D, le nœud deux D ici. vais le renommer
en arme, Je vais le renommer
en arme,
cliquer dessus avec le bouton droit de la souris
et joindre
un script pour qu'il soit Weapon DotGD Et cela peut aller dans le dossier
du lecteur pour le moment. Nous allons donc avoir
ce script d'arme. On pourrait même en faire
une arme à deux D, honnêtement. Donc, si nous voulons accéder
au système de fichiers, nous pouvons le renommer
en arme deux D, si cela a plus de sens OK, donc ce dont ce script d'arme en deux
D aura besoin
pour créer les objets du
jeu de projectiles qui sont
en fait la
représentation en deux D de l'arme qui peut infliger des dégâts à
un ennemi dans le monde du jeu, c'est qu' il
va nous falloir un chronomètre Je vais donc dire var
timer ou type timer. Maintenant, vous pouvez
les ajouter directement dans l'inspecteur de scène ici
sur la droite, comme vous le feriez pour d'autres nœuds. Mais je ne veux pas
avoir à le faire pour
chaque
script d'arme que je crée. Donc, pour rendre cela un
peu plus rapide et plus facile, je dirais que la fonction de
soulignement est prête Ainsi, lorsque notre script sera prêt, nous allons simplement prendre
la variable timer et la régler sur une nouvelle minuterie. Eh bien, ajoutez le minuteur en tant qu'enfant, alors ajoutez le minuteur enfant. Cela signifie que
ce nouveau chronomètre
existera sous l'arme. Si nous retirons l'arme, nous retirons également le chronomètre. Ensuite, nous voulons nous connecter
au signal du chronomètre. Le temporisateur émet donc un signal de
temporisation, et nous voulons le connecter
à une fonction, une fonction appelable, afin de
pouvoir indiquer un délai Et ici bas, nous pouvons
fonctionner à la fin du compte à rebours. Maintenant, ce délai d'expiration du signal
n'envoie aucune donnée, nous n'avons
donc pas besoin
de parenthèses Et puis cette
fonction
aura un type de retour nul. Donc, lorsque le temps imparti expire, nous voulons simplement
lancer notre sort. Nous voulons invoquer les
projectiles. Je pense donc que cast est un bon
nom pour cette fonction. Nous allons donc simplement dire lancer, et nous voulons
indiquer la direction dans laquelle notre projectile
va être lancé Donc, si nous faisons face vers le haut, nous
allons lancer vers le haut. Nous pouvons donc obtenir une référence à la
direction opposée pour cela, mais nous y
reviendrons dans une seconde. Nous allons donc avoir la fonction cast, et cela va prendre la direction
P du vecteur deux, la direction dans laquelle nous
projetons, et nous pouvons renvoyer la valeur void pour cela. Donc, pour que le
signal de temporisation soit atteint, nous devons d'abord démarrer
le chronomètre Nous allons donc dire Timer Dot Start. Ainsi, le délai que nous voulons
définir pour
créer une instance
de projectile dépendra de
la définition de chaque arme à projectile Plus tard, nous aurons différents
niveaux d'armes peut
donc que nous
changions le temps de recharge au fur et
à mesure que l'arme recharge au fur et
à mesure que l'arme augmente, afin de
pouvoir tirer plus souvent ,
ce serait une façon de renforcer notre personnage. Pour l'arme à deux D, nous
allons vouloir avoir cette définition en
tant que ressource que nous pouvons utiliser pour que notre arme
sache comment fonctionner. Passons donc à l'exportation de la réalité virtuelle, et disons à
la définition du type d'arme, et nous allons
devoir la créer. Donc, dans le système de fichiers, étendons-nous vers l'extérieur,
puis je vais créer un nouveau
dossier pour nos armes Je vais donc cliquer avec le bouton droit
sur les ressources et créer de nouveaux dossiers d'armes. Et dans ce dossier, je vais simplement créer une nouvelle ressource. Cliquez donc avec le bouton droit sur Nouvelle ressource. Et créons-le comme ressource de
base pour le moment. Je dirais la définition de la lance. Comme notre personnage est un
ragon, nous lui donnerons une lance
comme arme par défaut Je vais donc l'enregistrer ici, Script, nous devons créer notre
nouvelle définition d'arme. Faisons donc un clic droit sur les armes, créons un nouveau script. Disons la
définition de l'arme pour le moment, et elle va hériter de la
ressource et la créer Passons maintenant à la définition des
armes. Donnons-lui le
nom de la classe, la définition de l'arme. Et c'est ici que
nous allons définir les statistiques dans les détails de l'interface utilisateur comme le nom de la façon dont notre arme est représentée
dans un format de données, mais pas dans le monde du jeu. Il s'agira plutôt de
la classe des projectiles, qui s'étend du
nœud au D. Nous en avons donc
besoin d'un certain nombre pour tout assembler Je dirais que le système d'arme est probablement la partie la plus
compliquée, alors je vais essayer de l'
étudier en profondeur. Donc, tout d'abord, nous
souhaiterons peut-être définir un nom. Donc, à l'export, le nom de la variable. Les nœuds ont donc par défaut une propriété de nom, mais pas
les ressources. Nous pouvons donc en tirer parti
en définissant un nom de chaîne
personnalisé. Ce
sera donc le nom d'affichage, nous
l'avons représenté dans l'interface utilisateur. Ensuite, nous pourrions dire à export var icon of
type texture two D. Plus tard, nous ajouterons blocs de statistiques
personnalisés pour
chaque niveau d'arme, mais c'est trop
pour cette vidéo. Donc, pour le moment, ce dont nous avons besoin à partir de là, c'est
peut-être quelque chose comme une fonction de refroidissement, et nous pouvons réussir un niveau ici parce que nous
ne savons pas vraiment quel niveau se trouve l'arme d'
après la définition de l'arme. Cela va être réglé sur l'objet en deux
D de l'arme d'exécution ici. Parce que cela augmente de niveau dans le jeu. Et puis la définition est
plutôt une définition d'éditeur. Il définit le
fonctionnement de l'arme à chaque niveau. Ce sont donc des choses distinctes. Le niveau de l'arme passe donc
à D. Nous voulons passer au niveau où
elle se trouve actuellement. Nous pourrions donc dire, niveau P, et ce sera
un entier. Nous allons remettre un flotteur pour
refroidir l'arme. Donc pour le moment, je
vais simplifier choses et disons simplement
si vous changez un point. Plus tard, nous pourrons le rendre
plus costumé en résolvant le temps de recharge en
fonction du niveau que nous passons Mais il suffit de
rester simple pour que nous puissions vérifier que toutes les armes
en D fonctionnent réellement. Donc, dans Weapon Two D, nous
voulons démarrer le chronomètre à, disons, le
point de définition Get Cool Down. Et nous allons simplement passer un point négatif ici parce que nous
voulons le changer. Je mets donc une petite note ici
pour me rappeler de connaître
le niveau réel,
juste une note pour que, vous savez, une
fois que nous aurons testé
que cela fonctionne, nous puissions fois que nous aurons testé
que cela fonctionne, continuer à partir de là et
implémenter pleinement le système. D'accord, nous allons également
vouloir pouvoir obtenir l'instance de projectile que
nous essayons de créer Faisons donc simplement une
fonction get scene. Nous pouvons également passer le niveau. Cela va donner
une scène pleine à craquer. Allons-y et créons
cette scène d'arme, le projectile,
plus précisément Donc, dans une vue en deux D,
allons-y et ajoutons une nouvelle scène. Nous allons créer
une scène en deux D. Je vais le renommer
Spear. Faisons un clic droit
dessus, joignons un script, et ce
sera projectile point GD Je voudrais probablement
enregistrer ceci et, oh, disons le dossier des armes. Je pense que c'est
logique. Et puis ouvrez Create, c'est annuler. Create se trouve ici, puis nous voulons lui donner le nom de
classe projectile, et nous allons enregistrer le TSCN à l'intérieur des
armes afin de pouvoir
réellement Nous voulons y associer
un Sprite. Cliquez sur Lance, attachez
un nœud Sprite en deux D, puis nous allons
récupérer l'arme Ce qui fera partie d'une texture d' atlas
en haut à droite. Faites donc une texture d'atlas. Et puis
chargeons rapidement à partir de notre projet. Je crois que c'était 16 sur 16. Ensuite, nous devons
obtenir notre texture. Passez donc à l'art en bas à gauche. Allez dans Pixel Crawler, allez dans Armes, Wood Et puis Word Dot PNG, on le place dans
le slot Atlas. OK. Maintenant, nous
pouvons modifier la région, zoomer, et nous voulons la
lance, qui se trouve ici Contournons donc
cela et appuyons sur Fermer. OK, maintenant nous avons
le sprite de lance. Nous pouvons donc au moins voir
notre projectile apparaître dans le jeu une fois qu'il est
chargé Nous voulons ajouter cette scène. Revenons au joueur, et je vais
ouvrir le script de l'arme. Ensuite, je vais cliquer avec le bouton droit sur la définition de
l'arme
et sur le symbole Loup. Et pour obtenir la scène, nous allons simplement faire
quelque chose comme retourner le chargement. Et maintenant, nous voulons ajouter
cette scène de lance. Donc Spit Dot TSN. Vous pouvez voir que vous
pouvez simplement le trouver dans les ressources, les armes point TSEN et le mettre dedans Encore une fois, il s'agit
d'une mesure temporaire simplement pour rester simple afin que nous n'ayons pas à la mettre en œuvre
complètement. Donc, dans notre arme en deux
D, lorsque
nous lancerons, nous allons
voir cette arme d'après sa définition. Nous voulons donc dire var, projectile
sera du type projectile, et nous allons le définir
comme égal à la définition Get SN et nous allons
dire moins un ici pour
le niveau. Tu sais quoi ? En fait, nous pourrions simplement commencer à déclarer le
niveau réel de l'arme. Faisons-en donc un niveau 1. Je dirais au niveau de la variable d'exportation. Ce sera un type de type entier, qui
commence à un. OK, maintenant nous pouvons simplement passer le niveau à ces fonctions, rafraîchir et nous faire voir. Cela n'a
encore rien à voir avec cela , mais au moins
nous l'avons là. Et, bien entendu, lorsque nous augmentons le
niveau de notre arme, nous allons simplement
l'augmenter d'un niveau, et cela changera ce que
ces fonctions nous
redonneront si nous essayons de nous
rafraîchir ou de retrouver la scène OK, nous obtenons donc la scène, puis nous
voulons l'instancier. Ensuite, nous voulons l'
ajouter en tant qu'enfant à notre groupe de projectiles
et à la scène principale Où trouvons-nous le nœud dans apparaissent
réellement les
projectiles Passons à la vue en 2D de la
scène mondiale, et je vais minimiser cela. Faisons un clic droit sur Monde,
puis en haut à gauche et ajoutons un nouveau nœud, deux D. Je
vais juste renommer
ces projectiles Passons maintenant en haut à droite, et je vais
utiliser les groupes ici. Nous allons assigner un groupe
au nœud des projectiles. Ajoutez donc un nouveau groupe. Je vais juste créer des projectiles, en
minuscules, les rendre globaux, et je dirais que le nœud dans lequel tous les projectiles OK, maintenant nous pouvons voir le nœud des projectiles
contient ce groupe, et nous pouvons référencer le nœud en le
faisant d'abord dans Revenons donc au script. C'est le point souligné par les projectiles. Nous pourrions également déclarer cela
comme une constante si nous le voulons. Je dirais donc un groupe de
projectiles constant, ce qui fait de la constante toutes les majuscules
la convention standard Cela indique clairement qu'il s'
agit d'une valeur constante qui ne changera pas et qui se différencie une variable normale telle que le
niveau ou la définition, qui peut changer
pendant le jeu Mettons-le donc
égal aux projectiles minuscules, Nous allons donc vouloir
obtenir ce nœud et l'ajouter
à ce nœud. Alors mettons-le en cache. En tant que variable locale, disons var
projectiles parent, et ce sera un nœud Donc, pour que cela soit prêt, faisons-le avant le chronomètre. Souligner le
parent des projectiles est égal au nœud G. Mais il faut d'abord récupérer
l'arbre. Donc, get tree point get
first node and group, et nous voulons le groupe de
projectiles, qui est un nom de chaîne Dans la plupart des cas, les chaînes et les noms de
chaînes peuvent être
utilisés de manière interchangeable. Il passe
automatiquement d'un type à l'autre dans
de nombreux cas à l'arrière. Nous pouvons le déclarer
sous forme de nom de chaîne ici car c'est ce qu'
il attend pour cela. Nous obtenons donc le premier
nœud du groupe. Si cela n'existe pas, nous allons probablement
avoir une erreur dans la console, ce qui
est une bonne chose. Nous devons donc simplement nous
assurer que nos niveaux de jeu
comportent réellement un
nœud de projectiles comme celui-ci Si vous le souhaitez, vous pouvez enregistrer ce nœud dans votre
projet et le réutiliser, cliquer avec
le bouton droit sur Enregistrer la
scène des branches et peut-être que nous
créerons un dossier de niveaux. Pour tout ce qui concerne
les niveaux , mettez les projectiles sur
TSC ici Ensuite, si vous continuez à les
réutiliser à partir de là, ils seront toujours dans
ce groupe de projectiles, et vous ne devriez pas
les
désynchroniser entre plusieurs désynchroniser Vous pouvez maintenant réutiliser la scène des
projectiles sans soucier de la
variation des valeurs entre les
niveaux sur lesquels vous l'utilisez, ce qui pourrait être
un peu utile Maintenant, une fois que nous avons
créé le projectile, nous voulons nous assurer
qu'il sera ajouté en
tant qu'enfant au parent du
projectile Soulignez donc les projectiles (projectiles
parent et enfant). Comme ça. On peut
s'en débarrasser maintenant. Ensuite, nous
voulons simplement nous assurer que la position globale est égale à la position globale de l'arme 2
D. Supposons donc que la position
globale du projectile soit égale à la
position globale ici Nous prenons donc la position
des deux nœuds D de l'arme. Ensuite, nous devons passer
sa direction au casting. Faisons donc simplement le
vecteur à deux points, non ? Ce sont les capitales.
Une valeur constante. Et maintenant, le script devrait
pouvoir s'exécuter sans erreur. OK, il y a donc la scène. Je sais quel temps de recharge régler. Et il sait qu'il faut créer une copie
du projectile au-dessus du nœud à deux D
de l'arme
chaque fois que le temps imparti est écoulé Alors allons-y
et essayons-le. Nous pouvons voir get
cooldown et null. Nous n'avons donc pas encore défini
la définition de l'arme. Nous pourrions donc dire, affirmer que la définition n'
est pas égale à null. Chaque arme nécessite donc
un ensemble de définitions d'armes. Nous devons donc
aller voir le joueur. Nous devons trouver cette
arme à deux nœuds D. Je vais le renommer arme 2 D. Passons à l'
inspecteur en haut à droite, puis définissons notre définition
d'arme ici Donc, nouvelle
définition d'arme, élargissez-la. Nous allons peut-être
vouloir l'icône et le nom. Je vais donc appeler ça une lance. Et trouvons l'icône de la scène
de la lance. Nous pouvons donc simplement prendre le même sprite et le
copier sur l'icône Je vais donc faire un clic droit sur
la texture. Et copiez. Passons maintenant à la
scène du joueur où définition de
l'arme est
définie et il suffit de
cliquer avec le bouton droit sur l'icône et de la coller. OK, voici notre
représentation de la lance dans notre interface utilisateur. Nous appuyons donc sur Play, et la lance passe en instance toutes
les 1 seconde Maintenant, notre projectile
ne bouge pas encore. Il n'a aucun code pour le faire bouger, mais nous avons le temps travailler pour lancer
les projectiles dans le monde au
bon moment en
fonction de notre classe de définition d'arme Bien sûr, il y
a bien plus que cela. Nous n'avons pas encore modifié les statistiques ou quoi que ce soit d'autre, mais
c'est un bon début J'y reviendrai donc plus
en détail dans le prochain
14. Déplacer les projectiles dans la direction du lancement: À ce stade,
nous sommes prêts à commencer à introduire ennemis
dans le jeu,
puis à faire en sorte que nos projectiles
puissent les atteindre en se
déplaçant sur l'écran OK, alors faisons en sorte
que nos projectiles puissent maintenant
se déplacer dans la direction dans
laquelle ils ont été lancés Je vais passer
à la scène de la lance,
et voici le projectile de
lance, celui qui apparaît réellement
dans le monde
du jeu Ouvrons ce script. Et nous allons vouloir ajouter une fonction
de lancement à endroit afin que, lorsque notre
projectile est instancié, un autre script puisse lui indiquer
dans quelle direction il va se déplacer Je vais donc mettre
en place la fonction Launch, et nous allons
passer dans une direction. Donc P souligne le vecteur de
direction deux, et c'est dans cette direction que
les projectiles
vont se déplacer Nous voulons donc prendre cette direction de
lancement et la
rendre locale afin de pouvoir l'utiliser dans nos fonctions de
processus, de
procéder à des mises à jour à chaque seconde et de
traduire notre
nœud de projectile
sur l'écran La direction de la
variable sera donc le vecteur deux, et nous allons le
configurer ici même lors du lancement. La direction est donc égale à la direction P. Maintenant, une fois que nous lançons
un projectile, nous voulons également le mettre en attente pour qu'il soit libéré après un
certain temps Sinon, les projectiles
qui n'
atteignent jamais une cible existeront
pour toujours dans votre monde de jeu et
finiront par entraîner des problèmes de
performance Nous voulons donc nous assurer
que les objets finissent par se libérer. Nous pouvons donc le faire en attendant un certain
temps. Je vais dire « attendez ». Cela signifie donc essentiellement qu' il
reviendra au reste
du code qui suit cette ligne une fois la
condition remplie. Nous allons donc dire « Get Tree ». Nous obtenons donc l'arbre de scènes
actuel dans lequel se trouve
ce
nœud de projectile, puis nous allons
créer un chronomètre Et on lui donne une heure.
Disons donc simplement 1,0 seconde. Tout le reste, vous pouvez le
laisser par défaut. Tout cela
signifie donc que nous attendons la méthode de temporisation sur
le chronomètre que nous créons à
l'aide de l'arbre de scène, et que nous attendons une seconde
que ce délai se produise Et une fois que c'est fait, on peut juste le placer en quart
sur le nœud du projectile Cela va libérer le
projectile sur tout ce qui se trouve en dessous. Maintenant, un projectile
qui touche une cible, s'il touche une cible, va
probablement se retirer de
lui-même avant cela,
mais ce n'est
qu'une solution de rechange : s'il
rate complètement tous les ennemis, il finira par se libérer OK, et ensuite nous avons besoin que le
projectile bouge réellement. Supposons donc qu'un
processus de soulignement fonctionnel ou un processus physique soit probablement un
peu plus approprié Faisons-le. Donc, en général,
vous utilisez un processus physique pour tout ce qui implique déplacer des objets physiques
dans le jeu. Maintenant, il s'agit d'un deuxième nœud D. Nous n'ajoutons rien de tel que physique du corps
rigide
au projectile, mais simplement pour que ses mouvements soient synchronisés avec tout le
reste du jeu Si le processus physique est réglé 60 fois par seconde ou 60 périodes de
mouvement par seconde, il se déplacera
60 fois par seconde, juste pour qu'il soit cohérent
avec tout le reste du. Exportez la variable speed ici en
haut du type float. Nous allons l'ajouter à 100. Ce ne sera donc que la
vitesse par défaut du projectile. Donc, des éléments tels que
la vitesse et la durée de
vie de
ce projectile dans le monde du jeu sont statistiques que je souhaite extraire un script de statistiques distinct afin
que nous puissions les définir par arme et par niveau de chaque arme de manière beaucoup
plus organisée Mais pour le moment,
c'est suffisant, nous y travaillerons plus tard. Nous voulons donc dire
traduire ici. N'importe quel nœud TD peut se traduire
sur l'écran. C'est un mouvement sans
aucune collision. Et nous allons dire
que nous nous déplaçons dans la direction multipliée par la
vitesse, multipliée par le Delta. Maintenant, si vous voulez savoir ce que cela calcule
lorsque vous débugez, lorsque vous
atteignez un point d'arrêt, vous
devriez peut-être faire
quelque chose de plus Var move, qui est un vecteur deux, sera égal
à ce bit ici, contrôlez X, collez cette extrémité là, puis vous
traduisez simplement le mouvement. Alors maintenant, si vous deviez atteindre
un point d'arrêt, ici, et nous
pourrons peut-être le faire simplement en
appuyant sur Play parce que le processus
physique se déclenchera dès que
cet esprit sera créé, alors nous pouvons voir en bas,
nous avons la valeur de mouvement de
00 et Y est zéro, zéro, parce que nous n'avons pas lancé le projectile avec cette fonction, donc il n'a pas vraiment
le direction pour laquelle
il prend par défaut le vecteur deux
points zéro pour le moment OK, donc je vais
annuler le point d'arrêt. Vous. OK, alors ferme le jeu. Cela soulève en fait un
point intéressant que je voudrais aborder, à que si la
direction est le vecteur 20,
cela
représente probablement un problème car
nous lançons toujours dans
la direction dans
laquelle cela
représente probablement un problème car nous lançons toujours dans
la direction dans les
personnages font face, qui ne devrait jamais être le
vecteur deux points zéro. Nous pouvons donc nous attendre à ce que la fonction de lancement ait
déjà été appelée avant de la mettre pleinement en
scène avec Adhild Préparons donc cette
fonction de soulignement. Et nous allons
affirmer que la direction n'est
pas égale au vecteur 20. Appelez Launch pour définir la direction ou projectile avant de l'
ajouter, enfant Nous voulons donc
exiger d'avoir
déjà défini la direction à suivre
avec la fonction de lancement et noter que nous devons appeler
launch avant d'appeler Add hild Donc, la préparation se produit après OK. Maintenant, si je cours, nous devrions immédiatement appuyer sur l'assertion
comme prévu. Passons donc au script en
deux D de l'arme dans lequel nous ajoutons l'enfant du
projectile Nous voulons maintenant appeler le lancement du point de
projectile dans la direction P que nous
passons dans la fonction Cast Pour qu'il le mette réellement sur
quelque chose de correct. Maintenant, nous pouvons voir qu'
ici, sur le délai d'expiration du vecteur, nous utilisons le vecteur à
deux points à droite Je pense donc que ce serait
un bon moyen de tester. Il doit toujours se déplacer vers
la droite dans ce cas. Le problème ici
est donc vraiment que notre lancement essaie de
faire deux choses distinctes. Je pense qu'il est en fait
plus logique de retirer ce bit de la fonction Ready
puisque nous l'utilisons maintenant. Je vais donc le coller
dedans, Control X, ceci, control V, le coller
dedans. Cela a du sens. Dès que le
projectile est prêt, nous le préparons à être libéré
après un certain temps Cela permet donc à la méthode de lancement de
ne gérer qu'une seule chose, qui consiste essentiellement à initialiser l'objet une fois
qu'il a été créé C'est donc certainement
la meilleure façon de procéder. OK, maintenant appuyons sur Play. Et notre projectile
tire vers la droite. Vous pouvez également constater qu'ils
ne durent qu'une seconde, probablement pas assez, mais c'est un bon test pour s'assurer qu'ils
se libèrent réellement Donc, à ce stade,
il n'y aura qu'une ou deux lances dans
la scène à la fois Cela ne devrait entraîner aucun problème de
performance.
15. Configurer des ennemis et des boîtes à succès: Nos projectiles
se déplacent vers la droite. Maintenant, créons
un ennemi pour que nos projectiles puissent réellement s'y
connecter et le toucher Cela signifie que nous allons configurer une zone de réponse et une zone de réponse dans cette vidéo, et nous nous occuperons des
statistiques plus tard, comme HP. Donc, dans mon projet actuel, je vois en bas de page qu'il y a
quelques avertissements ici. Ils mentionnent simplement
que si vous n'
utilisez pas de paramètre, vous
devez le souligner Je vais donc cliquer sur chacun d'entre
eux et le souligner un
peu Je n'utilise donc pas Delta dans
ce processus physique des joueurs. Je souligne donc le Delta. Cela implique qu'il n'est
pas utilisé. Et puis ici, dans un autre script, je vais faire la même chose. Et pour n'importe lequel
de ces avertissements que vous recevez, répétez simplement. Vous n'utilisez pas le paramètre, puis soulignez-le pour
indiquer que vous comptez
ne pas l'utiliser et
qu'il ne pas l'utiliser et
qu' ne s'agit pas d'un accident
ou d'une erreur Et nous allons aller de l'avant et
créer notre premier ennemi. Commençons donc par un Oc. Je vais créer une nouvelle
scène ici en haut, et nous allons passer à deux scènes en
D sur la gauche. Je vais le renommer en Oc. Nous allons cliquer dessus avec le bouton droit de la souris,
changer le type un corps de caractère deux
D. Et le sélectionner. OK, alors je veux cliquer avec
le bouton droit sur l'orc, ajouter un nœud enfant Nous allons faire un Sprite TwoD ici. Cliquez également avec le bouton droit de la souris ici et
ajoutez une forme de collision enfantine. Et sur la droite,
nous allons simplement créer une forme de petit cercle, peu comme vous l'avez
fait avec le joueur. Et contrôlons, sauvegardons la
scène à l'intérieur des personnages. Je vais créer un nouveau
dossier pour les ennemis. Alors, ennemis, mettez-le dedans, puis sauvez le TAC de l'orque OK, maintenant notre orc a besoin de
Bright, bien sûr. Nous allons donc sélectionner ce nœud britannique, et nous allons descendre en bas
à gauche Nous allons chercher, je crois, des entités, des monstres, un équipage orc, et nous voulons nous en
procurer une J'utilisais donc juste
l'orc par défaut pour que nous puissions récupérer la feuille inactive Je vais sélectionner ce nœud
Bright two D, puis sur la
droite, nous allons
glisser-déposer cette feuille
inactive ici. OK ? Maintenant, évidemment, nous avons une configuration similaire à celle du joueur où nous avons une feuille de sprites Nous devons définir nombre d'images
H de gauche à droite,
ce qui est quatre, comme vous pouvez le constater. Et nous voulons le faire
avec un lecteur d'animation. Je vais donc cliquer sur Ok, ajouter un nœud enfant.
Lecteur d'animation. Sélectionnez donc le lecteur d'animation, descendez en bas, faites une nouvelle animation Idol. OK, et nous devons saisir certaines des propriétés du
sprite Ajoutons donc une piste, une piste de
propriétés, sprite deux D, et nous
allons rechercher des cadres en H.
Alors double-cliquez dessus. OK, puis répétez les
étapes pour le suivi des propriétés, sprite de deux images en D, en V, suivi des
propriétés et la texture du
sprite à deux D. Et en bas à droite, activez
la capture ici,
puis modifiez le
temps de capture à 0,1 seconde. Donc une image par
dixième de seconde. Enfin, sur la droite, nous voulons changer cette durée à 0,4 seconde au total
et activer le bouclage OK. Sur la chronologie ici, revenez au début
de l'animation, cliquez avec le bouton
droit sur Insérer une clé. Nous avons donc nos cadres en H. Nous voulons prendre cela,
et en haut à droite,
nous le changeons en quatre. Ensuite, dans VFrames, nous
voulons insérer une clé. Nous en restons là. Cliquez avec le bouton droit de la souris pour insérer un cadre. Ce sera donc notre première image. Ne vous inquiétez pas de la façon dont il affiche les quatre images en même temps, qui se corrigeront automatiquement en une seconde. Ensuite, nous
voulons cliquer avec le bouton droit de la souris et insérer une touche pour notre texture,
qui, comme vous pouvez le voir
en haut à droite, correspond déjà à
notre animation par défaut Nous n'avons donc pas encore joué
l'animation, elle affiche
donc toujours quatre
images, mais dès que je jouerai, elle affichera la première
image de l'animation inactive,
et la section des images ci-dessous s' actualise automatiquement
selon ce
à quoi nous nous attendions. Nous voulons donc maintenant
passer à 0,1 seconde. Il devrait enregistrer des intervalles de 2,1
secondes, puis cliquer avec le bouton droit
de la souris et taper une touche pour l'image, puis le remplacer en haut à
droite par une touche ci-dessus. C'est donc la deuxième
image de l'animation. Ajoutez ensuite la valeur d'
image de deux, qui est la troisième image ici et la dernière
image de valeur trois, qui représente la
quatrième image de l'animation. OK, maintenant, si nous sommes en train de jouer, nous devrions avoir notre animation
inactive. Et pour le simple personnage ressemblant à un
survivant, nous allons simplement le
faire face à gauche et à droite. Nous avons donc juste besoin d'un nœud
retournant dans ces animations individuelles pour savoir s'il est orienté vers la
gauche ou vers la droite Donc, comme il s'agit d'un jeu
simple comme un survivant, nous ne l'avons que
face à gauche et à droite. Nous n'aurons donc qu'à ajouter
un nœud retournant plus tard. Et à part
ça, nous avons juste besoin nos animations de course inactive et de
mort. Et c'est à peu près tout, sauf si un personnage a besoin d'une animation d'attaque
spéciale. Dupliquons donc
l'animation inactive, et nous ajouterons
notre animation d'exécution. Pour l'animation d'exécution, nous voulons
prendre la texture ici et modifier la valeur et le coin
supérieur droit de la feuille de course. Alors, courez et faites-le glisser
vers le haut à droite. OK. Et cela représente six
images d'animation. Nous voulons donc prendre les images H
ici et les remplacer par six. Ensuite, nous voulons ajouter le
cadre cinq et le cadre six ici. Donc, la touche change
cette valeur et le coin supérieur droit à
quatre, insérez une clé, changez cette valeur en cinq, puis prenez la durée de l'animation et
faites-en 0,6 seconde, appuyez sur Play, et nous devrions
avoir notre animation de course. Maintenant, je pense que c'est mal
décalé, peu comme l'était
l'idole du joueur. Nous allons donc également avoir besoin de
ce réglage de décalage. Passons donc à l'idole. Déplaçons ce personnage vers le haut. Assurez-vous de sélectionner spécifiquement
le nœud sprite. Appuyez ensuite sur W pour passer
en mode déplacement et déplacez le sprite vers le haut de
manière à ce que le point 00 soit
centré sur ses pieds en bas. Il doit se trouver à l'endroit où son centre de
gravité touche
le sol. Ensuite, allez dans Transformer sur la droite et insérez une image-clé. J'ai donc moins 14
pixels comme position Y. Encadrez cela, appuyez sur Créer et
réinitialisez simplement la piste. C'est très bien. Et maintenant, nous devons également saisir le
keyframe de la course. Donc pour courir, nous allons
aller en haut à droite,
et je vais le faire.
Essayons avec 27 pixels négatifs. Essayons une résolution négative de 30 pixels. Je me suis dit qu'ils sont configurés peu comme
le joueur, avec le même artiste et tout ça.
Faisons donc un keyframe Et créez. Et nous avons
notre animation de course. Passons maintenant rapidement
à Idol. OK, maintenant nous avons notre animation de
course à pied. Passons rapidement
à Idle et c'est parti. Et il semble que
les pixels s'alignent. Nous devrons tester cette
fin de partie, bien sûr, si nous voulons réellement
montrer l'animation Idle. Dans ce cas, cependant, il
se peut que nous n'affichions jamais l'animation Idle à moins que l'ennemi n' arrête de courir vers le joueur. Mais l'idée, au moins avec cette
configuration, c'est que l'ennemi
court toujours vers le joueur tant que
celui-ci existe. Il se peut donc que nous ne
voyions jamais réellement l'animation inactive. Cela dépendra de vous. Peut-être que
lorsque le joueur est vaincu, les personnages
commencent simplement à tourner au ralenti au lieu de se déplacer davantage à l'écran car il n'y a
plus de joueur à combattre Mais ce serait juste
un supplément qui n'est pas vraiment nécessaire. Ce dont nous avons besoin, cependant, c'est de l'animation de la mort. Alors allons-y,
parce que je pense que l'
animation de mort comporte six images, et nous allons la dupliquer
pour créer une animation de mort,
alors tapez Death Enter. Nous allons
désactiver la boucle pour cela. Les personnages ne meurent qu'une seule fois. Ensuite, nous voulons prendre
la texture et remplacer par la
feuille Death Sprite en bas à gauche Faites-le glisser dans l'inspecteur
et appuyons sur Play. Et puis si nous passons en mode veille, il semble que tout s'aligne et que
run semble s'aligner. OK, donc c'est probablement une bonne chose. Je suppose que la position sur
le décès est négative 30. Quoi qu'il en soit, nous avons notre Oc. Nous pouvons simplement faire entrer un orc
dans le monde du jeu. Prenons donc Orc ici. Et en fait, nous
voulons probablement une hiérarchie d'ennemis similaire, donc je vais cliquer avec le bouton droit de la souris pour
insérer un nœud. Donc, nœud 2 D, nous affronterons ennemis ou
nous pourrions même être
simplement des PNJ si nous le voulons Peut-être que les ennemis, c'est mieux. Et je vais
lâcher un orc en bas à gauche. Sous les ennemis. Nous pouvons donc voir qu'il ne
montre pas encore réellement l'animation. Je vais donc appuyer sur
Ouvrir et éditer, et nous allons voir
ce qui se passe avec ça. Nous devons probablement, par exemple,
définir une animation par défaut. Je pourrais donc prendre la mort
et la transformer en inactivité. Utilisons-le par défaut comme inactif. OK ? Appuyez sur Play. Revenons
au monde du jeu. Est-ce que cela résout le problème ? Je suppose que non. OK, comme
cela ne fonctionne pas, nous devrions passer à la réinitialisation. Animation. Ainsi, chaque fois que vous ne
jouez pas une animation, elle est réinitialisée à ces valeurs Et nous pouvons voir que
le He encadré ici, si nous regardons en haut à droite,
est en fait réglé sur un. Donc, si nous le fixons à quatre, et je suppose que maintenant nous appuyons sur
Play lors de la réinitialisation, alors c'est ce que nous devrions voir si nous revenons
au monde du jeu. Alors sauvegardez votre scène orc,
allez dans le monde du jeu, et voilà, tout semble
correct Je vais donc appuyer sur W
et déplacer le c. D'accord, puis contrôlons D, dupliquons encore quelques cs. Et puis je pense que
la dernière chose que nous voulons faire ici est de prendre des ennemis et de les activer en
ordonnant mon tri activé. Comme cela est évident
pour tous les orcs, nous voulons qu'ils fassent également le tri
entre eux Cela pourrait être nécessaire. Il se peut donc qu'
il soit nécessaire de s'y installer. D'accord, nos lances peuvent bouger, mais elles ne peuvent
rien toucher Nous n'avons pas créé de zone de frappe, et nos orcs peuvent exister, mais ils n'ont pas de boîte HRT capable de
subir des dégâts HRT, les boîtes à succès et
Gadot D seront donc des D
de la zone 2 Si vous venez
de Unity, cela
ressemblerait davantage à une zone de déclenchement. Passons à Spear
et nous allons créer une zone 2 D que nous
utiliserons comme boîte à succès. Je vais donc cliquer avec le bouton droit sur le nœud d'
ajout d'une lance , Zone 2 D, et je vais le renommer
rapidement pour qu'il devienne la case 2 D. Faisons un clic droit
dessus, joignons un script Maintenant, cela va
probablement ressembler davantage à la racine. Alors laisse-moi voir. Je
pense que le mettre dans le dossier des armes est logique
ici et nous allons appuyer sur Ouvrir. Nous allons donc créer le script
dans Weaponlash Hit Box two D. Create, lui donner le
nom de classe Hit box two D. Bien sûr, dans notre script HIT box, nous voulons nous connecter immédiatement au signal que
la zone possède déjà, est-à-dire la zone entrée Parce que ce que nous
essayons de vérifier, c'est si nous entrons dans la
zone d'une boîte RT. Donc, si la fonction soulignement est
prête, alors une fois prête, nous pouvons établir une connexion par point
entre une zone saisie, et nous allons la connecter
à une zone saisie
, fonction que
nous sommes sur le point de configurer Créez donc un trait de
soulignement de la fonction sur la zone Entrée. Cela va recevoir et
la zone deux D est le paramètre. Donc, zone P, zone deux D et
retour type v D'accord, une zone est entrée dans cette zone, de
quel type de zones nous
intéressons-nous ? Nous nous intéressons
aux boîtes particulièrement endommagées. Donc, si la zone P est une boîte Hurt deux D et que le
type n'existe pas
encore, cela devrait être une époque ici. Alors pour l'instant, nous
pourrions dire quelque chose comme des impressions, alors pour l'instant, nous pourrions dire quelque chose
comme Prance, qui va imprimer un
message sur la console Pourquoi ne pas essayer comme ça ? Les pourcentages et les guillemets signifient que nous allons
le remplacer par une chaîne. Pourcentages atteints. Nous pourrions même dire en position, pourcentages, puis
nous
remplacerons ces chaînes par
un autre signe de pourcentage Et nous avons trois chaînes à remplacer à
l'intérieur de cette chaîne. Nous allons donc
transmettre un tableau de valeurs que nous voulons utiliser
pour le remplacement. Donc, le premier sera, disons simplement « soi ». Nous allons donc
obtenir la case Hit, qui va toucher
la case Hurt de la zone P. Ensuite, nous allons
dire que la position est la position globale
du point de la zone P. Ainsi, une zone deux D est
toujours sur le nœud deux D, elle a
donc toujours une position
globale. Cela fonctionnera
simplement pour détecter que notre boîte de
frappe touche réellement la case HRT. OK, maintenant nous devons
créer une boîte RT sur l'Oc. Passons donc à l'Oc et je vais
cliquer ici avec le bouton droit de la souris pour créer un nœud Agile Zone 2 D. Renommons-le en Hurt Box, et je vais
mettre le B pour case en majuscule Deux D. Faisons un clic droit
dessus, joignons un script. Nous allons vouloir
blesser Box Two D. Cela peut juste contenir des
personnages pour le moment. Nous n'aurons pas vraiment d'objets destructibles, du moins dans cette démo Vous pourriez donc dire : OK, cela appartient davantage
au dossier des objets, ou peut-être que vous organisez tous
vos scripts dans un dossier de scripts
contenant spécifiquement des scripts. L'organisation dépend en
quelque sorte de vous. C'est juste comme
ça que je fais les choses. Les personnages
coupent donc Hurt Box de deux D, nous allons la créer là OK, maintenant ce script, nous devons l'appeler le nom de
classe Hurt Box
two D. Pour le moment, nous n'y changerons
rien d'autre. Nous voulons juste cette étiquette d'
identification, Hurt Box two D. Maintenant, la boîte Hurt, vous pouvez voir qu'elle doit également avoir une
forme de collision. Faisons donc un clic droit et ajoutons un nœud enfant, une forme de collision. Ensuite, sur la droite, je
vais créer une
nouvelle forme de cercle. Nous pouvons donc définir où
ce personnage peut être touché. Je pourrais donc appuyer sur W et le déplacer vers le haut. On peut juste le faire
un peu plus grand ici. Donc si je l'agrandissais, un
peu comme
ça, ce serait bien. Vous pouvez également préférer
une forme de capsule. Donc, si nous sélectionnons la forme de
capsule vous préférerez peut-être également une forme de
capsule ici. Donc, si nous faisons une forme de capsule, qui ressemble plus à un humanoïde, nous pouvons sélectionner la forme de la
capsule Et puis ici,
on peut juste appuyer sur W, le
déplacer ici. Ce serait bien si vous voulez que
tous les pixels
qui apparaissent à l'écran pour le k
soient réellement des zones endommageables Vous pourriez donc faire valoir cet argument. Ensuite, nous voulons juste que ce soit un enfant
de la boîte Hurt. Et puis notre orc
a également besoin d'une forme de collision. Alors, où les pieds peuvent-ils
entrer en collision pour le c ? Cela aura donc
plus de sens en tant que forme de
cercle ici. Ensuite, nous
examinons les pieds des orcs. Rétrécissons-le
ici, quelque chose comme ça. Donc, si nous
choisissions d'avoir des collisions entre nos orcs et d'autres
orcs ou entre le joueur, d'autres accessoires et l'objet, alors c'est la forme que nous utiliserions réellement Maintenant, si vous voulez que vos
ennemis entrent en collision avec d'autres ennemis et
joueurs, etc. lorsqu'ils se déplacent en
utilisant le mouvement et le glissement, c'est
ce qu'
un personnage en
deux D peut faire dès sa sortie de la boîte Mais cela va entraîner un coût
de performance, puisqu'il s'agit en fait de calculer mouvement sur la base de la physique. Si vous souhaitez obtenir le
maximum de
caractères à l'écran, vous pouvez envisager d'utiliser la
traduction à la place, comme nous l'avons fait avec la lance, ce qui signifie qu'elle se
déplacera dans la direction dans laquelle elle essaie de se déplacer, indépendamment de ce qui s'affiche à l'écran Donc, en gardant les choses aussi stupides simples que possible, c'
est à vous de décider ce que vous
voulez à la fin de la journée Et combien de milliers d' ennemis avez-vous besoin à
l'écran à la fois. OK, donc avant de terminer, je pense que la lance doit également avoir une forme de collision
pour la zone de frappe. Je vais donc cliquer
ici avec le bouton droit de la souris, ajouter un nœud enfant, forme de
collision 2 D. Nous
passons en haut à droite. Donnons-en une forme de cercle, puis nous allons prendre la
forme du cercle, la déplacer jusqu'au bout de
la lance et la rétrécir
, quelque chose comme ça Vous préférerez peut-être qu'il
soit en forme de capsule. Cela dépend en quelque sorte du degré
de précision que vous voulez avoir. La capsule pourrait
évidemment être plus ovale ou moins
circulaire. Ou peut-être même juste un rectangle. Donc, si vous voulez utiliser un rectangle,
vous pouvez, disons, prendre vous pouvez, disons, forme d'un
rectangle ici,
rétrécir les côtés comme ceci
, le réduire, et
peut-être comme ça. Donc, utilisez la forme
primitive la
plus simple possible pour la boîte de frappe
tout en essayant de
conserver la forme réelle du sprite là où
cela a du sens Je pense donc que ce
serait très bien. Je ne pense pas que quiconque remarquerait
vraiment que, vous savez, peut-être que cette moitié de
la lance n'est pas tombée ici Si tu
voulais vraiment être pointilleux, tu pourrais le faire comme ça Et oui, peut-être que ce
serait un peu mieux. Juste un peu
moins de chances qu'il touche, il pourrait glisser le long du
bord, ici vers la gauche. Encore une fois, essayez-le pour avoir une idée de son fonctionnement et voyez s'il convient à
votre jeu ou non. Allons-y,
lançons le jeu maintenant, et nous essaierons de faire en sorte que les orcs frappent avec ces projectiles Voyons donc qu'il n'est pas possible d'
instancier une valeur nulle. Niveau. OK. Donc, pour le moment, le projectile n'est plus
placé sur l'arme en
deux D.
C'est intéressant. Passons au joueur, et
je vais prendre l'arme deux D. Nous pouvons voir que la définition de l'
arme est définie ici. Si j'élargis l'arme 2 D, passons à la définition de
l'arme. Nous avons donc le symbole de recherche. J'ai peut-être déplacé l'arme.
Voyons voir. Où est Spear ? J'ai accidentellement déplacé une lance d' lance
d'armes vers ce dossier
différent. Revenons donc aux armes. OK, ça va bien fonctionner
maintenant. Nous allons appuyer sur Charger. OK, et puis nous
avons les lances. Passons donc à la sortie. Je vais le déplacer un peu vers
le bas. Ces orcs sont en fait touchés par la
lance, ce qui est Nous pouvons voir la position
dans laquelle cela s'est produit. Les informations de la case de saisie
ne sont pas très utiles, mais au moins nous savons quel
type correspond à quel type. S'il s'agissait d'un type de zone complètement
différent, le
nom de classe correspondant serait indiqué ici. Et cela fonctionne à peu près.
16. Infliger des dégâts aux ennemis avec des Hitboxes et des statistiques: cases de frappe et les
boîtes de blessures fonctionnent suffisamment pour que nous puissions
encaisser le coup sur la boîte HRT, ce qui marquera
le début des
dégâts infligés à nos ennemis orcs Dans cette vidéo, nous devons donc
configurer les statistiques de l'
orc et nous assurer que nous infligeons des dégâts à l'orc qui
va subir des dégâts lors de l'
impact Une grande partie de ce
didacticiel consistera
à définir les
statistiques de la lance, les statistiques de l'
orc, et à configurer l'interaction entre
les deux Donc, si nous passons au script du
projectile, nous voulons que le projectile
réagisse lorsque la zone de frappe touche
la zone de blessure
en répercutant les dégâts du projectile sur
la zone de
blessure et en la Je vais donc mettre en place une variable at
export pour les boîtes à succès. Ce sera une série
de cases à cocher deux D. D'accord. Maintenant, ceux que je veux assigner lors l'inspection Donc, si je clique
sur Spear array two D, le tableau des
cases à cocher se trouve ici Nous devons augmenter
sa taille à un, cliquer sur un signe sur
le premier élément, puis choisir Hit box. Nous avons donc maintenant une référence à la zone de frappe du projectile
à l'intérieur du script Il est fabriqué sous forme de tableau car certaines armes peuvent en fait
avoir deux ou plusieurs zones de frappe. Nous en faisons donc une
option dès le départ. Et ce que nous allons
faire, c'est nous connecter à chaque signal de la boîte de frappe au moment impact afin que notre projectile
puisse infliger des dégâts Faisons donc un clic droit sur le symbole
Fit box two D. Ici, faites un clic droit sur le symbole Do Lou, et cela passera
au script Hit Box. Donc, plutôt que
d'imprimer ce que nous avons touché, nous voulons réellement
émettre ce que nous avons touché. Créons donc un
signal ici. Chaque fois que la zone de frappe
reconnaît un
coup, nous passons dans
la cible que nous avons touchée ou dans le cas présent dans la zone de frappe
que nous avons touchée. Nous allons donc dire que Hurt box est une sorte de rt box two D. D'accord. Donc, plutôt que d'imprimer ici, découper, et je
vais dire d'appuyer sur le point EMIT, et nous allons le faire passer
avec la zone P comme une Hurt Box deux D. Donc maintenant, si nous passons au script
du projectile, nous pouvons simplement nous connecter à
ce signal une fois prêt Faisons-le donc avant de
passer à la partie attente. Tout d'abord, nous dirons que assert
hit booxes point empty. Nous ne voulons donc pas
que cela soit vrai. Nous pourrions donc dire
égal, égal à faux, et dire qu'il faut au moins une
case de frappe pour atteindre une cible. Maintenant, cela
dépend un
peu de votre intention. Vous pourriez théoriquement avoir un projectile qui
n'a pas besoin d'être touché Cet argument n'est donc peut-être pas
nécessaire, mais pour notre jeu, nous voulons que les projectiles
puissent infliger des dégâts aux cibles ennemies Nous allons donc laisser
cet argument là. Ainsi, après nos affirmations,
nous pouvons dire quatre cases et
cocher des cases Nous allons dire box
point hit point Connect, et nous pourrions dire « hit box hit hit ». Nous allons donc
connecter ce signal à une nouvelle fonction que nous
écrivons ici en bas. Donc, la fonction sur
Hit Box Hit va prendre une case P Hurt
pourrait faire une case de soulignement HRT si nous voulons être
plus Et ce
sera du type Hurt Box
two D et retournera void. OK, donc avec le boîtier HRT, nous allons appeler,
disons, le boîtier P Hurt. Supposons que les dégâts soient causés par des points, et le montant sera basé sur nos calculs ici. Alors, où trouver les
dégâts pour calculer ? Eh bien, déclarons simplement les
derniers dégâts ici. Et nous allons le mettre à
dix pour le moment. Et ce sera un entier. Ainsi, tous les dégâts et PV du jeu
seront basés sur des nombres entiers. Pour faire
simple, techniquement, vous pourriez infliger une fraction d'unité de dégâts, mais
c'est assez confus. La plupart des jeux
n'utiliseront que des nombres entiers. OK, nous allons donc dire que nous nous occupons
des dégâts finaux ici, et nous nous occuperons du calcul
des dégâts plus tard. Nous pourrions donc dire, pour calculer
les dégâts. OK, maintenant notre boîte Blessures, nous voulons ajouter cette méthode d'
infliger des dégâts. Passons à Hurt Box. Je vais donc dire que la fonction inflige des
dégâts, et nous transmettrons les
dégâts d'un entier. Oh, nous pourrions mettre un
type de retour ici dès maintenant, je vais simplement le renvoyer
comme nul parce que nous nous attendons à ce que les dégâts que nous
infligons soient les mêmes que
ceux qu'il reçoit. Nous calculons dans
le script du projectile
plutôt que dans le script de la boîte
Hurt, dans ce cas Modifions-le en un type
de retour booléen. Je conseille donc d'essayer d'
infliger des dégâts ici. La raison en est
que nous allons créer une
condition selon laquelle il est possible que les statistiques
soient impossibles à atteindre Nous allons
donc gérer cela ici. Donc, le dernier point d'échec pour savoir s'
il va réellement subir les dégâts sera l'
invincibilité des statistiques Je suppose donc que c'est plus logique du point de vue de la boîte. Nous allons donc dire que si ce n'est pas le cas, un
point du contrôleur de statistiques peut être atteint, alors nous renverrons false. Maintenant, ce sont les statistiques auxquelles
nous appliquons les dégâts. Il va gérer les
statistiques d'exécution du personnage. Nous allons donc devoir tout
configurer en une minute. Ce serait donc probablement le
bon moment pour le configurer. Donc, ici en haut, nous
allons nous intéresser à Export VR, une référence en matière de contrôleurs à pile. Ce sera donc du
type Stack Controller. Nous allons donc créer un
nouveau script avec. Passons à la
scène de l'organisation en deux D,
puis nous allons cliquer
dessus avec le bouton droit de la souris et ajouter un nœud enfant. Ce sera donc un nœud normal. Ce n'est pas un espace de position. C'est un gestionnaire de statistiques, donc tout est une base de données. Il s'agit donc d'un
nœud, pas d'un nœud TD. Et nous l'appellerons
Stat Controller. accord, cliquez ici. Nous
allons joindre un script. Il s'appellera donc
simplement Sat Controller, et nous le mettrons dans le dossier du
personnage, car notre
personnage principal aura également
une manette de pile.
Créons le script. Je vais entrer le nom de la classe, et je vais contrôler le contrôleur
vPastedN Stat parce que je l'ai copié
depuis l'autre Cela gère les
statistiques d'exécution d'un objet. Nous allons donc
avoir des éléments comme VaraHP qui est un entier, et nous pouvons le définir à un montant
par défaut, peut-être 100 Nous avons également le Var Max HP,
qui peut être le même. L'idée sera que le HP
ne pourra jamais être réglé au-dessus du MX HP. Donc, si vous voulez vous en
occuper maintenant, nous allons ajouter un autre
code à la fin, et je dirais valeur fixe. HP sera donc égal aux hommes de
la valeur
et du maxHP OK, donc ceci ici le limite
juste pour que vous
puissiez toujours régler le HP
au-dessus du MaxHP Nous pouvons également vouloir une variable
pour si l'objet est vivant. Nous allons donc dire far live,
ce sera un booléen. La valeur par défaut sera true. Ensuite, nous avons besoin de
cette fonction sur laquelle nous avons reçu
une erreur. Donc, si je coche Hitbox, il y a la fonction « can be hit Nous devons le mettre en œuvre. Passons donc à Stat Controller. La fonction peut être activée, ce qui va
renvoyer un booléen Nous pouvons donc y mettre toutes
les conditions que nous voulons. Pour l'instant, nous allons
dire que nous reviendrons en direct. Donc, si le personnage est
vivant, il peut être touché. Sinon, il ne peut pas être touché. Donc, de retour ici,
s'il est vivant, il pourra être touché,
mais cela revient à inverser la tendance
avec le k. Donc s'il n'est pas vivant,
nous renvoyons faux En gros. Maintenant, ici, nous allons dire « retour vrai parce que nous supposons
qu'à ce stade, cela a fait des dégâts parce que
les conditions étaient remplies. Nous avons déjà adopté
la clause Guard. Nous voulons donc prendre
le contrôleur SAP, prendre ses HP et le
régler à la nouvelle valeur. Nous devrions peut-être
le calculer juste au-dessus. Et en tant que variable locale. nouveaux PV seront donc égaux
au point PV de la manette des
statistiques, moins les dégâts, ou
simplement moins, en fait. La mission se trouve donc
en fait ici, à
gauche du nouveau HP. Nous avons donc réglé les PV du
contrôleur de statistiques sur les nouveaux PV, et nous reviendrons à la valeur vraie. Nous pouvons également vouloir mettre ici un signal émis
par le boîtier Rt, qui
serait également un signal de frappe OK, donc je veux
tout tester jusqu'à présent. Je vais définir un
point de rupture ici sur la gauche afin que nous
puissions l'atteindre lors de Debug si l'arme parvient à
endommager le personnage Appuyons donc sur Play et voyons
si cela fonctionne à ce stade. Je suis sûr qu'il me manque
un certain nombre de choses. Nous pouvons donc voir en bas de page que
les dégâts infligés n'existent pas, car il s'agit
en fait de trois dégâts maintenant. Nous avons donc changé le nom
, puis nous l'exécuterons à nouveau. Avons-nous atteint le point d'arrêt ?
Nous arrivons ici. Le contrôleur Stack peut être touché, mais nous n'avons pas réellement
attribué le
contrôleur Stack à la RT box. Cela pourrait donc être un autre cas
où nous voulons affirmer en haut que le contrôleur SAT a
réellement été configuré. Donc, assert stat controller
n'est pas égal à null. La HRT Box a besoin d'une
référence au contrôleur pour prendre effet. La HRT Box a donc besoin d'une
référence au contrôleur SAT pour pouvoir modifier ses
statistiques. Alors voyons voir. Si nous passons à TD View, en mode
local ici, puis que nous cliquons sur la RT Box, nous assignerons simplement le contrôleur de pile sur
la droite . Au cas où nous oublierions à
un moment ou à un autre une boîte de saisie, nous avons l'assurance d'avoir
une solution de repli pour nous rattraper Alors allons-y encore une fois. Nous allons y arriver et vous pouvez voir que
nous sommes revenus vrais. Vous pouvez également voir
en bas que le nouveau HP a été réglé sur 90. Notre PV de base pour le contrôleur de
statistiques est de 100, donc 100 moins dix, nous obtenons 90, donc nous savons que la mise
à jour est correcte. Et la prochaine chose que nous ferons
au début de la prochaine vidéo sera de configurer
la machine à états orques afin
que nous puissions passer
de la vie à la mort une fois les PV seront tombés à zéro ,
puis retirer l'
orc de la scène
17. État de mort lorsque l'ennemi atteint 0 HP: Nous voulons maintenant mettre en place une
machine étatique pour nos ennemis. Cela va être
incroyablement simple. n'y aura que deux
états dès le départ
, à savoir l'
état de déplacement ou l'état de mort,
qui l'éliminera du jeu Faisons donc un clic droit sur
Oc ajouter un nœud enfant. Je vais dire HSM ici, et nous allons
prendre le Limbo Nous pourrions le renommer Enemy HSM, puis je vais
cliquer dessus avec le bouton droit de la souris, joindre un script Cela ira donc directement dans le dossier
des ennemis
slash EnemyShsm que nous allons créer. Réglez
le haut ici. HSM ennemi C'est la machine à états pour les
ennemis à l'intérieur du Okay, donc si l'on regarde le HSM du joueur, ça va être
vraiment similaire ici Je pense que, comme nous sommes
passés au Blackboard, ce script n'
a plus besoin de faire directement référence au lecteur
d'animation, ce qui serait correct si je regarde ici dans le plan
Blackboard La deuxième référence n'est pas nécessaire. Je peux donc simplement
supprimer ça ici. Nous allons donc
copier ce code depuis le HSM du joueur vers
le script HSM ennemi Supposons donc qu'
au lieu d'un joueur, il
s'
agisse d'un script de PNJ, sur
lequel ses
statistiques pourraient être définies Les PNJ de type PNJ affirment donc
que le PNJ n'est pas nul. L'agent NPC doit donc
être défini sur le HSM, et nous allons l'initialiser
avec le script Donc, il suffit de changer
les noms ici principalement. donc au script NPC, passons à la scène
orc dans D View. Et nous allons
vouloir cliquer sur OC, joindre un script. Nous dirons que c'est un PNJ, et nous le mettrons dans les personnages et
non dans Enemy, ou cela peut être dans les
ennemis, selon vous Nous allons créer ce script
pour le corps du personnage. Et appelons-le
ClassName NPC. Le PNJ pourra donc facilement
se référer au contrôleur
de pile Il n'est donc pas
nécessaire de faire
référence à ces deux
éléments séparément. À l'intérieur de la machine d'état, il est très pratique d'
accéder aux propriétés depuis l'
agent, car vous savez toujours que l'agent sera présent
sur n' importe quel
script de machine d'état une fois que vous l'avez initialisé sur
la machine d'état Donc, si nous exportons les statistiques
VAR ici, et que nous disons «
Stack Controller »,
nous pouvons également y faire référence très facilement dans la machine à
états. Ici, sur la droite, nous
assignons le contrôleur de pile, et maintenant, à l'intérieur du HSM ennemi, les erreurs devraient
disparaître tant que nous
cliquons sur le HSM ennemi.
Eh bien, ce n'est pas bien. C'est censé dire « PNJ ». Il suffit donc de redémarrer le projet
Cadle, d'
aller dans Project, de recharger le projet OK, et ça
devrait arranger ça. Maintenant, nous assignons l'
orc, qui est le PNJ, et nous avons une référence à l'agent ainsi que les statistiques,
et cela devrait être l' essentiel de ce
dont nous avons besoin pour notre machine étatique OK, alors faisons un
clic droit sur le HSM ennemi. Je vais ajouter un nœud enfant. Et faisons un état des limbes. Je pourrais le renommer et dire quelque chose comme NPC move state Eh bien, cliquez avec le bouton droit de la souris
pour joindre un script. Créez. OK, alors maintenant, créons
un état de poursuite pour l'ennemi. C'est là que se situera
la logique de base pour notre personnage se déplace vers
le joueur,
ainsi que pour jouer
l'animation de course dès qu'
elle sera dans l'état. Je vais donc cliquer avec le bouton droit
sur le HSM ennemi. Ajoutons un
nœud enfant, un état Limbo. Je vais le renommer Chase State. Et je vais cliquer
ici avec le bouton droit de la souris, joindre un script. Donc, Chase déclare que cela
appartient probablement à un ennemi. Je vais appuyer sur Créer. OK. Donnons-lui un nom
de classe en haut, Chase State, et nous
lui donnerons un commentaire. Cela va
donc finir par courir vers le joueur où
qu'il se trouve dans le jeu. Pour l'instant,
nous allons juste lui
faire jouer l'animation. Nous allons mettre en place une transition
entre l'état de poursuite l'état de mort et nous assurer
que chute de
notre personnage à zéro PV redonne vie
à l'ennemi dans le jeu. Nous allons donc dire «
underscore » de la fonction « Enter ». Lorsque nous entrons, nous voulons
jouer l'animation de course. Nous pouvons donc même configurer le
soulignement des fonctions, puis nous allons
obtenir ce lecteur d'animation Jusqu'à présent,
soulignez le lecteur d'animation de type lecteur d'animation, et nous allons l'obtenir
dans le Blackboard, comme nous l'avons fait
avec le Le lecteur d'animation est donc égal à
Blackboard point get var. Et nous cherchons le lecteur d'
animation de citations finales, et nous voulons nous plaindre
si nous ne le trouvons pas Nous avons donc le lecteur d'animation. Lorsque nous entrons dans l'état,
nous jouons l'animation. Nous allons donc dire underscore animation player dot play, et nous voulons
jouer l'animation nous avons définie ici en haut Faisons-le à Export var. Disons Chase Animation. Bien sûr. Et ce
sera un nom de chaîne. Je vais le lancer par défaut. Ensuite, nous
le copions ici. Nous jouons donc la bonne animation
lorsque nous entrons dans l'état. OK, et notre HSM ennemi,
nous l' avons déjà initialisé. Nous l'avons déjà activé. Cela va donc probablement fonctionner. Nous pouvons donc voir s'il fonctionne maintenant. Passons en mode jeu. Oh, nous n'avons pas intégré le
lecteur d'animation dans le
Blackboard, bien sûr Il nous indique donc tout de suite
qu'il y a eu un problème. C'est une bonne chose. Cliquez sur Enemy HSM, passez au plan Blackboard
et créons un nouveau plan
Blackboard, gérons-le, ajoutons un lecteur d'animation variable Choisissez le type de chemin du
nœud. Appuyez sur OK. Et maintenant, nous voulons attribuer un
lecteur d'animation
au lecteur d'animation du ou et maintenant nous pouvons
l'utiliser dans nos états. OK, appuyez à nouveau sur Play. Et voyons si nos orcs
sont en fuite. Ils le sont tous. C'est génial. Nous avons donc
besoin de notre état de mort, et nous devons mettre
en place notre transition. Je vais donc
cliquer avec le bouton droit sur Enemy HSM, ajouter un nœud enfant, qui sera Limbo State Renommez-le en Death State. Cliquez avec le bouton droit de la souris, joignez un
script, puis cliquez sur Créer. Nous l'appellerons Death
State au sommet. Donc, nom de classe Death State. OK, maintenant dans notre état de mort, nous devons également jouer
une animation très similaire à ce que nous faisions
dans l'état de Chase. C'est un code que nous allons
en quelque sorte répéter ici, mais comme nous ne faisons que
quelques états pour notre jeu, je pense que créer une nouvelle classe de base est un
peu trop compliqué pour le
moment. Donc je vais juste
le recopier. À l'état de mort.
Eh bien, collez-le dedans. Et je pourrais simplement
dire que l'animation que nous voulons
ici
pour l'état de mort est définie par défaut sur la mort, et que l'animation est
jouée de la même manière Mais ensuite, nous voulons jouer
l'animation ici. Et comme nous n'
utilisons pas d'état de base, nous n'avons pas à nous
soucier de choses comme appeler Super pour nous assurer que le
code d'état de l'animation
s'exécute réellement , car ils
utiliseront tous les deux le programme d'installation, et ils utiliseront
tous les deux Enter. Si vous déclarez une nouvelle
configuration ou une nouvelle fonction Enter, elle remplace en fait
tout ce qui se trouve dans la classe de base si vous oubliez d'appeler
Super. D'ailleurs, vous appelleriez Super comme ça Super signifie simplement que
quelle que soit la classe parent, vous l'exécutez à
ce stade. Vous pouvez donc voir que c'est un
peu délicat et déroutant d'utiliser ce type
d'héritage direct. Si vous avez cinq ou
dix états différents qui sont
tous des états d'animation parce qu'ils jouent tous exactement de la même manière
dans l'animation, cela
en vaut la peine. Mais nous
n'aurons littéralement que Chase et la mort,
donc c'est exagéré Mais Tay devrait mentionner
que c'est aussi une autre façon de
faire les choses Donc, sur Inter, nous voulons
essentiellement
rendre notre personnage invincible. Nous pouvons donc vouloir faire quelque chose comme agent point stats point LI, et nous voulons nous assurer
que ce paramètre est défini sur false. N'oubliez donc pas que lorsqu'un
contrôleur de statistiques n'est pas actif, can be hit » renvoie un résultat faux. Cela
nous empêchera donc de
toucher accidentellement un personnage en état de mort. Ils font également quelque chose comme,
disons, la fonction terminée, et nous déclarons cette fonction
afin que vous puissiez réellement l'appeler depuis l'animation
ou ailleurs. Et nous allons dire que
l'agent doit vous libérer. Libérez donc l'agent Qu. Cela signifie donc essentiellement
la route Aosne the org. Nous allons le libérer ainsi que
tout ce qu'il contient. Lorsque nous appelons la méthode
terminée. Nous pouvons donc maintenant passer au lecteur d'animation à deux vues
en
D ici en bas. Nous allons passer à
l'animation sur la mort. Nous zoomons sur la chronologie,
allons jusqu'à la fin ici. Nous allons ajouter Track, call method track à
l'état de mort. Ensuite, nous allons cliquer avec
le bouton droit de la souris ici, insérer une clé, et nous allons rechercher la
méthode terminée que nous venons de créer. Cela signifie donc que lorsque notre animation de
mort sera
terminée, elle appellera Terminé. L'
état de mort libérera agent dès que
le rendu de
l'image sera terminé
et que tout le reste sera résolu. Donc, en général, vous appelez Quarter,
Not Free,
Freeze immédiatement,
et Quarter attend
que Not Free,
Freeze immédiatement, les autres opérations
soient correctement résolues Cela
réduirait donc en fait le nombre de bugs
étranges que vous pourriez
avoir lorsque vous vous en sortez. OK, donc la dernière
chose à faire est de sauter dans le HSM ennemi Créons une nouvelle fonction
pour les transitions de configuration, qui renverra la valeur void. Nous voulons donc ajouter
une transition entre
notre état de poursuite et notre état de mort lorsque l'événement de
décès est émis. Ainsi, lorsque vous déclarez un
événement comme
celui-ci, il s'agit simplement d'une chaîne à laquelle notre
système va
répondre . Nous pouvons monter ici et
créer un événement de décès constant. Ce sera un nom de
chaîne équivalent à ce que nous allons simplement faire
en minuscules, le
coller
là-bas, et nous pourrons nous connecter aux statistiques de
notre agent comme ceci Supposons que les statistiques
des points des PNJ sur Alive aient changé. Nous n'avons pas créé ce signal, mais je vais simplement
passer ici, alors connectez-vous. Le soulignement de NPC Alive a été modifié. OK, donc je vais le
copier en bas de la fonction Coller
sur NPC Live Changed, et cela
aura la nouvelle valeur Donc, vivant est un booléen. On pourrait dire P pour le paramètre
si nous voulons ici. D'habitude, j'aime bien
faire ça. Et cela va créer
une sorte de vide. Donc, lorsque le PNJ
n'est plus en vie, je veux émettre
l'événement de décès Donc, si P vivant est égal à faux, alors nous allons
envoyer l'événement de décès. OK. Et lorsque nous
ajoutons la transition, cela signifie que
cette transition se produira lorsque
ce décès se produira. Maintenant, cela nous donne toujours un message d'
erreur car nous n'
avons pas l'état de Chase ou à
l'état de décès référence à
l'état de Chase ou à
l'état de décès ici en haut. Nous pouvons donc simplement dire à
export var Chase State, qui est un État limbo, et à export var death state,
qui est un État limbo Enregistrez maintenant le
script dans l'inspecteur. Nous pouvons attribuer l'état Chase
et l'état de mort. Et maintenant, une fois que nous aurons appelé les transitions de
configuration, il se chargera
de gérer ces transitions. Je pense que nous voulons l'appeler
avant l'initialisation, ou peut-être juste après Faisons-le juste après.
Soulignez donc les transitions de configuration nous appelons ça. Nous avons mis
en place nos transitions. Il ne devrait pas être
nécessaire de créer un état de mort pour chasser car aucun
ennemi ne revient
à la vie actuellement, mais vous pourrez
ajouter ce genre de chose plus tard. Ce
serait certainement un thème récurrent, surtout pour les ennemis
morts-vivants. OK, donc la dernière chose à
faire pour que ça fonctionne vraiment vite, passer à la scène de la lance, et de sauter dans la case à succès,
ou est-ce que c'est la lance ?
C'est vrai, la lance. Et nous voulons infliger le dernier
dommage et le fixer à 100, sorte qu'un coup
équivaut à un orc vaincu Appuyez sur Play, et voyons si
tout est réuni. Cela nous donne donc une erreur.
Je n'ai pas créé d' événement
modifié en direct dans les statistiques des PNJ Cliquez avec le bouton droit sur le
symbole PNJ, allez sur le symbole Lou. Cliquez avec le bouton droit sur le
symbole, symbole Lou, cliquez avec
le bouton droit sur Stat
Controller, symbole Lou. OK, et voici nos statistiques.
Créons le signal, afin que nous puissions dire
signal live changed. Et cela va transmettre la nouvelle valeur dynamique sous forme de booléen Nous reviendrons ici et assignerons plus de signaux, mais pour le moment, je veux m'assurer
que ce signal chaque fois qu'une valeur
en direct change Je vais donc dire définir une valeur. Donc, d'abord, nous allons
nous prémunir contre le fait que la valeur soit
la même que celle qui lui est définie. Ainsi, si un live est égal, deux signes égaux à la
valeur seront simplement renvoyés. Sinon, un live est égal à une valeur. Enfin, un point
modifié en direct est émis
avec la nouvelle valeur. Alors, où voulons-nous
calculer Alive ? Eh bien, un bon endroit pour le faire
serait dans ce setter HP. Ainsi, chaque fois que les PV changent, nous voulons vérifier si le
personnage est toujours vivant. Donc, ce
sera juste en ligne si HP est
supérieur à zéro. OK, donc c'est réglé. Nous avons maintenant l'événement Live Changed. Tout cela devrait se déclencher lorsque
le personnage atteint zéro PV. Arrêtons le jeu,
relançons-le à nouveau et voyons si nous
le touchons avec une arme Est-ce que le
personnage se retire lui-même ? Est-ce que ça passe à l'état de mort ? Et nous pouvons constater que
la réponse est oui. Il faut donc 100 dégâts. HP atteint zéro. Un live
prend la valeur false. Le signal est émis. Et puis cela signifie que c'est sur la machine de l'État ennemi que la transition se déclenche
lorsque ce signal est émis. Ce patch sur le HSM ennemi
émet l'événement interne. Ces événements de machine à états
sont donc distincts des signaux. Ils ne concernent que
les signaux d'intelligence artificielle de la machine à états dans Limbo dans le contexte
plus large de Gadot Nous avons donc ce décès
interne,
qui nous fait passer de l'état de
Chase à l'état de mort. Dans Death State, nous jouons à l'animation Death on Enter, mais nous nous assurons qu'elle est définie sur
false ici. En théorie, vous n'auriez pas
besoin de le faire, mais je ne pense pas que
cela fasse de mal s'assurer que si
nous incarnons Death State,
que le personnage ne
soit nous incarnons Death State, plus en vie, je pense que c'est bien. Et puis nous avons la méthode
finale, que nous
appelons en fait simplement depuis l'animation. Comme vous l'avez déjà vu, l'animation de
mort ci-dessous l'appelle juste à
la fin de notre animation, et c'est ainsi que nous
faisons passer nos ennemis en direct
dès qu'ils tombent à zéro PV. Je sais donc que de nombreuses
pièces se rejoignent. Pour cette partie, si vous
n'avez pas encore téléchargé
les
instantanés des parties individuelles, je
vous recommande n'avez pas encore téléchargé les
instantanés des parties individuelles de prendre celui de
cette vidéo si vous avez des problèmes et que vous
voyez où votre
script est peut-être un peu
décalé voyez où votre
script est peut-être un peu Donc, ce que nous faisons ici avec les signaux, c'est le modèle de l'
observateur. C'est très utile lorsque
vous voulez qu'une partie de code réponde à une modification apportée à une autre
partie de votre code. Et quelque chose comme C Sharp, cela s'appellerait événements,
puis gestion des événements. Mais chez Gadot, cela s'
appelle signaux. il s'agit essentiellement
du même concept Mais il s'agit essentiellement
du même concept. C'est donc un modèle
d'observateur. Si vous voulez rechercher
cela et en savoir plus à ce sujet. Ce sera donc
la fin de tout ça
18. Faire tourner et diriger des projectiles avec la fonction Weapon Loadback: OK, donc dans cette vidéo, nous allons
faire en sorte que notre lance tourne dans la
bonne direction après l' instanciation et que
nous puissions également
lancer la lance dans la
bonne Donc, la façon dont nous allons avoir
besoin pour configurer cela se trouve dans le script en
deux D de notre arme ici. Donc, dans notre jeu de type survivant, nous voulons
probablement faire en sorte qu'un personnage puisse avoir plusieurs armes
en même temps. Par conséquent, il est
logique d'avoir une
sorte de gestionnaire pour
toutes ces armes. Nous pouvons donc créer un script de chargement d'
armes qui ressemble à
cette arme en deux D, et nous pourrions l'utiliser comme
exemple pour
résoudre des problèmes tels que comme
exemple pour
résoudre des problèmes tels l'importation individuelle de nos
armes par le joueur Faisons donc un clic droit sur le nœud joueur et
ajoutons un nouveau nœud enfant. Je vais appeler ce nœud deux D, puis nous allons
le renommer Weapons Loadout Nous allons
immédiatement associer l'arme
deux D à la charge d'armes ici, et je devrais renommer l'arme
deux D pour qu'elle ressemble à arme de
lance, en indiquant clairement
ce qu'elle contient réellement Ensuite, cliquons sur Weapons
loadout et ajoutons un script. Ce sera donc un
équipement d'armes qu'il pourra être intégré au joueur,
créé, puis en haut, nous allons charger des
armes par nom de classe Il s'agira donc d'un script de gestion
pour toutes les armes qu'
un joueur possède. Ici, nous pouvons simplement prendre une référence rapide à
la saisie du joueur. OK, et maintenant nous pouvons passer
au script des armes de lance, et nous allons insister sur le fait que chaque fois que nous
avons une arme de lance, nous dépendons du fait
que le parent est
un arsenal d'armes qui sera le même dans tout le
jeu Je pense donc que
la configuration est bonne. Je vais donc faire le chargement de VAR
Underscore ici dans le script en deux D de nos
armes Et ce sera du
type arsenal. Alors, prêts, nous allons
vouloir nous procurer cet équipement. Disons donc que underscore loadout
est égal à get parent, et nous devrions affirmer que
le loadout n'est pas nul Le parent d'une arme doit
être le chargeur d'armes. OK, et il semble que j'ai
peut-être défini le nom de la classe. Est-ce que ce sont des armes avec un S ? Oui OK, donc c'est le chargement
des armes ici,
pas le chargement des armes OK, nous avons donc une référence
au script de chargement parent Cela crée une dépendance, mais cela facilite également l'
accès aux éléments dont nous avons besoin. Donc, au cas où
nous déciderions de changer
ce modèle, je créerai une fonction en bas
pour Get direction. La fonction Get direction
va donc renvoyer un vecteur deux. Et dans ce cas, nous allons
utiliser le matériel pour y parvenir Retournez donc la saisie du
point de soulignement. Direction du point. C'est ainsi que nous
résolvons la direction, mais nous pouvons toujours utiliser la fonction
de direction G pour gérer cela. Donc, si nous appelons, disons, obtenons la direction à dix endroits
différents, mais que nous modifiions le chargement. Nous n'
utilisons donc
plus réellement de chargement ou peut-être que le chargement
n'utilise pas d'entrée, alors il suffit d'aller
ici une fois et de le modifier Peut-être que le chargement a une référence
directe à la direction, alors nous le changeons simplement comme ça, et cela fonctionnera à nouveau. Mais je dois en fait
changer un
peu cela parce que nous n'allons pas
utiliser la direction. Nous allons utiliser la
direction orientée car n'oubliez pas que direction est l'entrée brute. Il peut s'agir d'un point vectoriel zéro, mais nous n'allons jamais
lancer
de lance aux
pieds du personnage dans ce style de jeu Nous voulons donc vraiment
Get facing here, et nous allons passer
à Import point facing. Nous allons donc vraiment déterminer la
direction dans
laquelle le personnage fait
face et à la place. OK, donc prenons ça Get
face et là où nous lançons, nous allons juste faire du casting pour
faire face à la place. Et si nous déplaçons notre
personnage, vous allez déjà le
voir, nous pouvons le lancer dans la
bonne direction, et cela devrait également inclure
des diagonales, comme ça OK, donc c'est la moitié de ce que
nous devons faire sur place. Maintenant, nous devons également faire pivoter
tous les projectiles que nous instancions. Trouvons donc cet angle
de rotation. Donc, à l'intérieur du casting, sous lequel nous créons la scène du pacte
pour le projectile, faisons l'angle de rotation de la réalité virtuelle Et nous allons prendre
le vecteur get facing. Nous allons convertir
cela en angle ici, et je pense que c'est en radiance. Si je clique avec le bouton droit de la souris
et que je fais le symbole Lou, nous pouvons voir renvoyer l'angle
vectoriel par rapport à l'axe X positif en radians Ce serait donc des choses comme Pi divisé par deux. D'accord, mais nous voulons le
faire pivoter de manière à ce que la lance ou autres projectiles soient orientés vers la droite par défaut
comme angle Donc, si le sprite est orienté vers le
haut, nous voulons faire pivoter
ce Pi divisé par deux ou environ 90 degrés comme
ça . Nous allons donc ajouter Hi, qui est une constante
divisée par deux, et cela fera en sorte qu'il soit orienté vers la droite par défaut Sans faire correspondre les choses, il
s'agit plutôt d'une question d'essais et d'
erreurs ici Mais procédons à cette rotation. Nous allons donc passer à l'
exemple du projectile et avoir dit qu'il s'agit de sa position globale,
nous allons faire pivoter le point du projectile et cette fonction prend Nous avons donc notre angle de rotation. Vraiment, je devrais le renommer pour
en faire des annonces rotatives. Je vais donc
récupérer deux fois ce Control R, et nous allons dire de faire pivoter les
publicités pour obtenir de l'éclat, les
remplacer toutes, et ça
a l'air beaucoup plus propre là-bas Alors, sauvegardez et courez, et voilà que nos lances pointent dans la bonne direction Et cela devrait également fonctionner avec pratiquement n'importe quel projectile Tant que ces projectiles orientés vers le haut par
défaut, s'ils ne le sont pas, vous pouvez faire pivoter ce
sprite individuellement sur la scène des projectiles jusqu'à ce
qu'ils soient orientés qu'ils soient Voilà donc notre visée
et nos rotations pour les
projectiles Et pour montrer encore une chose,
si j'abandonne la direction, alors notre direction
est désormais le vecteur 20, mais nous tournons toujours
vers la droite car le facage ne sera jamais réglé
sur le vecteur deux points zéro. C'est pourquoi nous utilisons la direction orientée au lieu de l'entrée de
direction brute. OK, c'est une
étape importante franchie ici.
19. Ajouter des effets sonores et de la musique: Ajoutons des
effets sonores à notre jeu. abord, je vais commencer par
créer un effet sonore de lancement, puis peut-être que lorsque les ennemis
atteindront leur état de mort, nous aurons la possibilité
de leur faire jouer un effet
sonore également. Je me tiendrais probablement
à l'écart des sons, car
plusieurs ennemis se feront toucher à
chaque seconde, et cela finirait
par créer trop d' effets
sonores à la fois. Vous ne voudriez pas trop submerger
votre joueur. Commençons donc
par ces deux-là. Donc, pour l'arme de lance du joueur, disons que dans l'arme à D, nous ajouterons un lecteur audio Donc, chez Export var,
un lecteur audio de type ou un lecteur de
flux audio deux D.
Nous voulons que ce soit deux D. Comme ces projectiles existent dans le monde du jeu TD, il est
donc logique d'
affecter le son en
fonction du positionnement spatial de la caméra et du
projectile et tout Nous allons donc prendre le lecteur audio et il va falloir
le mettre en dessous. Donc, pour ajouter un nœud de lecteur audio, nous allons zoomer ici et cliquer avec
le bouton droit sur Spear
Weapon, ajouter un nœud enfant Nous voulons donc le lecteur de
streaming en deux D, ajoutez-le en dessous. Et nous voulons attribuer un flux audio que nous pouvons écouter ici. Découvrons donc les effets sonores. Je vais réduire tous les dossiers. Passons à l'audio. Voyons voir. Qu'est-ce que j'utilisais ?
Je pense que nous avions, genre, des effets sonores de Ball OK, laisse-moi mettre mon casque ici pour qu'il ne passe pas
par le micro. OK, donc dans un, je crois que
c'était avec une barre oblique 04, donc nous pouvions
double-cliquer dessus, aller en haut à droite et prévisualiser Oui, je pense que c'est ce que j'
utilisais dans mon projet de démonstration. Prenons donc la barre oblique et
mettons-la dans le stream ici Maintenant, nous pouvons simplement demander à
ce lecteur de flux audio jouer chaque fois que nous
lançons un projectile Passons donc à Stream Weapon. Et lorsque le
projectile sera lancé, nous dirons que si le lecteur
audio n'est pas nul, nous lui demanderons de lire
son clip audio actuel Donc, ici, après avoir cité le
projectile, nous dirons «
je suis un lecteur audio », puis nous
dirons « le lecteur audio joue », et c'est en gros
tout ce que nous avons à faire La raison pour laquelle nous avons cette condition ici est
que pour certaines armes, vous ne voudrez peut-être pas
qu'elles diffusent du son Nous allons
donc ignorer
cette option ici. Maintenant, une chose que je tiens à souligner ici, c'est
que nous donnons des responsabilités
supplémentaires
à ce script d'armement. Maintenant, l'arme à deux D est non seulement chargée d'
instancier les projectiles, mais aussi de demander au lecteur audio de
jouer lorsque
le projectile est instancié sa propre référence à l'équipement des armes et en
créant également un chronomètre Il y a donc certaines choses qui
se passent en ce moment Je ne pense pas que
ce soit accablant un problème pour le jeu, soit un problème pour le jeu,
mais il
faut en être conscient. Si vous remarquez que vos scripts prennent trop de
responsabilités, vous pouvez
envisager de les diviser en plusieurs nœuds
avec différents scripts et de les faire fonctionner ensemble en tant que pièces
individuelles
plutôt qu'en un seul méga-script géant. Mais nous n'y sommes pas
encore. Le script ne compte que 50 lignes. Ce n'est pas vraiment un problème. Si vous aviez peut-être deux
ou 300 lignes de code, auriez
probablement vous auriez
probablement
besoin de
sous-objets, je pense. Mais ne t'
inquiète pas trop pour ça. La plupart des scripts de ce
cours sont assez simples. Je veux juste que vous sachiez
qu'à l'
avenir , un script peut
devenir trop monolithique, ce qui peut poser problème
à long terme Nous avons une
arme à lance. Nous devons attribuer le lecteur audio pour
qu'il puisse réellement lire le son. Donc, assignez, puis lecteur de flux
audio. Maintenant, si nous jouons, nous devrions
obtenir nos effets sonores. Ok, ouais,
allons-y. Chaque fois que nous lançons un projectile OK, maintenant nous voulons créer
un effet sonore lorsque nos orcs meurent. Passons donc à la scène orc. Très bien, cliquez sur l'orc, ajoutez un nouveau
lecteur AudioStream Si nous le voulons, je pourrais
le renommer
en lecteur audio mortel On pourrait le dire. OK, alors
maintenant nous voudrions trouver un effet sonore de
mort approprié. En jouant un peu avec
ça, je trouve que
Death 01, l'ennemi, c'est trop. Même un flash oh deux, c'est un
peu trop aussi. Le truc, c'est
qu'il va y avoir des ennemis qui tombent comme des mouches
dans ce genre de jeu. Nous avons donc besoin de quelque chose de très subtil ou peut-être même de rien du tout. Je pense que je
cherche quelque chose qui ressemble
plus au Step grass 03. Cela peut sembler
un peu étrange, mais je pense
que tout ce qui est
plus long que cela sera trop long pour voir comment cela se passe, pourrait même complètement supprimer cela. Affectons donc le Step grass oh three au stream ici, et pour lui demander de produire cet effet
sonore à la mort, passons au lecteur
d'animation. En bas à gauche, nous allons sélectionner l'animation de la
mort. Et nous allons ajouter une nouvelle
piste, ajouter une piste ici, appeler la méthode sur le lecteur audio
Death, et nous allons cliquer avec le bouton droit de la souris au
début de cette animation, insérer la touche, et nous voulons jouer. C'est donc un peu comme si nous
écrivions un script lorsque nous
définissons ces images-clés
d'animation, sauf que nous avons la chronologie, nous permet de savoir exactement quand nous voulons qu'elle
joue cette animation, et il est très facile de la déplacer
vers
un autre point
dans le temps simplement en la faisant glisser vers une
autre Vous pouvez donc écrire tout
cela en écrivant du code de script GD si vous le souhaitez et simplement
ignorer le lecteur d'animation Mais évidemment, le
lecteur d'animation
facilite en quelque sorte les choses visuellement. OK, donc maintenant, si nous
jouons, nous devrions obtenir les deux effets
sonores. Vous pouvez donc entendre que
lorsque les orcs plongent, cela produit
un petit effet sonore C'est un peu calme,
mais peut-être que ça va. Si nous pensons que les lances sont
trop fortes en comparaison, nous pourrions même prendre le lecteur de flux
audio Spears et réduire légèrement le volume en
décibels ici Et appuyez sur Play et
lancez-le une fois de plus. Vous pouvez même le modifier
pendant que le jeu est en cours d'exécution. Nous pourrions donc simplement
le supprimer. D'accord. Vous pouvez voir que c'est
déjà beaucoup plus silencieux. Sea, l'un des avantages de
Cado, c'est que vous n'avez pas nécessairement à fermer le jeu pour modifier
vos propriétés Et attaquons un ennemi. D'accord. Et la différence de volume entre les deux est un
peu moins prononcée. Donc c'est probablement bon maintenant. En
prime à cette vidéo,
si vous voulez ajouter de la musique, partons à la découverte du monde entier, et ajoutons un lecteur de flux
audio, un lecteur de flux
audio en deux
D, juste la note par défaut Donc, diffusez le lecteur ici, puis choisissez celui-ci, le lecteur
Audiostream OK, donc avec notre lecteur
AudioStream, allez vers la droite,
et nous allons
vouloir qu' il soit en lecture automatique Et je pense que pour le faire en boucle, nous devons d'abord
le charger à partir des trois MP audio Fermons donc à nouveau tout
en bas à gauche, passons à Audio, et nous avons la chanson Box Jump du pack
The Red Hearts. Nous allons donc placer cela
en haut à droite. En fait, ce n'est pas le P 3. C'est un OGG à points, mais les deux formats de musique
sont pris en charge dans KDO, donc ça marchera bien Ensuite, nous voulons prendre
ça et vérifier que Loop est activé. Mais il se peut que nous ayons besoin de le
faire en bas à gauche. Double-cliquez donc sur l'OGG ici. OK, puis
vérifiez la boucle ici. Et quand il arrivera à la fin, il devrait
tout boucler. OK, donc c'est bon. OK, donc la dernière chose
avant de jouer au jeu, je vais prendre le volume DB et le mettre à moins 20
parce que je pense que ce sera
probablement assez fort, sinon. Alors, appuyons sur Play
et voyons comment ça se passe. D'accord. Nous pouvons donc entendre la musique, et
elle est toujours assez forte. Je vais donc le porter
à moins 30. Peut-être même moins 40. Oui, c'est probablement un
peu plus approprié. Maintenant, nous avons le son. Nous avons la musique, et nous avons un effet sonore Enemy
Death. C'est donc en quelque sorte
la base des effets sonores
audio et de
la musique dans le jeu, et nous pouvons
continuer à partir de là.
20. Combat System Singleton: OK, donc les dégâts infligés aux
projectiles
et les combats de base fonctionnent pour le moment, mais nous ne
savons pas vraiment combien de dégâts sont infligés aux ennemis
dans le contexte du jeu Donc, une façon d'
améliorer visuellement le gameplay
serait de faire flotter le texte de combat. Ainsi, chaque fois que l'un de
ces personnages subit des dégâts sur la boîte à blessures, nous pouvons communiquer, par exemple,
avec
un système de combat, par exemple,
avec
un système de combat flotter un texte de combat à
l'endroit où il a subi des dégâts chaque fois qu'il subit des dégâts. Cela signifie donc qu'
il y aura beaucoup de chiffres qui
flotteront à l'écran, mais je pense que cela fonctionne plutôt
bien pour le style de jeu. Il est entièrement basé sur l'action, et nous voulons un feedback
immédiat chaque fois que nous infligeons des
dégâts à des ennemis. Nous voulons également
voir les avantages de l'amélioration de nos capacités et renforcement de notre
personnage Pour créer notre système,
nous allons vouloir faire en tant qu'objet
Singleton, c'est-à-dire qu'il
y ait une référence à
cette classe ou à ce système
tout au long du jeu Et si nous le définissons comme chargement automatique, il sera toujours là
en arrière-plan et son nom
pourra facilement être référencé Vous pouvez également implémenter modèle
Singleton dans
le script lui-même, mais nous le ferons à la manière de Gada, qui est un peu plus simple
et plus facile à comprendre Donc, en haut, je vais
simplement créer une nouvelle scène. Nous allons le créer en tant qu'autre nœud, et ce sera un nœud de base. Si vous êtes deux ici, vous pouvez le renommer en système
de combat. Ensuite, faisons un clic droit dessus, joignons un script, Système de combat. Nous pouvons l'enregistrer soit
à la racine, soit créer un dossier système dans lequel l'
enregistrer, ce qui
serait probablement ma préférence, et je vais le créer là-dedans. Nous voulons maintenant enregistrer ce système de combat dans
le dossier des systèmes. Donc, le système de combat
point TSC, sauf ça. Maintenant, nous allons en faire
un chargement automatique afin que ce script de nœud puisse être référencé dans tout le jeu en utilisant
simplement son nom. Je vais donc passer aux paramètres
du projet. Ensuite, nous avons Globals ici. Et nous voulons ajouter un
nouveau TSCN en tant que global. Alors cliquez ici, allez dans
Systèmes, puis faites TSCN. Vous pouvez également voir
que vous pouvez sélectionner un script point GD comme
système de combat, ce qui
créerait une nouvelle instance
du script de nœud dans votre jeu dès
le lancement du jeu Mais si vous utilisez le point TSCN, vous avez l'avantage de
pouvoir utiliser des variables d'
exportation car il s'agit d'une
copie très spécifique du système de combat Si je double-clique dessus ici et que ajoute comme nom de nœud
du système de combat, alors nous avons maintenant ce système de
combat sous forme singleton global
et d'
une facette de notre jeu Et la différence
entre le chargement automatique d'un script GD à points et le chargement
automatique du SEN directement est que si
nous faisons quelque chose comme Exporter var spawn count, integer égal à dix,
alors nous pouvons le définir ici, n'est-ce Mais si vous instaurez
un script qui n'a pas encore été défini comme
une scène ou un nœud, vous n'aurez
aucune possibilité de
personnaliser de
telles propriétés à l'avance. Maintenant, je suis sûr qu'il existe
des moyens de contourner ce problème, mais c'est l'un
des avantages de l'utilisation du point TSE. OK, nous avons donc
notre système de combat. Nous allons vouloir une sorte
de fonction de signalement des dommages. Je vais donc en quelque
sorte le rédiger. Ici. Disons fonction. Supposons que le rapport soit atteint. Je
pense que c'est logique. Supposons qu'une
cible ait été atteinte, et que nous
puissions dire qu'aucun D être atteint dans le jeu
. Généralement, cela ressemble
à un
corps de personnage ou à un corps statique. Mais nous utiliserons simplement la
classe de base pour plus de flexibilité. Et puis nous avons ici
le montant des dégâts. Le dommage P est donc un entier. Cela sera annulé. Ensuite, dans ce système de combat, nous allons créer notre scène
pour le texte de combat flottant. Allons donc jusqu'en haut et nous pouvons dire Export var une scène de texte de
combat flottante. Et ce sera une scène pleine
à craquer. Et ici sur Report Hit pour le moment, nous allons
juste faire une passe. Ou si vous le souhaitez, vous pouvez même faire une erreur push et dire «
non implémenté ». Cela vous donnera un
peu plus de feedback si vous oubliez d'implémenter un script plutôt que de
simplement exécuter la fonction et qu'elle passe donc il n'y aura aucune erreur, mais cela ne
fera rien non plus. Je pense donc que c'est
un peu mieux pendant le développement, en fait. Passons maintenant à
notre script HRT Box Two D. Donc Control P, HRT Box two
D. Et puis, à l'intérieur d'ici, nous pouvons faire référence
au système de combat OK, donc le rapport à
points du système de combat est
activé, et nous voulons l'objet géré par le
contrôleur de statistiques. Je ne pense donc pas que
le contrôleur de
statistiques ait encore une
référence à cela. Si nous jetons un coup d'œil à la scène
orc très rapidement, cliquons sur le contrôleur de
statistiques Nous pouvons voir qu'il n'y a
rien sur le côté droit qui puisse faire
référence à l'Oc. Nous pouvons simplement en faire une
référence de type get parent ou nous pouvons en
faire une variable d'exportation. Si vous voulez vous assurer que la connexion est plus absolue, j'opterais pour l'exportation. Parce que cela signifierait
que si, pour une raison ou une autre, vous déplacez le contrôleur de statistiques vers le
bas d'un niveau, comme si vous le confiez
à autre chose, alors Get parent ne renverrait
plus l'orc Donc, si nous l'utilisons à l'exportation, nous pouvons nous assurer qu'il
renvoie le c. Nous pourrions dire quelque chose comme
corps ou caractère, peut-être même objet,
en le gardant plus générique. Ensuite, il peut s'agir
simplement de l'objet pour lequel
ce contrôleur
gère les statistiques, et je vais l'attribuer en
haut à droite à l'orc ici Maintenant, si nous
retournons dans la case Blessure, nous pouvons utiliser l'objet point du
contrôleur de statistiques ici, puis nous pouvons répercuter
les dégâts P. D'accord, cela donnera
au système de combat tout ce dont nous avons besoin pour savoir où placer le texte et les dégâts à
lui attribuer.
21. Animer un texte de combat flottant: Nous avons maintenant besoin du texte de
combat flottant lui-même. Créons donc une
nouvelle scène ici. Cliquez sur Plus et sur Interface
utilisateur. Et nous allons
faire en sorte que le nœud de base ressemble à un texte de
combat flottant. Mais c'est le texte lui-même que nous allons
attribuer comme étiquette secondaire. Et cela nous sera utile lorsque
nous utiliserons le lecteur d'animation pour animer, car nous ne voulons pas modifier
la position de la racine Nous voulons simplement modifier
la position du texte par rapport à la racine du contrôle de texte de combat
flottant. Alors, cliquez avec le bouton droit ici, ajoutez un nœud
enfant, recherchez l'étiquette. Et puis faisons un clic droit sur le lecteur animation
Adhild à texte de combat
flottant OK, je pense que c'est
ce dont nous avons besoin ici, alors contrôlons S. Et nous pouvons sauver ça. Peut-être que
nous créons un dossier pour l'interface utilisateur. C'est toujours une sorte d'interface utilisateur. Créons donc un nouveau dossier. Je vais taper dans l'interface utilisateur. D'accord. Et puis le texte de combat flottant point TSC et peut y aller
directement Alors, fais preuve de prudence. D'accord. Et maintenant, nous avons besoin d'un script attaché
à notre racine ici. Je vais cliquer avec le bouton droit sur le texte de combat
flottant, joindre un script, et nous le
créerons dans le dossier de l'interface utilisateur, point de texte de combat
flottant gD Nous allons avoir besoin
d'une référence à l'étiquette afin de pouvoir la
manipuler ici. Donc, contrôlez l'étiquette de la variable. Nous allons donc attribuer l'étiquette ici. Et nous voulons créer une
sorte de fonction initialisée. Si vous avez utilisé Gado, vous savez
probablement qu'il
existe une fonction de soulignement
et de tricot ici Cette fonction est utilisée lorsqu'un nœud est
créé dans la scène. Mais dans ce cas, nous
devons attendre que l'objet ait déjà
été créé. C'est pourquoi nous devons créer. Donc, si vous utilisez
Gadot depuis un moment, vous savez peut-être qu'il existe
une fonction de soulignement
et une fonction informatique s'agit donc d'une
fonction remplaçable qui peut
exécuter du code avant que
toutes les propriétés votre
système n'aient été définies Vous pouvez l'utiliser pour transmettre des paramètres
facultatifs afin de définir
ces propriétés lorsque
vous créez un nœud à
partir d'un appel de fonction plutôt que
d'exister dans une scène compressée,
comme ici, vous le faites habituellement, vous
configurez simplement la scène,
puis vous instaurez la scène
à partir d'une scène rythmée Ce n'est donc pas vraiment
ce que nous voulons faire. Nous n'essayons pas de personnaliser
la fonction initialisée. Nous essayons de faire en sorte que le texte
de combat
flottant s'affiche
déjà dans la scène. Je voulais donc simplement faire
cette distinction. OK, donc ce que nous voulons faire dans le script de texte de combat flottant c'est avoir
la possibilité de définir le texte sur l'étiquette, et nous allons le faire
directement avec une sorte de fonction
déléguée
ici avec un texte défini de fonctions. Nous allons donc définir le
texte sur l'étiquette, mais nous le ferons en utilisant le texte de combat
flottant du nœud racine. Définissez donc le texte, et
nous dirons P text, qui est une chaîne,
nous renverrons void, et nous prendrons le texte à point d'
étiquette et définirons comme égal au texte P. Donc, l'une des raisons de le faire est
que notre OK, donc, bien sûr, nous allons
vouloir le définir chaque fois que nous invoquons la scène de texte de
combat flottante. Vous pouvez donc donner un nom de
classe ici afin que nous puissions facilement obtenir
cette méthode de texte définie. Donc, nom de classe, texte de combat
flottant, nous allons appuyer sur Controls. Et maintenant, dans notre système de combat, chaque fois que nous signalons un coup, nous voulons créer une scène de texte de combat
flottante. Vous voyez, disons que le texte Vara est
du type texte de combat flottant. Et nous y parvenons en instanciant la scène de texte de combat flottante Entrez puis instanciez. D'accord. Ensuite, nous voulons
ajouter cela en tant qu'enfant. Maintenant, nous ne voulons pas
réellement ajouter le texte en tant qu'enfant de la cible P, car lorsque la cible P est
supprimée de la scène, comme dans l'animation de la mort, elle supprime également
ses nœuds enfants comme le texte de combat flottant. Donc, comme nous avons
ce système global, le système de combat
pour gérer le texte, je pense que nous pourrions
peut-être nous en tirer en
ajoutant simplement un enfant sur
le système lui-même, puis en ajoutant le nœud de texte. Nous devons maintenant définir
la position globale sur la position de la cible P. position globale du texte est donc égale à la position
globale du point cible p. Et si cela ne fonctionne pas ou si nous rencontrons d'autres problèmes, nous pouvons obtenir une référence à une couche de canevas, l'interface utilisateur réelle et à la position qu'elle contient sous un parent similaire à ce que nous
faisions avec un projectile Nous avons
donc juste besoin d'un parent
pour contenir tout le texte Mais la position
doit être là où l'ennemi a subi des dégâts,
c'est l'idée ici. Nous voulons maintenant prendre le texte
et définir son texte. Définissez donc le texte sur une
chaîne de dégâts P. Le dommage P est donc un entier. Nous le convertissons en
chaîne en disant STR, puis en mettant les
dégâts P entre parenthèses Ensuite, nous avons défini le texte
sur cette valeur de chaîne. Donc, si nous définissons la scène de texte
flottant du système de combat ici, alors maintenant je regarde la scène Singleton,
le système de combat, nous pouvons passer ici
et
charger rapidement notre texte de combat flottant Nous avons donc cette référence à la scène
bondée
ici sur la droite, elle devrait
donc être instanciée Appuyons sur Play
et essayons OK, donc nous allons faire en sorte
que les dégâts soient réduits. OK, oui, c'est un peu
ce à quoi nous nous attendons. Et vous voyez, c'est très important lorsque l'orche est
retirée de la scène, le texte ne s'enlève pas tout seul. Bon, maintenant nous nous occupons de l'animation du texte de combat
flottant. C'est ce que nous avons fait dans le lecteur
d'animation. Créez une nouvelle animation en
bas. Nouveau Et voyons voir. On peut
l'appeler comme on veut. Je vais utiliser float up, puis nous devons ajouter
quelques propriétés pour animer. Ajoutez donc la propriété de la
piste, l'étiquette de la piste, en
particulier l'étiquette, car nous voulons cette position de décalage. Cherchons donc la position ici. D'accord. Maintenant, nous ne pouvons rien voir car il n'y a pas de
texte par défaut sur l'étiquette Je vais
donc cliquer sur l'
étiquette, et je vais simplement dire DEF par défaut ici. Nous pouvons également vouloir
attribuer un thème avec
une nouvelle police par défaut qui correspond
un peu mieux à notre jeu Pixar Nous pouvons donc le faire en cliquant
sur le texte de combat flottant. Je passe au thème sur
le côté droit. Créez un nouveau thème, développez-le, sélectionnez une police par défaut, et je choisirai celle que nous avons
déjà installée au début
du
projet cinq x sept,
qui, comme vous pouvez le voir, est
une jolie police Pixar Donc et puis si nous voulons réutiliser ce thème,
ce que nous faisons probablement. Je vais cliquer avec le bouton droit de la souris et l'enregistrer
dans le projet, et l'interface utilisateur sonne bien. Nous allons donc simplement dire thème du jeu. Dot TRS pour le moment. OK, si nous le fermons
, vous pouvez voir qu'il est désormais référencé
par le nom du fichier. OK, maintenant, deux ou trois choses. Sur le nœud racine, le texte de combat
flottant, nous pouvons voir qu'il
contient essentiellement cette boîte géante. Nous n'avons pas vraiment besoin
qu'il soit si grand. Passez donc à la mise en page. Et puis, au lieu du preset
Anchors full rect, changeons-le en reset Maintenant, le contrôle se
fait juste à un petit point plus haut, et l'étiquette a sa
propre taille quand on était enfant. Ensuite, autre chose sur le texte de combat
flottant. Je veux prendre la souris
et changer le filtre pour
ignorer, juste pour que clics de
souris continuent de
passer à l'écran Même s'ils touchent
ce texte de combat flottant, je veux que les clics
de souris soient ignorés. Donc, s'il y a une
interface utilisateur à l'écran, cela n'interférera pas avec le fait d'
appuyer sur le bouton de l'interface utilisateur. C'est très important. Maintenant, revenons à notre lecteur
d'animation, et saisissons la position au clavier Je vais donc zoomer
en bas. Faisons un clic droit sur l'
image-clé de la position et déplaçons-la là où nous voulons que la position de
départ soit C'est donc sur le 00 que notre
ennemi a subi des dégâts. Je pense que je veux juste m'assurer que cela commence
quelque part au-dessus de cela. Je vais donc aller sur w
pour déplacer le texte. Je vais le déplacer ici,
puis nous allons saisir
la position ici Passez donc à la mise en page sur
le côté droit, puis passez à transformer
et à saisir la position Je l'ai donc à moins
15 pixels sur le Y. Ensuite, nous pouvons passer à
combien de temps voulons-nous que cela dure Peut-être une demi-seconde. Vous pouvez également activer le snapping
si cela vous aide OK, donc 0,5 seconde. Et ensuite, déplaçons-le ici. Donc, un peu comme ça,
puis
image-le à nouveau sur le côté droit, en utilisant
simplement le bouton de l'image-clé OK, et maintenant ça va s'
animer entre
ces deux points Donc, si je vais au
début et que je joue, vous pouvez voir que cela va
animer ce mouvement de position Nous pouvons également modifier la durée complète
à 0,5 seconde. Et puis, si nous le voulons,
nous pourrions simplement le
corriger à la fin en ajoutant track
call method track sur la racine flottante du texte de
combat. Et puis cliquez avec le bouton droit ici, insérez et tapez en carré. OK, cela garantira que le texte se nettoie de lui-même une fois terminé dans cette scène sans avoir à personnaliser
quoi que ce soit d'autre, vraiment Nous pouvons simplement l'appeler à
partir de l'animation. Maintenant, cela fonctionnerait probablement, accord, pour le moment, mais
c'est vraiment basique. Nous allons le tester.
Assurez-vous simplement que cela fonctionne. OK, oui, je n'ai pas
joué à l'animation. C'est donc parce que je
n'ai pas configuré Autoplay ici. Donc, en bas à droite
du
lecteur d'animation , Autoplay lors du chargement OK, maintenant nous appuyons à nouveau sur Play, et nous obtenons notre animation. D'accord, cela fonctionne donc à
un niveau très basique. Ce n'est pas mal du tout.
Mais pendant que nous y sommes, pourquoi ne pas le rendre
plus intéressant ? Je peux donc ajouter une piste sur la piste de
propriété de l'étiquette, et nous allons faire, disons, de la mise à l'échelle. D'accord, cela nous
permettra agrandir ou de le réduire au
fil du temps. Définissons-le donc
tel qu'il est à 00 heures. Disons environ
0,15 seconde ou je suppose que je passe à 0,16 67 Cela n'a pas vraiment d'importance ici. Et vous pouvez modifier votre
capture en bas, à
droite, d'ailleurs, si vous souhaitez avoir
une capture d' image-clé plus personnalisable Passons donc à l'étiquetage,
puis à la transformation de l'échelle. Nous allons prendre sa
taille et l'augmenter. Donc peut-être 1,5
ou peut-être même deux. Nous pouvons commencer par cela
et le réduire si nécessaire. Je vais donc créer un keyframe. Alors maintenant, il va passer
de la taille 1.0 à la taille 2.0. Et puis, quand il s'estompe, nous voulons qu'il devienne vraiment petit Mettons-le donc à, disons, taille de
0,1, puis encadrons-le. D'accord. Alors maintenant, si nous jouons notre animation, c'est un
peu comme ça. Peut-être que l'échelle est
un peu trop grande sur cette deuxième image-clé, alors je vais juste passer
à 1,5 Je pense que c'est juste. Appuyez sur Play. OK, ça marche plutôt bien. Et nous pouvons également prendre la
position et la décaler peut-être vers la droite lorsqu'elle atteint
le point de taille maximale. Prenons donc la position
ici avec le mode
W move déplaçons-la vers la droite ou quelque chose comme ça ,
puis encadrons-la avec une touche. OK, et maintenant nous allons rejouer. Nous pouvons maintenant voir
comment le texte apparaît vers la droite puis
revient en haut à gauche Une autre chose que nous
pourrions faire serait de changer la couleur ou
l'Alpha au fil du temps. Ajoutons donc une piste sur la piste de
propriété de l'étiquette, et nous allons la faire s'
auto-moduler Cela n'affecte donc que cette étiquette, pas les nœuds enfants. Je vais donc m'auto-moduler
sur l'étiquette. Cliquez avec le bouton droit de la souris pour insérer
une clé au début. Ce sera donc notre
blanc standard avec un Alpha complet. Passons à 0,15 ou à endroit où nos
images clés s'enclenchent
ici et insérons une 0.0 1667 pour moi. Ensuite, changeons
la couleur en rouge ou quelque chose comme ça, car
c'est pour le texte endommagé. Et ensuite, allons
jusqu'au bout. Cliquez avec le bouton droit sur Insérer une clé, et nous la modifierons pour qu'elle soit,
disons, zéro Alpha. Est-ce qu'il peut jouer. Alors maintenant
c'est un peu comme ça. Je pense que cela pourrait être
plus logique si nous
échangeons la première
image-clé et celle-ci Je vais donc le
faire glisser sur la chronologie. Je vais tourner à gauche jusqu'
au point de 0,0 1667. Ça
passe par ici. Alors maintenant, ça va commencer au
rouge et passer au blanc. Et nous pourrions aussi le terminer
par une couleur blanche. Je vais donc cliquer ici,
accéder à la valeur et la changer en 255
pour le vert et le bleu. Il se termine donc en blanc bien que
totalement transparent. Si je joue quelques fois ici, c'est très dégradé. Je veux dire, c'est vraiment
parce que nous ne
faisons que passer d'une couleur à une
autre au fil du temps Le dégradé serait donc comme
ça de gauche à droite. Par exemple, il passe du rouge au
blanc au fur et à mesure qu'il progresse
sur l'écran, sauf que nous le
faisons au fil du temps maintenant. Donc, c'est à vous de
décider comment vous aimez cet endroit. Vous pouvez également le changer
pour qu'il soit rouge. C'est donc tout le temps rouge. La seule chose qui change,
c'est la transparence. Ensuite, vous devrez également définir
le troisième point
d'image clé , un peu comme ça. Peut-être voudrions-nous plutôt qu'il s'
assombrit au fil du temps, afin de prendre les valeurs indiquées ici et de les transformer en rouge foncé, un peu comme ça et de
voir comment cela se passe. Oui, ça a l'air
plutôt bien, je crois. Peut-être que le rouge est un
peu trop vif, alors je pourrais prendre le premier et le faire
un
peu comme ça. Et peut-être qu'il peut faire un peu
plus clair au sommet. Essayons, d'accord, du plus foncé
au plus clair, puis du plus foncé
à nouveau. Donc, cela semble plutôt
bien fonctionner. J'aime bien ça. C'est une question purement artistique de
préférences personnelles. Donc vraiment,
comme tu veux, vas-y. OK, alors jouons
et testons-le, et nous recevrons le texte des dégâts dès que nous aurons touché les ennemis. Et il me semble que
ça bouge bien trop vite. Peut-être devons-nous doubler la durée de cette animation. Donc, si nous cliquons sur le lecteur
d'animation, nous pouvons simplement déplacer ces
images-clés, et c'est l'un des
grands avantages d' utiliser un
éditeur d'animation d'images-clés plutôt que de les coder en dur Il est simplement plus
facile d'itérer et d' apporter de petites modifications pour l'
ajuster à l'endroit
souhaité Prenons donc ces
images-clés pour Kframe. Mettez-le à la fin ici à 1.0. Cela devrait également passer à 1.0. Et vous pouvez faire glisser un cadre
sur plusieurs images-clés et les déplacer toutes
en même temps comme ça Je peux donc faire glisser une case ici, et nous la déplaçons vers, nous pourrions essayer 0,5
seconde, peu importe. D'accord. Maintenant, c'est assez lent là-bas. Alors peut-être que nous voulons que cela ressemble plus
à un chargement frontal. Amenons-le là-bas. Appuyez sur Play. D'accord. Je
veux dire, je ne suis pas sûr. va falloir essayer et
voir à quoi il
ressemble réellement à l'écran. Il semble qu'il faut un
peu trop de temps pour disparaître. Alors peut-être que ça doit plutôt être là. Un peu
plus loin. Et peut-être qu'une
seconde, c'est trop long. Je vais juste le traîner là-bas. Donc, quel que soit le
point de l'image-clé de 0,8 seconde, ce sera la
durée du clip Peut-être que le texte est
également trop petit. Je pense donc que l'une des façons de nous faire une idée est
d'en mettre une copie sur la
scène mondiale afin que nous puissions la voir telle qu'elle est
ici. OK, voici notre texto Daf. Je pense que nous pouvons
réellement écrire en cliquant ici et en faire des enfants modifiables, puis nous pouvons cliquer sur le lecteur d'animation, le
tester et le voir ici Si nous passons au float
up, est-ce que cela fonctionne ? Oui, c'est en quelque sorte le cas. D'accord. Oui, ça m'aide
beaucoup. Vous pouvez donc vraiment voir à quoi cela va ressembler dans le gameplay
réel, car nous avons la
maquette de scène ici. OK, alors peut-être
prenons la position ici, et je vais la déplacer
un peu vers le bas. Et il semble que
nous puissions également utiliser un keyframe ici, donc c'est bien Alors, est-ce que cela donne réellement
le 28 moins 31 ? Faisons en sorte qu'il
disparaisse un peu plus vite. Je ne l'ai donc jamais vraiment
essayé de cette façon, en particulier. Il semble que vous puissiez créer une
image-clé sur l'étiquette, mais vous ne pouvez pas régler le lecteur d'animation directement lorsque vous éditez
à partir de cette autre scène Il y a donc un petit
compromis à faire ici. Je pourrais changer l'
auto-modulation sur la première image. Et image-le là.
OK, donc ça marche. Cela met à jour le lecteur
d'animation. Ensuite, je peux passer à la scène de texte de combat
flottante. Et je veux prendre
la couleur modulée et la déplacer beaucoup plus
vers la gauche Il deviendra donc rouge plus rapidement, mais je n'ai pas vraiment aimé
qu' il soit rouge tout le temps. OK, puis je vais aller ici et ajouter un autre image-clé. Et en cela, je vais faire en sorte que
ce soit totalement transparent. Il sera donc visible à
l'écran plus longtemps. Il ne disparaîtra que vers la fin de
l'animation complète. Jouons, et j'
essaierai encore une fois. Peut-être qu'ici je veux aussi que sa
couleur soit blanche. C'est donc ce que je vais faire. Alors, il
suffit d'un flash rouge. Une dernière chose en
bas à droite, si vous utilisez le mode
d'interpolation ici, vous pouvez le changer en mode cubique Et je vais le faire
pour la position, l'échelle et les propriétés d'
auto-modulation Donc, si vous regardez de
très près, cela crée une petite courbe sur les
côtés gauche et droit pour cela. Donc, si cela fonctionne comme les
autres éditeurs de chronologie, ce que je pense, cela signifiera
qu'il s'agira d'une courbe d'assouplissement et d'
assouplissement plutôt que d'une transition linéaire pour
l'animation ici. Nous allons donc tester cela ici et
voir si c'est le cas. C'est ce à quoi je m'
attendrais de la part
d'autres outils , comme l'éditeur vidéo
DaVentirSolt Et il semble qu'il y
ait un certain assouplissement ici. Je vais donc le changer très
rapidement juste pour comparer. Nous prenons cela en mode linéaire. Oui, maintenant la vitesse est
juste constante. J'étais donc en train d'écrire mon hypothèse. Cela peut donc nous donner un
peu plus de punch à l'animation, car elle a ses moments lents et
ses mouvements rapides Si nous appuyons sur Play, nous allons
le tester une fois de plus ici, et je pense que cela fonctionne
bien pour le moment. Je vais donc appuyer sur Play.
Nous allons le tester. J'ai l'impression que l'animation
est un peu longue ici. Il faut juste
qu'il y ait ce moment où nous pouvons le lire clairement OK, donc
encore une fois, je vais
raccourcir un
peu l'animation ici. Faire passer toutes les
images-clés à 0,7. L'animation se termine à 0,7. Jouons encore une
fois et testons-le. Je pense que je vais juste terminer
après ça. OK, donc la décoloration
est maintenant très rapide. OK, et puis pour la
position où elle s'estompe, je voudrais également la déplacer Alors laissez-moi le faire glisser
ici pour que je puisse le voir. Cliquez sur l'étiquette, il y a peut-être du porc
. Je vais saisir la position, puis je vais faire glisser ce point
vers la droite Je pense que cela ne fera que rendre l' animation un peu plus subtile. D'accord. Oui, alors maintenant,
quand ça s'estompe, ça ne bouge plus aussi loin Et je pense que c'est un
peu plus doux à regarder. Nous pourrions donc continuer comme
ça pendant longtemps. Je pense que tu as compris l'idée.
Personnalisez simplement l' animation comme vous le souhaitez en termes de couleur, d' échelle, de transparence, de
positionnement, etc. L'essentiel de ce
didacticiel, cependant, en termes de code, simplement de s'assurer que vous disposez du système de combat.
C'est un chargement automatique. Vous lui demandez de
signaler les dégâts, puis sur ce rapport, vous insérez le texte de combat, et vous l'ajoutez non pas en
tant qu' enfant du nœud cible
qui a subi les dégâts, mais en tant que nœud système ou simplement en tant que nœud persistant qui
ne se supprimera jamais de lui-même. Et vous supprimez le texte de combat
flottant dans son animation
en appelant Q gratuitement. Et c'est essentiellement l'essentiel tout le reste est
plus artistique.
22. Mouvement ennemi P21 avec suivi du joueur dans Godot 4: projectiles
ont déjà la capacité
d' infliger des dégâts et de tuer un ennemi, mais nos ennemis ne
marchent pas réellement vers Donc, pour que les orcs se
rapprochent du joueur, ils ont d'
abord besoin d'une
référence au joueur Il serait un
peu difficile d'établir une référence directe entre
l'orc et le joueur au départ, car ils
n'existent pas dans la même
scène au début du jeu Lorsque nous faisons apparaître des ennemis
dans le monde du jeu, ils viennent d'
une scène bondée Ils n'existent donc pas
ici tant qu'ils réellement mis en scène
par le système de génération Nous pourrions donc plutôt
avoir une ressource de référence, que nous pourrions appeler le contexte du joueur, dans lequel le joueur choisit
lui-même la ressource, puis chaque orc fera référence
à cette ressource pour la récupérer sur la cible du joueur dès son apparition
dans le monde du jeu Cela aurait
l'avantage supplémentaire de pouvoir échanger, par exemple
, la
cible du joueur sur tous les ennemis en changeant
la ressource une seule fois. Nous pourrions même demander
au système de combat de définir la référence dès qu' une copie de l'orc
apparaît
dans la scène de jeu Le système d'apparition
pourrait donc essentiellement choisir joueur que chaque orc
recherchera,
ce qui peut avoir des avantages
supplémentaires par rapport au en faire une
simple référence à dix, ce que vous pourriez certainement faire, dans ce cas, pour le Mais cela vous limiterait également strictement à un jeu
solo, ce qui convient parfaitement à ce cours. Mais je vais essayer de
montrer comment vous pouvez y
parvenir avec la méthode des ressources. Donc, en bas à gauche
de notre système de fichiers, tout
va s'effondrer. Passons aux personnages, et je vais cliquer
ici avec le bouton droit de la souris pour créer un nouveau script. Appelons cela le contexte du joueur. Et pour les héritages,
faisons-en une ressource. OK, créez le nouveau script et assurez-vous de l'ouvrir dans l'éditeur de script pour donner le contexte du lecteur de nom de classe. OK, donc c'est juste
configuré pour être essentiellement une référence partagée à un
joueur spécifique dans le jeu. Donc, ce dont nous avons besoin ici
, c'est de var player. Et si nous avons une classe de joueur,
nous allons l'étendre. Donc var player est du type player, et c'est peut-être
tout ce dont nous avons vraiment besoin ici. Pour cette ressource. Passons maintenant au script du
lecteur, et à l'intérieur du
lecteur, je vais
exporter une référence au contexte. Faisons donc un contexte
Export var, que j'appellerai de
type player context, des commandes pour l'enregistrer. Et nous pouvons voir dans le présent document que nous avons un emplacement pour les ressources. Créons donc
notre nouvelle ressource. Ensuite, je
veux cliquer
dessus avec le bouton droit de la souris et l'enregistrer dans le projet. Nous allons l'enregistrer dans,
disons, des caractères. Nous pourrions le mettre en jeu
si nous le voulons, alors pourquoi pas ? Ensuite, je l'appellerai player Context here point TRS
, pour les ressources. Vous pouvez également
déplacer le contexte du joueur GD vers le répertoire Character
Slash Player OK. Maintenant, nos
orcs ont besoin d'une cible Nous pouvons donc aller voir le PNJ orc. Vous pouvez cliquer
ici si vous en avez besoin. Nous dirons qu'à Export var target
est un type de contexte de joueur. Si vous en avez besoin, vous
pouvez également en faire un contexte cible si
vous avez juste besoin de
passer à une étape plus générique pour cela, mais ils n'auront qu'une seule cible. Je suppose donc qu'il
serait peut-être un
peu mieux de
le
préciser en l'appelant le contexte du joueur dans notre cas spécifique. Mais n'hésitez pas à en
faire un
contexte cible si vous
voulez que les ennemis s'en prennent à objets
inanimés, à des
PNJ ou à quelque chose Et cela
contiendra la référence à la cible
du joueur que
ce PNJ poursuit Configurons-le donc
directement dans l'inspecteur. Cliquez donc sur OC, puis
sur le côté droit, nous devons lui donner
le contexte du joueur. Je vais donc cliquer ici.
Chargement rapide, contexte du joueur. Et vous remarquerez
que même si l'orc et le joueur sont deux scènes complètement
distinctes, ils peuvent faire
référence à la même ressource et à notre projet La ressource existe dans
le système de fichiers, nous pouvons
donc y faire référence
dans nos scènes compressées individuelles. Ainsi, lorsqu'ils seront ajoutés à la même scène du monde du jeu, ils auront tous les deux
la même référence. Le joueur va donc
se définir comme le joueur dans
le contexte du joueur, puis
les PNJ vont lire
à partir de cela Et c'est ainsi qu'ils
vont interagir les
uns avec les autres par le biais de cet intermédiaire
contextuel. Le script du PNJ ne va donc rien
faire
directement ici Nous allons l'
installer dans l'État de Chase. Mais la dernière chose
à faire avant de passer à l'état de poursuite sera de revenir
à la scène
du joueur et de revenir à l'intérieur du joueur prêt. Tout d'abord, nous voulons
affirmer que le contexte n'est pas nul car il est en
quelque sorte nécessaire à notre jeu. Affirmez donc
le contexte afin que
la ressource de contexte soit définie ici
afin que le joueur puisse le joueur
du contexte. Ensuite, nous allons prendre Context Dot Player = Self. En fait, cela
va se diffuser toute façon dès que nous n'
aurons pas de contexte, car
cela ne peut pas être nul. Donc, cette assertion
n'est peut-être même pas nécessaire. Nous pouvons simplement le réduire là
et réduire la redondance. Donc, tant que nous avons cette ligne et que le
joueur charge en premier, le joueur dans le
contexte est défini, puis que nous chargeons
tous les autres PNJ, nous pouvons leur faire utiliser
leur état hace pour se déplacer vers le joueur maintenant Donc, à l'intérieur d'Ok, nous
allons aller dans l'État de Chase. Donc, dans l'
état de Chase, nous devons obtenir cette référence
au joueur. Nous pouvons donc l'utiliser comme
référence à l'orc, puis l'orc aura le contexte du
joueur ici Quelques étapes ont donc
été supprimées. Alors voyons voir. Peut-être dirons-nous quelque chose comme cible
VR, nœud deux D ici. Nous avons donc cette variable locale. Et puis,
chaque fois que nous entrerons l'état de Chase, nous aurons une
référence à cette cible. Vous pouvez même le faire lors de la configuration
si vous voulez que ce soit une seule fois.
Je vais le mettre dans Enter. Ainsi, chaque fois que nous
entrerons dans l'État, nous identifierons la nouvelle cible en
fonction du contexte du joueur. Donc, souligner la cible est égal à l'agent point cible
point point joueur ici Comme nous ne savons pas quel est
le type d'agent d'un PNJ, nous ne savons pas s'il
a une cible et nous ne savons pas si la
cible a un joueur OK, donc cette partie est un
peu fragile car elle suppose
essentiellement
que l'agent est un PNJ, que la cible est définie, et qu'il suppose
que le joueur est toujours la propriété dans
ce contexte de joueur pour obtenir la cible Donc, cette ligne en particulier
pourrait se briser assez facilement si vous changez certaines de
vos autres classes. Vous pouvez
également
configurer certaines assertions ici comme des signes
avant-coureurs Nous pourrions donc dire affirmer l'agent point cible et peut-être affirmer l'agent point
cible point joueur. Passons du point agent Target au
point agent Target est un PNJ. OK, et je pense
que c'est suffisant. Cela ne couvre pas tous les cas, mais si nous devions remplacer cette classe par quelque
chose de complètement différent, je pense que ces deux lignes
répondraient à cette question. Appuyons sur Play et voyons si nous sommes toujours bons ou si
nous rencontrons un problème. On s'attendait donc
à ce que l'agent soit un PNJ. Peut-être que ce que je veux, c'est
l'agent Target en tant que PNJ. J'utilise peut-être simplement
le mot clé lié ici. Donc, ici, je
veux vérifier que l'agent est un PNJ. Le point de l'agent Target
est le contexte du joueur. Nous nous assurons donc
que l'agent est un PNJ afin de pouvoir l'
opérer dessus Et nous n'avons aucun problème pour le
moment. C'est donc une bonne chose. Et la dernière chose à faire est de nous déplacer vers
cette position cible,
et nous allons
le faire lors de la mise déplacer vers
cette position cible,
et nous allons
le à jour de la
fonction de soulignement Mettons donc
cela en œuvre. OK, nous devons donc trouver la position
cible. Jusqu'à présent, position cible. D'accord, cela
va donc être attribué à partir du
point cible de soulignement (position globale Ensuite, nous avons le
poste de notre agent. Jusqu'à présent, position de l'agent. Ce sera égal à la position globale de
l'agent point. Un agent peut donc techniquement
être un nœud normal, je pense, et c'est pourquoi
il n'apparaît pas ici. Poste d'agent de Savara. La raison pour laquelle il ne peut pas
déduire le type est que nous ne savons pas avec
certitude que l'agent possède cette propriété de position
globale Nous devons donc le déclarer ici
sous forme de vecteur deux. OK, et ensuite nous
voulons obtenir la direction entre ces deux endroits. La direction de
Savara sera égale à la position cible moins la position
de l'agent Ensuite, nous normalisons
ce vecteur pour obtenir juste une direction. Il normalise donc la
valeur XY sur une échelle de 1,0. Il n'y aura plus
rien à voir avec cette distance. Ce sera juste la direction
du pair,
ce qui ressemblerait beaucoup
à ce que vous faisiez si vous
saisissez un point pour obtenir un vecteur
pour la saisie au clavier. Ce serait également sur une
échelle de 0 à 1 pour X et Y. OK, maintenant que nous
avons la direction, ne
nous reste plus qu'à augmenter la
vitesse que nous assignons Chacun de nos
personnages aura
donc une vitesse dans le jeu, et nous allons obtenir cette vitesse
grâce à notre manette
de statistiques. Je pense donc qu'une bonne façon de le
configurer serait
d'utiliser le Blackboard Donc, si je clique sur Enemy HSM, nous pouvons passer
au plan Blackboard, gérer, et
nous ajouterons une variable Voyons les statistiques. Il peut s'agir d'un chemin de nœud, puis nous allons
attribuer le contrôleur de statistiques. Maintenant, nous pouvons l'utiliser,
disons, dans notre script Chase
et en tirer le meilleur parti. Donc, lors de la configuration, nous voulons
obtenir ce contrôleur de statistiques. Nous pourrions donc dire var,
underscore stats est un contrôleur de statistiques, et nous dirons que les statistiques de soulignement égales à Blackboard point Git var, et nous recherchons
la À partir de là, nous
voulons gagner en rapidité. Donc, var speed redescend ici
en bas, c'
est-à-dire qu'un float sera égal au point de statistiques de soulignement Get speed Ou si nous voulons que cela soit
encore plus simple, nous pourrions simplement parler de vitesse des points. Nous avons donc maintenant besoin d'une vitesse d'exécution
pour les statistiques de nos personnages. Nous allons donc entrer dans le contrôleur des
statistiques, et nous allons créer une propriété de
vitesse ici. Donc, pour la vitesse, un flotteur
est égal à 100,0. Il s'agit donc essentiellement
de la vitesse de course du personnage au moment de l'exécution. Nous n'avons pas encore configuré de ressources de
définition pour contrôler essentiellement
les statistiques de départ de chaque personnage, comme l'orc ou dame, qui placera dans un
squelette Nous ne faisons donc que
construire cela étape par étape. Maintenant, dans le Chase State,
nous
avons notre direction, notre vitesse,
notre Delta, nous suffit
donc de déplacer le
personnage d'une certaine quantité. Ainsi, lorsque vous déplacez le corps d'un
personnage en deux
D, vous pouvez le faire d'au moins deux
manières. L'une d'elles serait d'appeler
Move and Slide, et ce serait sur le PNJ. Donc cet agent est un truc de
PNJ ici, je pense qu'il
serait préférable var de type PNJ Et au lieu de cela, nous disons que souligner un PNJ
équivaut à un agent à un PNJ Ensuite, nous affirmons que
ce PNJ n'est pas nul. Cela garantit donc que
l'agent est un PNJ, mais nous avons également une référence
au PNJ afin que nous puissions utiliser
ses fonctions de classe Il est donc plus facile
de venir ici et de dire des choses comme NPC point
MOV et slide Vous pouvez l'utiliser, et
cela aurait également la capacité de glisser le
long de toutes
les collisions découvertes par les ennemis. Mais nos
ennemis vont ignorer les collisions ce jeu, en partie parce que
cela vous permet de placer plus d'
ennemis à l'écran, et aussi en partie
parce que
cela simplifie les choses, mais je
vais en fait traduire les points des PNJ ici Cela vous permet donc de vous déplacer sans prendre
en compte la collision. Cela a donc l'inconvénient vos personnages ne pourront pas
glisser le long des bords, comme le bord
de l'eau un arbre ou objets de ce genre qui
les gênent Mais cela a aussi l'avantage de rendre le mouvement aussi
simple que possible, ce qui signifie que vous pouvez
placer plus d'ennemis sur l'écran à la fois. Et je pense que
cela correspond peut-être un peu plus au style
d'un survivant des vampires. Nous allons donc simplement simplifier le cerveau de
nos ennemis. Donc PC Dot Translate, nous le déplaçons simplement dans une
direction d'un certain montant. Nous faisons donc des temps de direction, des temps
de vitesse, des temps Delta. Cela fonctionnerait bien, mais vous devriez peut-être transférer
ce bit dans une
autre variable ci-dessus
et enregistrer notre mouvement, qui est de type vecteur deux, et nous le définirons comme
égal à ce bit ici. Nous faisons donc le calcul en dehors
de l'appel de fonction, puis nous l'appelons sur le vecteur de
déplacement deux
une fois que nous l'avons obtenu. Cela
aiderait également au débogage car vous pouvez y définir un
point d'arrêt, puis cela vous indiquera à
quoi correspond
réellement la valeur du déplacement avant d'appeler translate Sinon, si vous le mettiez
simplement là-dedans, vous ne sauriez pas
ce qui se passe dans l'appel de traduction à moins de
vous lancer ici. Donc un peu plus propre,
un peu plus facile. OK, donc je vais
appuyer sur Play, et nous allons voir
où nous en sommes. Nous avons les orcs qui courent
vers le joueur, et où que le joueur
soit à l'écran, ils
essaieront d'y aller,
et c'est exactement ce à quoi
nous nous attendions Maintenant, ils se déplacent
assez vite, donc je pourrais aller dans
Stack Controller et régler la vitesse par défaut
à quelque chose comme,
disons, 40,0, et pendant le jeu OK, et je pense que c'est un
peu plus approprié. Dans la plupart des cas, l'ennemi
doit se déplacer plus lentement que
le joueur afin que ait
au moins une chance
de l'éviter. Nous pouvons voir qu'ils s'
empilent les uns sur les autres OK, nous allons donc appuyer sur
Play, et nous verrons les orcs vont
courir vers le joueur Ces arbres n'ont
aucune configuration de collision, mais même s'ils en avaient un, ils
traverseraient tout de même le corps du joueur. Maintenant, le joueur est toujours
en collision avec les orcs. Et c'est parce que
les orcs
ont toujours une forme et un corps de collision,
et que le joueur se déplace
en se déplaçant et en glissant C'est donc à nous de décider où
nous voulons aller à partir de là. Nous pourrions déplacer tous les orcs sur une autre couche de collision
en utilisant la collision ici Et je
le ferais probablement maintenant. Configurons quelques couches de
collision. Modifiez donc les noms des couches. Nous dirons que l'un est le monde, deux le joueur, trois l'ennemi, quatre le projectile, et ça devrait être une bonne chose
pour le moment. Nous allons fermer ça. Nous voulons donc déplacer nos
ennemis sur la couche ennemie, et nous allons désactiver le
masque afin qu'ils ne cherchent pas à entrer en collision
avec quoi que ce soit pour le moment Maintenant, si nous appuyons sur
Play, notre joueur pourra
traverser les ennemis,
mais il pourra tout de même entrer en collision
avec n'importe quoi d'autre. Donc en fait, je n'
aime pas vraiment qu'ils s'
empilent les uns sur les autres. Donc, même si
Translate serait la fonction la plus rapide à
exécuter ici pour Chase State. Et c'est certainement
l'ensemble de lignes de code qui constituera le bloc de
performances du projet car des centaines,
voire des
milliers d' ennemis essaieront de se déplacer en même temps à l'aide de
ce script de mise à jour. Et n'oubliez pas que presque tous les
ennemis resteront dans
l'état de Chase en
permanence jusqu'à ce qu'ils soient
réellement vaincus,
et ils ne seront l'état de Chase en
permanence jusqu'à ce qu'ils soient
réellement vaincus, vaincus que pendant une seconde. Vous parlez donc fait que
tout est dans
l'état Chase même temps que
la mise à jour
s'exécute à chaque image. C'est donc la partie où si vous avez besoin d'optimiser
quoi que ce soit, ce serait celui-ci. Ajoutons à
nouveau la collision pour les orcs. Nous les ferons entrer en collision
avec eux-mêmes, et nous verrons si cela nous
donne un meilleur résultat Le fait que les orcs soient tous
superposés n'est pas vraiment idéal Nous allons donc le remettre en place. Donc, au lieu de traduire les points des
PNJ, nous disons que souligner vélocité des
PNJ sera
égale à ce bit
sans Je vais donc me
débarrasser du Delta et nous dirons une nouvelle vélocité. OK. Ensuite, nous avons réglé l'ancienne vélocité sur
la nouvelle vélocité. Et puis au lieu d'
appeler NPC point translate, nous appelons NPC point move and slide Encore une fois, je veux
répéter que cela demande environ deux fois plus de
puissance de traitement à mes tests Donc, si vous pouviez avoir
5 000 ennemis à l'
écran en même temps avant
d'avoir trop de latence, ce sera
maintenant environ 2 500. Mais si vous pouvez
espacer les ennemis, vous n'avez
peut-être pas besoin de 2 500
ennemis à
l'écran en même temps, car ils occupent
tous une position complètement
différente. Alors peut-être que c'est la voie à suivre. Allons donc à l'
orche, et nous ferons sorte qu'il masque l'ennemi Il entrera également en collision
avec le joueur ici présent. Il se tourne donc vers le
joueur, vers l'ennemi. Et faisons-en aussi le
monde, mais pas les projectiles. OK. Ensuite, nous voulons
passer au joueur maintenant que nous travaillons réellement avec différentes couches de collision, et nous allons définir la couche de
collision qui se trouve sous collision,
objet deux D par joueur. Ensuite, nous voulons qu'il
entre en collision avec le monde. Et en fait, c'est exactement ce que je pense. y
repensant, les orcs, je ne veux
peut-être pas qu'ils
entrent en collision avec le joueur Je veux que le joueur soit
spécifiquement capable de traverser les ennemis pour
qu'ils puissent réellement s'échapper. Les ennemis vont donc entrer en collision avec les
ennemis et le monde, et nous allons commencer à jouer à partir de là Nous pourrions même éteindre le
monde à un moment donné. Cela dépend en quelque sorte de ce que
nous voulons. OK, alors voyons voir. Il semblerait que les ennemis empilent pas les
uns sur les autres, ce qui est probablement une bonne chose Ils n'occuperont pas
exactement le même espace. Si nous voulons qu'ils soient
encore plus espacés, nous augmenterons simplement la
taille de cette forme de collision Ici, si je mets le jeu en
pause très rapidement et que nous passons éditeur de formes de collision visibles, dans l'
éditeur de formes de collision visibles,
nous pouvons y revenir. Oh, il faut redémarrer le
jeu pour ça, je suppose. OK, nous allons redémarrer,
puis nous pourrons voir
les formes de collision. Donc, celui d'en bas, c'est la forme de collision de l'orc Le plus important est le rayon de collision Nous pouvons
donc les atteindre en hauteur, mais ils ne peuvent entrer en collision qu'au niveau pieds, car c'est ainsi que nous avons défini les
formes de collision auparavant Mais oui, avec cette configuration,
ils seront un peu plus espacés les uns des autres.
Et je crois que j'aime bien.
23. P22 Créer des ennemis sur la courbe temporelle: Vous pouvez voir nos ennemis travailler. Ils vont entrer un peu en collision l'
un avec l'autre. qui, vous savez, après avoir regardé ceci est certainement
la voie à suivre, plutôt que la méthode de
traduction. Cependant, nous n'avons toujours que
quatre orcs en même temps. Nous voulons être capables de faire apparaître
un tas de nouveaux joueurs, et si nous optons pour
ce style de survivant,
nous voulons qu' ils
apparaissent hors écran
puis qu'ils se dirigent vers Donc, presque en cercle, nous avons besoin qu'ils
apparaissent juste hors écran
, puis qu'ils envahissent le joueur
au centre de l'écran Nous aurons donc besoin d'un
système de génération pour ce faire. Allons dans le monde entier, et nous ajouterons un nouveau nœud de
système ici. Je vais cliquer avec le bouton droit sur Ajouter
un nœud enfant en tant que nœud, puis je vais le renommer
en spawning system ou
SponnorSystem Cliquez dessus avec le bouton droit de la souris,
joignez un script. Nous l'appellerons donc
sponsorsystem point gD et je vais l'enregistrer
dans le dossier systems Ensuite, pour notre système de génération, nous devrons
déclarer toute une série de propriétés différentes qui seront des barres d'exportation afin
que vous
puissiez
les personnaliser dans l'inspecteur Donc, tout d'abord, nous avons besoin de
la marge d'apparition, qui est un float,
et je vais la fixer par défaut à dix.
J'ai oublié le loin. OK, donc la marge d'apparition est la distance minimale par rapport à l'écran que les
personnages peuvent apparaître C'est en pixels. On m'appellera ainsi
des personnages en fait et des personnages
là-haut aussi. Il se peut que nous ayons un monde
où nous engendrons des PNJ, pas nécessairement uniquement Il est donc utile d'être plus générique
lorsque vous n'êtes pas sûr de l'utilisation finale de votre
script, car vous
souhaiterez peut-être qu'il soit plus flexible que de simplement créer
des ennemis. OK, ensuite, nous voulons
la gamme spawn Extra. OK, donc chez Export
VR span extra range, je vais faire passer ce chiffre à 100. OK, il s'agit donc de
la distance supplémentaire qu'un ennemi peut atteindre loin du bord de
l' écran, en plus de la marge
d'envergure Donc, si votre marge d'apparition est dix et que votre plage supplémentaire est de 100, cela signifie que la distance entre les
pixels le bord de la caméra sera comprise entre dix et 110 pixels Ensuite, nous avons besoin des
définitions des ennemis que
nous allons faire apparaître Cela devrait donc être
essentiellement une configuration indiquant ce qui peut apparaître
dans quelles conditions Disons donc que lors de l'exportation,
var random definitions, qui est un tableau de définitions de
spawning OK, maintenant nous n'avons pas
défini cette classe. Ce sera
un type de ressource. C'est une définition que nous avons définie dans l'éditeur et que nous
utilisons pendant le jeu. Une ressource est donc le
type idéal pour ce type de données. OK, cela va donc nous
donner une erreur
car le nom de la
classe de définition de génération
n' est pas défini C'est ce que nous allons faire. En ce moment. Je vais aller à la racine de notre
projet et au système de fichiers. Disons que cela
appartient peut-être aux systèmes parce que cela fait partie du système de
reproduction Je vais cliquer avec le bouton droit de la souris,
créer un dossier, et nous dirons spawning Et puis à l'intérieur d'
ici, je vais cliquer avec le bouton droit de la souris, créer un nouveau script, et je vais dire qu'il génère une définition du trait de
soulignement, qui est de type ressource OK, créez-le
puis ouvrez ce script. OK, et nous devons
donner un nom de classe, définition de la
génération ici en haut, et nous nous occuperons de la configurer
un peu plus tard Donc, pour continuer avec
le système d'apparition, nous avons besoin d'un parent sur lequel nous faisons réellement apparaître nos objets Ainsi, à Export var spawn parent
est une référence à deux nœuds en D, le parent de tout objet
généré par le système Ensuite, nous voulons la fréquence. Je vais donc en faire
une courbe afin que nous puissions contrôler le chronomètre. Au fur et à mesure que le temps passe il suffit d'utiliser une courbe, puis
d'effectuer un échantillonnage à partir de la courbe. Ainsi, plutôt que de définir
dix périodes différentes, après 30 secondes, réapparaissez
toutes les 0,5 seconde. Et après 60 secondes, faites un spa toutes les 0,4 secondes. Nous pouvons simplement l'avoir sous forme de courbe. Et puis, peu importe le
moment où il apparaît, il obtiendra simplement son prochain chronomètre grâce
à cette courbe Donc, si vous voulez
avoir un grand nombre de valeurs, il est plus facile de
définir une courbe avec une pente plutôt que de la suivre une par une
et de
se contenter de X puis Y dans un style
de dictionnaire. Je vais donc dire export
var span frequency, qui est de type curve. OK. Nous y reviendrons dans l'inspecteur. OK, la prochaine chose que
nous allons
vouloir , c'est une variable d'exécution. Je vais l'appeler
var random span stats. Et ce
sera du type dictionnaire. Je veux donner le type de
clé du dictionnaire et un type de valeur. Et le type de valeur
est spawn stats. Cela va donc faire correspondre
le type d'apparition avec les statistiques relatives à
l'apparition dans un ratio de un pour
un au moment C'est donc spécifique au runtime, et c'est spécifique à l'éditeur. Et les statistiques
d'apparition nous permettront de savoir quand nous avons réellement fait
apparaître un objet pour la
dernière fois et
combien de fois nous l'avons fait avec ce
système. Créons donc notre objet
spawn stats. Je vais cliquer avec le bouton droit de la souris sur le spawning
et créer un nouveau script. C'est ce que nous appellerons les statistiques de spawn. En fait,
cette référence d'extension sera comptée. Maintenant, nous pouvons passer à span Stats, et ici, je vais
lui donner le nom de classe spatts Et les deux éléments que
je veux suivre ici sont le nombre d'apparitions, qui est un entier commençant à zéro, et la dernière heure d'apparition, qui est un flottant, et
nous allons le commencer à Ce sera la dernière fois que l'objet sera généré. OK, donc maintenant, dans notre système de
reproduction, nous avons cette relation Ainsi, lorsque nous démarrons
le système de
génération, nous voulons prendre les définitions
et créer nouvelles statistiques
d'intervalle pour
chacune des définitions Cela gère donc
les données d'exécution. Cela gère les détails de l'éditeur pour notre configuration individuelle ici. Donc, si nous voulons
obtenir les statistiques de l'intervalle, nous pouvons simplement faire référence à
la définition de l'intervalle, et il crachera immédiatement les statistiques de
l'intervalle qui
correspondent à cela Voilà en quelques mots
comment fonctionnent les dictionnaires. Vous avez une clé,
elle vous donnera une valeur, ce qui est très
utile pour relier deux objets différents. Configurons donc notre fonction de compatibilité avec le
système. Supposons donc que la fonction underscore ready renvoie la valeur void Et nous voulons dire, pour la définition
dans les définitions aléatoires, que
nous voulons prendre les statistiques d'apparition
aléatoires, et que nous voulons attribuer la clé de
définition à notre valeur, qui sera
une nouvelle statistique d'apparition. Donc, spawn startts point n Okay. Et maintenant, nous avons un de ces objets pour
chaque définition, et ils sont liés
dans un objet dont la définition initiale est la clé et les
statistiques de durée comme valeur Il devient donc
très facile de
rechercher les statistiques d'apparition
pour la définition OK, et disons que le temps d'apparition suivant sera égal
à la fréquence d'
apparition,
qui est la courbe, et
nous échantillonnons sur la courbe le temps écoulé depuis
le début
du jeu Nous avons donc besoin de quelques
variables supplémentaires ici, en fait. Nous allons avoir besoin
du temps écoulé, c'est-à-dire le temps écoulé depuis
que le système d'apparition est
entré dans
le monde du jeu Nous pouvons créer une variable de temporisation. VarsPawtr est donc un float
de type zéro, zéro. Comme il s'
agira d'un minuteur interne, il est normal qu'
un nœud gère son
propre suivi du temps. Nous allons donc essayer de le faire avec
un système de temporisation plutôt que de créer un véritable
objet de chronomètre dans le monde du jeu. Le système de génération
va donc gérer son propre calendrier pour
cette instance Ensuite, la
prochaine apparition du spa sera essentiellement le temps que nous
allons attendre
pour ce prochain spa Configurons la fonction de
temporisation ici, processus de soulignement de la
fonction, et ce sera Delta comme
paramètre, renvoie void Nous allons prendre le
temps écoulé et ajouter le Delta,
c'est-à-dire le temps écoulé depuis
le dernier appel de processus Donc, le temps écoulé
plus égal à Delta. Ensuite, nous voulons
prendre le temps d'apparition
et plus est égal
au Delta également, car nous gardons une trace du temps écoulé depuis le début de l'
apparition. Et si le temps d'apparition est supérieur ou égal
à la prochaine réapparition, nous allons
faire un spa aléatoire Donc, durée aléatoire ici,
et ensuite,
nous allons prendre le chronomètre d'apparition Et plutôt que de le régler
directement sur Zal, je vais mettre moins égal la prochaine apparition, car il peut y avoir un
peu de temps libre, surtout si nous arrivons à des intervalles de temps très
courts Je pense donc qu'il
vaut mieux le rendre plus
précis comme ça. Ensuite, nous dirons que
le prochain moment d'apparition sera un échantillonnage à
partir de la courbe de fréquence Il est donc égal à l'échantillon de points de
fréquence d'apparition, et nous échantillonnons
le temps écoulé Donc, en gros, sur la courbe XY, il s'agit d'un graphique où X représente le
temps écoulé depuis que le
système est entré Et puis Y est le temps
qu'il faut attendre pour la prochaine période. Donc, quel que soit le temps écoulé, il y aura une nouvelle
valeur que nous pourrons obtenir à partir de la courbe afin de fixer
notre prochaine heure d'apparition à. OK, encore quelques lignes, et utilisons notre fonction d'apparition
aléatoire, jusqu'à
présent, random span Renvoie le type de vide. Donc, ce que nous devons faire, c'est obtenir la définition de l'apparition
que nous voulons générer Il s'agira donc d'une sélection
aléatoire basée sur une pondération de chacune
des définitions afin de déterminer quel objet va
être span ou ne pas apparaître OK, je vais passer
ici pour le moment parce que la logique de
l'apparition va
devenir un peu
plus compliquée Je veux juste
faire en sorte que nous puissions
au moins le voir fonctionner dans le monde du
jeu pour le moment. Revenons donc en vue en deux D, prenons le
système de génération et nous assignerons ce bon parent au nœud
ennemi. D'accord ? Donc, comme ça, ce
devraient être des ennemis. Cette fréquence de liaison
va être une nouvelle courbe. Passons donc à cette courbe, et nous pourrons définir des valeurs. Donc, si vous pouvez zoomer
ici, cela vous aidera. Le domaine minimum dans le domaine
Max
sera essentiellement le nombre de secondes pendant lesquelles nous l'avons
dans le jeu. Vous pourriez donc dire quelque chose comme 300 secondes ou 120 secondes. Quelle que soit la durée
que vous pensez que le niveau devrait être, c'est ce que vous
voudriez faire du domaine maximum. Donc, si vous avez une dernière heure pour votre niveau et
que le niveau se termine ensuite, alors ce
serait parfait pour le domaine
Max ici. La valeur X Y, ce que nous voulons obtenir chaque fois que
nous échantillonnons la valeur X. Alors, combien de temps
devrait-il s'écouler entre les apparitions ? Peut-être deux comme valeur
maximale , alors nous montons ici jusqu'à la courbe
et nous cliquons avec le bouton gauche de la souris
pour définir un point, et nous contrôlons simplement cela en quelque sorte
. Donc, en général, au
début d'un niveau, il
faut moins d'
apparitions qu'à la fin Donc, si nous l'affichons
ici et disons, peut-être seulement toutes les 1,5
seconde, qu'un personnage apparaît, puis que nous passons vers
la droite, que nous
cliquons avec le bouton gauche et que nous abaissons
cette image clé vers
quelque chose comme ceci
où nous pouvons dire toutes les peut-être pas 0,2 Oh, peut-être toutes les 0,2 seconde. Ainsi, toutes les 0,2 secondes,
un ennemi peut apparaître. Et nous avons en quelque sorte cette
courbe d'ici à là. Vous pouvez également cliquer
sur les points, et il existe un ajusteur de courbe si vous avez besoin d'un
peu de fantaisie Donc, pour le moment, si nous l'échantillonnions, disons 75 secondes après le début
du niveau de jeu, cela signifierait
que le temps d'apparition serait d'environ 1,2 Nous pouvons le voir à partir de l'intersection du
XY sur la ligne. De même, si nous
allions jusqu'à 225, il s'écoulerait
environ une demi-seconde entre la fréquence d'apparition de l'ennemi La difficulté devient donc de
plus en plus difficile au fur et à mesure que le niveau avance. Et nous pouvons simplement ajuster
cela. Vous pouvez même placer un troisième point au milieu
si vous en avez besoin. Peut-être en avez-vous besoin pour
s'aplatir pendant un certain temps
, puis devenir vraiment dur Contrôlez E pour annuler. Et je pense que vous
pouvez cliquer avec le bouton droit sur un nœud pour
le supprimer du graphique. Deux
points
suffiront probablement ,
car vous pouvez en quelque sorte contrôler cela avec les
poignées si vous devez
modifier cette vitesse à laquelle cela devient de plus en plus difficile. Mais
nous pourrions en quelque sorte le faire. Maintenant, je vais personnellement
prendre cette route vers la gauche
parce que lors de nos tests, je n'ai pas vraiment envie de
tester les 2 dernières minutes. Je veux juste que ce soit
rapide afin de pouvoir montrer comment cela va
fonctionner plus tard Mais dans votre jeu actuel, n'hésitez pas à avoir une courbe d'apparition
beaucoup plus
longue et plus longue Donc pour l'instant, après
120 secondes ici, tout va être
plat pour le reste. Et c'est très bien
pour moi en ce moment. OK, maintenant créons une définition de
spawning. Là-haut. Nous allons en ajouter un. Nous devons créer une nouvelle ressource pour
la définition du spawning Donc, nouvelle définition du spawning, nous allons cliquer avec le bouton droit de la souris et l'enregistrer Passons aux
personnages, aux ennemis. Et je peux le mettre dans le
même dossier où se trouve l'orc parce que nous allons l'
appeler orc spawning Définition de l'apparition d'orcs. Je pense que le fait de faire apparaître des orcs est une bonne chose. Dot TR, oui, nous l'enregistrons. Mais bien sûr,
rien n' y est encore associé. Nous devons donc ajouter la scène
pleine que nous allons
réellement instancier chaque fois que
nous ferons apparaître OK, donc dans la
définition du spawning, script. Ajoutons l'exportation
du vR à la scène, qui est un type de scène compacte. Et nous pouvons également ajouter
un poids de variable d'exportation, qui sera un flottant de 1,0. Nous avons donc la scène à
générer et le degré de préférence pour
sélectionner cette scène comme choix d'apparition aléatoire. Ainsi, lorsque nous sélectionnons au hasard, nous pouvons avoir trois types, et ils ont chacun
un poids différent. Donc, si l'un a un poids de trois et l'
autre un poids de un, alors celui qui a
un poids de trois a trois fois plus de chances d'être sélectionné que celui qui
a un poids de un. Et ce n'est qu'une façon
de le rendre
un peu plus aléatoire Ce n'est donc pas parfaitement aléatoire. C'est que chaque choix
a un poids,
et c'est le poids
qui détermine les chances. Dans le schéma de la sélection
aléatoire. Nous cliquons donc sur le
système de génération maintenant. Ok spawning va maintenant
avoir une référence de scène, chargeons
donc rapidement notre scène Ok OK, maintenant ça
nous donne ce dont nous avons besoin. Donc, pour le
spawn aléatoire, je vais le
rendre aussi simple
que possible pour le moment en obtenant la première définition de la liste, puis
en l'
instanciant Jusqu'à présent, l'instance, qui
sera un numéro deux D, est égale aux
définitions aléatoires à la position zéro. Et nous allons
obtenir la scène, et nous allons l'instancier. OK, nous avons donc maintenant notre Oc. C'est la position zéro
et l'apparition de l'orc. Nous allons donc le prendre
et l'ajouter
au parent aléatoire ou
au parent d'origine Donc spawn parent point Et
enfant de l'instance, nous allons simplement faire passer l'instance en position 00 pour le moment Nous nous occuperons de son
positionnement aléatoire plus tard. Et puis nous pouvons voir que la gestion
de l'intervalle est déjà gérée ici en dehors de
la fonction de génération aléatoire Donc, honnêtement, c'est peut-être
à peu près tout ce dont nous avons besoin. À des fins de test, je
vais prendre 10
secondes ici,
juste pour que nous puissions vraiment voir l'
accélération de l'apparition si cela fonctionne, et nous allons appuyer sur Play.
Alors voyons voir. Avons-nous des
personnages qui arrivent à 00 heures ? Oh, oui, oui, je les
vois juste là. Ok, alors voici nos orcs. Vous pouvez voir qu'il apparaît de plus vite au fil du temps Nous avons donc déjà
atteint le pic d'apparition des orcs, et nos lances peuvent simplement
les traverser
car notre lance
n'a pas de nombre maximum de coups. Il est
donc très facile de gagner
cette partie actuellement car notre lance
n'a pas de nombre maximum de coups Il est
donc très facile de gagner Mais vous pouvez voir comment la
courbe nous permet accélérer
facilement l'
apparition au fil du temps, et c'est une
fonctionnalité intéressante que j'aime vraiment beaucoup C'est bien mieux de
travailler avec cela que de définir comme après 10 secondes, maintenant le taux d'apparition est de 1,0, et à 20 secondes, il est maintenant de 0,9 Maintenant, vous pouvez simplement gérer toutes les
valeurs pour tout le temps, essentiellement être gérées
par cette courbe, et il est beaucoup plus
facile de les modifier. Vous perdez en précision,
mais il devient beaucoup plus simple de vous donner une idée générale de ce dont
vous avez besoin pour ces valeurs. Et vous pouvez toujours,
vous savez, cliquer et définir des valeurs absolues. Donc, dans les points ci-dessous, vous
pouvez voir que vous pouvez définir les positions XY exactes pour ces points si vous avez besoin
d'être vraiment technique. Mais dans la plupart des cas,
comme je l'ai dit, deux points sur une courbe
suffisent. Il y a donc encore beaucoup à ajouter
au système de reproduction, mais c'est un bon
début pour ce dont nous avons besoin
24. P23 pousse hors écran avec décalage calculé: OK, donc
notre frai fonctionne déjà. Mais le problème, c'est
que
les personnages apparaissent juste
au point 00 où nous voulons
qu'ils apparaissent hors la caméra, où que notre
caméra regarde On dirait donc qu'ils viennent de
très loin, mais en réalité, ils viennent
juste d'un peu loin de
ce que nous pouvons voir. Ensuite, ils
vont nager le joueur au lieu de réapparaître
au point 00 Travaillons donc là-dessus. OK, donc dans le script de notre système
Spanner, nous allons
y revenir au hasard Donc, pour le moment, le spawn aléatoire n'
est pas très aléatoire. Travaillons à faire apparaître
l'ennemi hors de l'écran. Nous devons donc trouver un nouvel emplacement où nous allons
générer l'instance Donc, ici,
ajoutons une position var spawn. Ce sera donc un vecteur deux. Et nous allons l'obtenir spawn position off camera Nous voulons donc générer une position de
portée qui ne soit pas
visible par la caméra. Cela va donc
impliquer quelques calculs et la fenêtre d'affichage actuelle
de la caméra elle-même. Créons donc notre fonction, Get span position, off camera. Donc, la première chose à
faire est d'obtenir le TD de la caméra qui est
actuellement actif, ce que notre
joueur humain voit à l'écran, afin
que nous puissions rester en dehors
de cela lorsque nous apparaissons. Notre caméra
sera donc égale à Get viewport. Donc, en gros, nous
examinons ce que le joueur
peut voir actuellement, et nous allons obtenir
la caméra à deux D que le joueur utilise
pour visualiser la fenêtre d'affichage Nous avons donc accès à
cette caméra.
Peut-être qu' il est même
logique de la marquer comme une caméra deux D. Nous pourrions
donc faire un
contrôle de sécurité si nous voulons, disant que si la
caméra est nulle,
ce qui ne devrait probablement jamais
arriver, mais en théorie,
si c'est le cas, nous voulons envoyer un message d'erreur indiquant
qu'il n'y a pas de caméra, aucune caméra deux D
trouvée dans la fenêtre d'affichage Cela pourrait peut-être se produire si,
pour une raison quelconque, vous utilisez une caméra 3D alors qu'il n'
y a tout simplement pas de caméra deux D. Je suppose que cela déclencherait une erreur.
C'est donc possible. OK, donc si cela se produit, il y a un
problème majeur dans le jeu. Nous allons simplement renvoyer le point
vectoriel zéro. Cela se produit, nous allons signaler le message d'erreur et laisser le
développeur comprendre
: Oh, pourquoi n'y a-t-il pas de
caméra dans le jeu. D'accord, mais en supposant que
nous ayons une caméra, nous pouvons vraiment faire le calcul. Nous voulons donc d'abord obtenir la position centrale
de la caméra. centre de la caméra Let's do VR est un vecteur deux, et nous voulons la
position globale du
camera doc pour cela.
Oui, juste comme ça. Ensuite, nous voulons connaître la
taille de l'appareil photo. Quelle est donc la taille de
la caméra sur les dimensions X et
Y. Cela devrait donc être
un autre vecteur deux. Nous allons donc dire que la taille de la caméra VR du vecteur deux
sera égale à celle du vecteur deux, et nous obtenons la taille de la fenêtre d'affichage Donc, obtenez la taille des points de la fenêtre d'affichage, puis nous voulons la diviser par
le zoom de la caméra OK, donc la raison en est
que notre appareil photo, surtout dans un jeu Pixar en
deux D, si je clique sur l'appareil photo
deux D ici,
puis que nous regardons le zoom,
vous pouvez voir que notre zoom
peut en fait prendre la
fenêtre d'affichage et la
redimensionner puis que nous regardons le zoom, vous pouvez voir que notre zoom
peut en fait prendre la
fenêtre d'affichage et la
redimensionner quatre ou cinq fois afin que nous puissions bien voir
notre Pixar C'est pourquoi nous devons nous assurer que même si nous
examinons,
disons, 12 80 x 720 pixels, si nous zoomons d'
un facteur cinq, la taille
de notre caméra est réellement réduite à ces nouvelles
valeurs basées sur le zoom C'est pourquoi nous devons
procéder à cet ajustement. Ensuite, nous avons
la caméra VR rect, qui est plutôt du
type rect two D ou rect deux. Et il s'agit d'une forme
rectangulaire qui représente les limites
de notre appareil photo C'est basé sur la taille. Donc, pour le calcul,
nous construisons un nouveau rectangle en faisant le rectangle deux
puis les parenthèses Et notre premier paramètre est le centre de la
caméra moins la taille de la caméra. Ensuite, nous multiplions
cela par 0,5. Et puis pour la
deuxième dimension, nous avons juste la taille de la caméra. Cela nous donne donc la boîte rectangulaire
appropriée qui représente la
caméra à l'écran. Ensuite, nous voulons
sélectionner au hasard un avantage que nous allons utiliser pour faire
apparaître les ennemis Notre caméra est donc une boîte, elle a
donc quatre bords, et nous pouvons essentiellement faire apparaître
nos ennemis en haut, en bas, vers la
gauche ou vers la droite Nous voulons donc simplement choisir
l'une de ces arêtes, et comme nous
voulons une distribution uniforme, nous allons le faire de manière aléatoire.
Et puis il n'y a plus d'attente. Donc, en substance, cela
devrait simplement signifier qu' ils viennent de toutes les
directions de manière assez constante. Donc, si nous disons var edge, que ce sera une valeur entière, et qu'elle sera égale
à Rand I pour un entier. Nous allons
lui donner quatre pour cent ? Le signe du pourcentage
signifie le reste, donc c'est le reste
de la division par quatre, ce qui signifie que ce
sera zéro, un, deux ou trois, et ceux-ci
représentent nos quatre arêtes. OK, alors nous avons besoin d'un offset. quelle distance du
bord voulons-nous
réellement faire apparaître notre ennemi Nous ne voulons pas qu'ils
apparaissent directement sur le bord, car ils
seraient alors visibles à l'écran lors de leur
entrée dans le monde du jeu, et cela aurait l'air
plutôt sympa Supposons donc var offset, et ce sera
un flottant, je crois,
égal à la
marge de soulignement de l'intervalle plus un flottant aléatoire OK, nous
générons donc un flottant aléatoire
ici et nous allons multiplier par
la plage supplémentaire de portée. Donc, le F aléatoire peut être compris entre 0 et 1 0,0. Ainsi, une valeur zéro fois notre plage
supplémentaire de durée nous
donnera une
distance d'apparition supplémentaire de zéro Et si c'est 1,0, cela donnera 100 car c'est ce que
nous avons défini pour la propriété span extra
range. Et si nous avons
quelque chose entre les deux, nous allons obtenir
une valeur de pixels de 0 à 100 En plus de notre marge d'envergure, nous
donnant le décalage total. OK, nous allons donc dire
var spa position, et cela sera
attribué à un vecteur 20 ici. Zéro met plutôt la
constante en majuscule. OK. Ajoutez quelques lignes supplémentaires. Et nous dirons que si l'arête est
inférieure ou égale à un, nous la traitons
comme le haut ou le bas. Prenons ensuite notre avantage et nous en ferons une
déclaration de correspondance afin de pouvoir calculer la position du fils fonction de l'arête que
nous utilisons réellement. Supposons donc match edge, et par défaut, nous
signalerons une erreur gérée. Numéro d'arête, pourcentage
x pourcentage d'arête. C'est donc très utile si nous oublions, pour une raison ou une autre, de placer
l'un des étuis. Nous pouvons maintenant faire correspondre
l'entier arête à une valeur Enum si nous voulons être un peu plus descriptifs verbalement Donc, si nous montons jusqu'en haut, je vais déclarer une énumération, disons
enum edge, et nous allons
avoir le haut comme zéro, le
bas comme un, la gauche comme
deux et la droite comme trois OK, alors maintenant, si nous descendons ici et que nous associons le
bord à ces valeurs, nous pourrions dire bord point
haut, si je ne me trompe pas. Attends une minute. Il semblerait qu'il y ait un
petit problème ici. Je dois quand même mettre le signe
égal ici pour
le recto de la caméra. OK,
donc ça va marcher. Nous pouvons maintenant revenir à
l'endroit où nous
faisions la correspondance Enum, et nous voulons réellement
mettre le code ici La position d'apparition
X pour le haut sera donc égale
à un
flottant aléatoire issu d'une plage Nous parlons donc de plage de soulignement Rnf, et nous passons de position du point X du
rectangle de
caméra au point X
plus le point X de la taille du point de caméra. Donc, pour un rectangle tutti, la position X
sera toujours là-haut Donc, si vous ajoutez la
taille X à
cela, vous arriverez ici
sur le côté droit. Donc, si nous voulons
atteindre le sommet, nous voulons nous positionner quelque part
entre ici et ici. C'est pourquoi nous prenons
la valeur aléatoire de la position, puis la
position plus la taille. Cela nous permet donc de nous situer quelque part entre
cette ligne. Ensuite, nous devons prendre la position
Y, bien sûr. La position d'apparition Y sera donc égale
à la position de la caméra Rect. Position du point, point, Y. Moins le décalage Nous soustrayons donc le décalage car lorsque vous
soustrayez une valeur Y,
vous
montez en fait sur Nous avons donc la position Y, qui est le haut
de notre rectangle. Alors, laisse-moi chercher de
la peinture ici. La position Y est
là-haut, non ? Plus précisément, ce
serait la valeur Y qui nous amène au
point 00 du rectangle. Ensuite, vous prenez le décalage, qui sera une valeur
aléatoire ici. Notre ennemi va donc apparaître dans cette zone, gros, et
cela dépend
du décalage Y
généré aléatoirement Nous avons donc notre marge de dix pixels, puis
110 pixels là-haut comme zone de marge positive supplémentaire, puis nos ennemis peuvent apparaître quelque part à l'intérieur d'
ici pour obtenir la meilleure valeur OK, j'espère
que cela a du sens. Ensuite, nous faisons en quelque sorte
la même chose pour tous les autres bords. Donc, le bord, le point, le bas. Ce sera précisément
cette file d'attente ici. Et puis la position
Y de la travée va être un
peu différente. Nous voulons donc que le point de
position d'apparition Y soit égal point Y de position du point droit la caméra
plus le
point Y de la taille du point droit de la caméra. Cela nous amène au
bas du rectangle Parce que maintenant nous
ajoutons la taille Y, qui nous ramène
à cette zone inférieure. Ensuite, nous ajoutons simplement
le décalage à cela. Ajoutez donc le décalage et
notez que nous ajoutons le décalage parce que nous
voulons
descendre plus bas sous le boîtier de la caméra, mais en haut, nous
soustrayons le décalage C'est très important. Maintenant, nous faisons la même chose avec
la gauche et la droite. Donc, le point d'arête est à gauche, ce qui correspond à nos deux enum Et ce sera le point de
position d'origine X égal, le point position du point droit de la
caméra y moins le décalage parce que nous
allons vers la gauche sur notre boîte, donc nous voulons
décaler vers la gauche C'est tout pour la position X du
spa, et c'est le point de vente du spa, pas pour la
position du spa. Je l'ai abrégée. Donc, le poteau Y du spa
va maintenant être égal à, et nous prenons une plage F aléatoire entre le rectangle de la caméra ou point Y. Ce sera
donc
le haut de notre boîte Et puis l'autre côté du hasard sera
le bas de notre boîte. Ce sera
donc le point Y de
position du point détruit par la caméra plus le point
Y. Donc, lorsque nous ajoutons la taille, encore
une fois, nous descendons vers
le bas Notre position d'envergure verticale
pour la gauche et la droite se situe donc quelque part
sur cette ligne. Enfin, tout en majuscules, le
bord est pointillé à droite. Il aura la position X de la
caméra
, la position du point droit, le point X plus la caméra, nous dimensionnons le
point X plus le décalage. Donc c'est pareil. Nous
avons une boîte ici et une boîte ici, et nous voulons
décaler vers la droite
ou décaler vers la gauche si
nous apparaissons à gauche ou à droite Permettez-moi de vérifier
cela. OK, position X plus point X plus décalage. OK, ça a l'air correct. Bien entendu, nous allons
le tester en jeu. Ensuite, la position d'envergure Y devrait être la même,
car nous avons toujours affaire à cette verticale qui choisit un point aléatoire
entre ici
et ici et ici pour les générations de gauche et de
droite. OK, donc ça devrait
être essentiellement notre code de position span. Ensuite, nous voulons
renvoyer la position de la travée. Cette fonction
est donc correcte telle quelle. Ce n'est pas trop mal.
S'il grossissait un peu, je l'
emporterais probablement à une autre fonction. Honnêtement, nous avons pu
parce que j'ai ressenti le besoin de mettre ce
commentaire dans le code. Donc, si je le voulais, nous
pourrions dire fonction,
souligner, calculer le spawn
final, qui retournera
sous forme de vecteur deux Ensuite, nous l'avons mis ici au lieu de le définir par défaut sur le vecteur deux et de mettre
tout cela ici. Et nous l'avons limité à
nos nouvelles fonctions, donc nous le réfractons Et puis nous
allons évidemment avoir besoin de certains paramètres
pour que cette fonction fonctionne. Donc, tout d'abord, nous avons
besoin, disons, caméra rect, qui
est un rectangle deux, puis nous avons besoin de la taille de la caméra, qui est un vecteur deux Control S. Ensuite, nous voulons rétablir la position du
fils à l'intérieur d'ici. La position d'apparition de la variable
est donc un type de vecteur deux. Nous descendons vers le bas et nous reprenons la
position du spa. OK ? Ici, nous voulons
transmettre ces paramètres, c'est-à-dire la hauteur de la caméra et la taille de la caméra. Ensuite, nous en avons besoin ici. Enfin, nous avons également
besoin de l'offset. Alors, transmettez le décalage ici. OK. Ensuite, nous avons besoin du
décalage en tant que paramètre. Donc offset, et je pense que
c'était aussi un vecteur deux. OK ? Donc, Control S
n'était-ce en fait qu'un flux ? Oh, c'était un char. OK.
Donc un flotteur unidirectionnel. Et une fois que vous l'avez enregistrée, la
plupart de ces erreurs
devraient disparaître. Nous devons donc correspondre sur le bord, puis nous devons revenir. Nous pourrions également mettre
ce paramètre de bord. Donc, Edge, qui
va être de type. Nous pourrions simplement
utiliser l'énumération ici. Cela devrait fonctionner correctement
car un entier peut simplement être attribué automatiquement à
une énumération pour autant que je sache Donc, si nous montons ici puis que
nous passons dans le bord, d'accord, cela va entrer
ici et cela fonctionnera comme une énumération,
et c' fonctionnera comme une énumération, est en quelque sorte ce à quoi nous nous attendons pour l'égaler ici Donc, pour passer un peu en
revue les énumérations, une énumération est essentiellement une
liste de valeurs nommées qui correspondent à la
position entière à l'intérieur de cette Donc, le zéro, parce que c'est le premier, est la position zéro. C'est donc comme le premier
élément d'un tableau. On pourrait presque y penser
comme ça. Et puis en bas c'est un, à gauche
c'est deux et à droite c'est trois. Je pense que certaines langues vous
permettent d'attribuer des valeurs entières
personnalisées à un Eenum Je ne sais pas si
vous pouvez le faire dans GdCrip mais c'est
essentiellement l'idée Si vous ne jouez pas avec ça,
alors zéro est le top. Un est juste en bas, deux juste à gauche et
trois c'est juste à droite. Mais ce que cela
vous donne l'avantage de faire, c'est que lorsque vous
créez une fonction comme celle-ci, au lieu de dire
zéro, un, deux, trois, qui est très obscur pour ce que cela
représente réellement, qu'est-ce qu'un zéro ? Vous pouvez simplement le remplacer par
edge dot top, qui est la valeur de zéro, mais quelqu'un qui lit
le code voit bien plus clairement ce que cela est
censé représenter. OK, voyons voir. Nous avons donc notre
position Get spawn hors caméra, et nous l'avons eue ici de
manière aléatoire. Nous devons donc maintenant définir la position de l'instance. position globale de l'instance sera donc La position globale de l'instance sera donc égale
à la position d'apparition Cette partie est facile. Appuyons sur Play et voyons si cela fonctionne
réellement. Parce que c'était pas mal
de code. OK, donc nos personnages n'
apparaissent pas à l'écran. Je les vois sortir
de l'écran. Voyons voir, ou n'importe laquelle venant
du bas et de la droite. Je n'en vois aucune
venant du haut ou de la gauche, et cela
m'inquiète un peu. Je vais donc voir si je peux les trouver. OK. Et je pense à ce que nous
devrions faire pour tester cela. Je vais terminer le jeu
maintenant, c'est descendre ici et ils nous manquaient en haut et
sur la gauche. Ajoutons donc un point d'arrêt
ici et un point d'arrêt ici. Donc, si, en fait, des
personnages essaient d' apparaître par le haut et par la
gauche, ils devraient apparaître. Ensuite, nous pouvons vérifier les valeurs qu'ils atteignent réellement. J'ai donc oublié de m'arrêter dans le jeu, donc il atteindra
automatiquement ce point d'arrêt Appuyez sur Play et voyez si nous pouvons
en obtenir un par la gauche. OK, j'en ai vu un
qui venait du haut, en fait. OK, et il y en a un qui
vient de la gauche, soi-disant. Donc ça a l'air d'aller en
quelque sorte, n'est-ce pas ? Peut-être que si j'augmente un peu le
taux d'apparition,
ce sera plus facile à voir avec certitude Alors partons à la découverte du monde entier. Avons-nous le système de clé ? Je vais juste le prendre ici. Je me
souviendrai de la valeur. C'était donc 0,66 et 1,5, et je vais juste baisser de
cette façon afin que nous
puissions apparaître très rapidement pour le moment Appuyons sur Play, et
je vais tester. Nous allons donc juste voir
un tas de gars apparaître très vite ou nous devrions Et oui, d'accord, ça
a l'air plutôt correct. Pouvons-nous trouver un gars en
bas à gauche ici ? Parce que je veux
que cela se produise aussi. Ok, ouais, ouais,
enfin, enfin. Nous avons deux gars là-bas. OK, donc je pense que cela
fonctionne correctement. S'il y a un problème, il est possible que le calcul ne
soit pas correct, mais je pense que
les choses se passent comme prévu. Si ce n'est pas le cas, c'est un
peu difficile à dire. Mais oui, je
les vois venir de toutes les directions. Je
pense donc que nous sommes bons ici. sur ce calcul Cependant, il
serait très
facile de se tromper . Je vais
donc le mettre à
nouveau à l'écran si vous
devez vérifier. Nous avons donc notre position d'apparition. C'est ce que nous obtenons depuis la position d'
apparition G hors caméra. C'est notre fonction ici. Nous obtenons donc le centre
de la caméra à partir de la position globale de la caméra, la taille de la caméra,
à partir de la taille de la fenêtre d'affichage, puis vous divisez cela
par le zoom de la caméra Le rectangle de la caméra
est construit à partir du centre de
la caméra moins la taille de la caméra multipliée par 0,5, puis la valeur Y correspondant
correspond simplement à la taille de la caméra. L'arête est un entier aléatoire, et vous obtenez le
reste de quatre, ce qui vous donnera de
zéro à trois. Le décalage est égal à la marge d'
espacement plus F multiplié au hasard par
la plage supplémentaire de portée. Il s'agit donc d'un point de 0 à 1
point avec des points décimaux, puis nous ajoutons la plage
supplémentaire d'espacement sous forme de
pourcentage de Calculez la portée finale en utilisant toutes ces propriétés. Nous avons simplement
configuré le recto de
la caméra, la taille de la caméra, le
décalage et le bord. Nous en tirons donc compte ici. Nous sommes à la hauteur. Donc zéro, un, deux et trois. Ensuite, pour la valeur X
en haut et en bas, nous faisons une plage aléatoire
entre le côté gauche et le côté droit. En utilisant ce calcul. Pour la position Y, on prend la position Y en haut
puis on soustrait le décalage
ou pour le bas, on ajoute la taille pour
arriver en bas, puis on ajoute le décalage Ensuite, pour la gauche et la droite, nous faisons la même chose en sens inverse. Donc, pour X, nous faisons le
côté gauche moins le décalage, ce qui nous donne plus à gauche. Ensuite, pour le côté
droit, nous ajoutons la taille à la position
X pour obtenir le côté droit, puis nous ajoutons le décalage pour aller plus à
droite à partir de là. Ensuite, pour la position d'envergure Y, nous faisons une plage aléatoire
entre la position, qui est la position Y zéro, et ensuite la position plus la taille, ce qui nous donne la position dans le
coin inférieur de l'axe Y. Cela fera en sorte que les espaces gauche et droit
se situent quelque part entre le haut de notre écran verticalement et le bas
de notre écran verticalement. Mais leur position est
décalée par rapport à l'écran, nous ne les
verrons
donc pas apparaître. Et nous avons renvoyé
la position de l'intervalle afin de pouvoir l'utiliser dans
cette autre fonction, et cela
va à peu près résumer tout cela.
25. P24 Création d'un ennemi aléatoire avec les conditions de poids et de temps: Notre spawning hors écran
fonctionne essentiellement. Il y a quelques points que
je voudrais régler, puis nous ajouterons un ennemi squelettique afin de
sélectionner au hasard l'ennemi
que nous allons faire apparaître en
fonction d'un système d'attente Clôturons donc le jeu. Et tout d'abord, nous pouvons
voir cette étiquette ici, l'instance de
texte de combat flottant. Nous n'en avons
plus besoin car nous avons terminé
le montage de l'animation. Je vais donc
supprimer ce nœud. Et puis en ce qui concerne le système de reproduction, pour la démonstration, j'ai pris cette méthode
plus bas qu'avant Donc, pour ce qui est du premier point, je voulais
revenir à l'original, à savoir
, je crois que c'était 0,66 seconde à l'origine,
puis 1,5 Je vais faire en sorte que ce soit
0 seconde, puis 1,5 seconde comme période d'
apparition Nous pouvons donc simplement aller
ici et taper 1.50. Appuyez sur Entrée, si vous voulez
être précis dans la configuration, et vous pouvez voir que
le point sélectionné indique 0 seconde, puis 1,5 seconde
comme temps d'apparition 0 seconde est le
temps écoulé ici, si vous vous en souvenez. Je pense que ces quatre ennemis du travail, nous pourrions simplement les
retirer de la scène. Je vais donc les supprimer. Je vais donc
les sélectionner, appuyer sur OK. Vous pouvez appuyer sur Play juste pour vérifier que tout fonctionne
toujours, et nous devrions faire
apparaître les ennemis hors écran et
venir vers nous Nous n'en avons pas, vous pouvez
appuyer sur Play si vous voulez vérifier et simplement vous assurer que
les ennemis apparaissent toujours. Nous n'avons tout simplement pas besoin de
ces ennemis initiaux ,
car ils
apparaîtront après le début du jeu. Nous voulons donner au
joueur quelques secondes pour, vous savez, se familiariser avec les commandes, etc. OK, donc pour créer
l'ennemi squelette, clonons d'abord l'orc qui sommeille en moi. Je vais donc
rechercher Orc et le projet. Nous descendons à Orc Dot TCN. Je vais cliquer avec le bouton droit de la souris
et le cloner, donc dupliquer. Je l'appellerai skeleton point TCN. Ensuite, cherchons dans
le projet la
scène-squelette que
nous venons de créer. Double-cliquez dessus.
Ensuite, nous allons zoomer ici. Je vais donc prendre
le sprite ici et le remplacer par le sprite
squelette Passons donc rapidement
à droite, et nous allons
chercher une idole, et il devrait y en avoir
une pour le squelette. Il se peut que nous ayons besoin de zoomer un peu. Il devrait y en avoir un ici
pour un petit ennemi. Ensuite, en haut à
droite, nous pouvons effectuer un chargement rapide, et vous devrez peut-être zoomer
un peu pour le trouver,
mais tapez idle et nous chercherons la feuille de sprites squelettique C'est peut-être un peu
difficile à voir, mais je vais sélectionner
celui-ci ici. Si vous ne le trouvez pas, n'
hésitez pas à naviguer dans le
système de fichiers et à le trouver. C'est probablement dans le dossier de base du
squelette. OK, maintenant renommons le nœud
racine en squelette. Et nous allons
devoir configurer
le lecteur d'animation pour nous
assurer qu'il diffuse animations de Idle Skeleton, puis de Ron
Skeleton et de
Skeleton Death également. Passons donc au lecteur
d'animation. Et puis, en bas
à droite, nous
devons essentiellement changer la texture de chacun
d'entre eux. La texture de réinitialisation se déplacera donc en haut à droite, puis
chargera rapidement la
feuille de sprite Idle que nous venons de sélectionner le moment, il est
déjà présélectionné, nous pouvons
donc le sélectionner. Et vous voudrez peut-être
jouer et vous
assurer que la réinitialisation
du squelette est activée , puis la texture des
autres animations est également modifiée. Donc, au ralenti, nous allons cliquer sur la texture,
aller en haut à droite. Chargement rapide, choisissez la
feuille de sprite pour la troisième fois. OK, et appuyez sur Play. Ensuite, assurez-vous que cela
fonctionne correctement. Ça a l'air bien. Passons à
l'animation sur la mort. Sélectionnez la texture ici. Et comme il y a beaucoup
d'images en haut à droite, il est un peu difficile de
voir ce qui se passe, encore plus difficile que
l'animation inactive. Je pense donc qu'il serait plus facile de simplement accéder
à l'illustration,
puis de trouver le pack gratuit de Pixel
Crawler, l'entité, monstres, l'équipage squelettique, la mort de base, puis de simplement faire glisser
la feuille de mort en haut à droite comme ça OK, appuyez sur Play et assurez-vous qu'il joue correctement. Il semble donc qu'il y ait huit
images d'animation ici. Nous devons donc zoomer
un peu comme ça et nous
assurer que les images H seront réglées
à huit en haut à droite. OK, puis appuyez sur Play. Ouaip.
OK, ça a l'air correct. Maintenant, nous devons ajouter
les septième et
huitième images-clés Donc, cliquez avec le bouton droit sur le cadre
après 0,6 seconde et insérez la touche, cliquez dessus, allez
en haut à droite, changez-le en six, faites
la même chose à 0,7. Vous ne pouvez pas y prendre de capture car nous devons étendre l'animation. Faites donc en sorte que l'animation dure
0,8 seconde. Cliquez sur 0,7, S cette
image-clé et changez-la sept
pour la huitième position c'est ce que nous voulons.
OK, appuyons sur Play. Joue encore une fois.
Voici notre animation. Maintenant, déplacez l'
état de mort terminé jusqu'à la fin en 0,8
seconde, et voici notre animation de mort. OK, donc nous
voulons courir. Ça devrait être plus rapide. Cliquez sur la texture. Et puis en bas à gauche, là où il est écrit Skeleton Base, choisissez le dossier d'exécution, la
feuille de course en haut à droite. Déposez ça dedans. Appuyez sur Play, et nous pouvons voir que notre animation de course est en train de
jouer. Il a les mêmes tranches d'âge, c'est
donc tout ce que nous devons changer. OK, c'est la base
de notre squelette. Nous pouvons aller voir le contrôleur des
statistiques. Outre l'attribution de statistiques, c'est comme la vitesse de course
et les PV, etc. pour notre squelette, et
des valeurs personnalisées pour nos orcs et notre CD qui
constituent la configuration
de base de nos deux personnages Revenons donc au monde, puis nous aurons
le système de génération, n'est-ce Nous avons donc nos définitions aléatoires ici
sur la droite. Nous voulons ajouter une autre définition
aléatoire, puis nous allons en
créer une nouvelle. Donc, nouvelle définition du spawning. Supposons que le poids du squelette soit
de 0,5, donc nous aurons deux fois moins de
squelettes que d'orcs Et chargeons rapidement la scène du
squelette, d'accord ? Ensuite, nous allons simplement vérifier
le script du système de parrainage. Alors ouvrez-le, et nous verrons
la sélection aléatoire ici. Donc, pour le moment, il ne génère pas de scène de sélection
aléatoire. Il s'agit simplement de sélectionner le
premier du tableau. Nous avons donc besoin
d'un peu de code ou d'une fonction pour choisir la scène que nous allons
réellement incarner. Zoomons donc,
et je vais dire que var scene est une scène pleine, et nous allons
vouloir sélectionner le spawn aléatoire dans
une liste de définitions pouvant être étendues de manière aléatoire Nous allons donc dire des
définitions aléatoires, sauf cela. Ensuite, nous devons créer cette fonction select random
spawn. Je vais donc faire la fonction, Control V pour le coller dedans. Ensuite, nous allons
dire que les définitions P sont un tableau de définitions de génération,
voyons comment ils l'
appellent Et nous allons renvoyer
une seule scène pleine à craquer. Donc, si les définitions P sont vides, nous pouvons renvoyer null car il n'y a rien
à sélectionner. Sinon,
calculons à partir de
tous les poids totaux, puis générons de
manière aléatoire une valeur comprise entre zéro et
le poids total pour déterminer la scène que
nous sélectionnons réellement. C'est donc de la sélection aléatoire, mais c'est de la sélection
aléatoire pondérée. Disons donc que si notre poids total est un flottant, il commence à 0,0. Ensuite, pour les définitions
ou les définitions D et P, nous allons prendre
le poids total, et nous allons
l'augmenter du poids de définition. OK ? C'est ce que nous faisons
pour chaque définition. Nous avons maintenant le poids total, et nous devons générer une valeur comprise entre zéro et
le poids total. Jusqu'à présent, disons que
la valeur aléatoire est un flottant. Et nous allons prendre un
F. Donc , c'est zéro
à un point, oh, tout
compris, décimal compris, et ce sera
multiplié par le poids total Cela
nous donnera donc une valeur aléatoire comprise entre zéro et
le poids total. Supposons que le débit de poids
vérifié V soit de 0,0. C'est donc la valeur de poids que
nous avons essayé de transmettre avant d'
atteindre la valeur aléatoire. Une fois que nous aurons atteint la valeur aléatoire, nous retournerons la scène ou la définition
sur laquelle nous nous trouvons actuellement Donc, pour la définition
dans les définitions P, nous allons dire que
le poids vérifié
plus est égal au poids du
point de définition. Et si le poids vérifié
est supérieur à la valeur aléatoire, nous
retournerons la scène. Renvoie donc le point de définition CM. OK. Et puis si
nous arrivons à la fin et que nous n'avons
toujours rien trouvé, c'est un problème,
nous pouvons donc signaler une erreur. OK, alors je signale
une erreur. Impossible de
trouver une définition
en valeur du poids,
où le
total du poids vérifié était en pourcentages où le
total du poids vérifié était Ensuite, je remplace
ces pourcentages par la valeur aléatoire et
le poids vérifié Cela montre donc ce que
nous étions en train de vérifier,
où nous sommes arrivés, et cela indique que
nous n'avons pas trouvé case
supérieure à la valeur aléatoire, ce qui devrait toujours
se produire car la valeur aléatoire ne
peut atteindre que le poids total. Cela ne devrait donc pas se produire, mais si c'est le cas, nous avons
un message d'erreur. Et puis à la fin
, nous pouvons simplement dire return null car il n'a pas pu trouver
de définition correcte. C'est donc ce qu'il y a de plus logique. Cela
cassera probablement immédiatement quelque chose indiquant que
quelque chose doit
être corrigé dans les calculs
au niveau de cette fonction. Encore une fois, je tiens à souligner que
cela ne devrait jamais se produire. Si nos calculs sont corrects. OK, nous sélectionnons donc le spawn aléatoire dans
notre liste de définitions, et cela gère le poids
et les calculs aléatoires Donc, si je lance le jeu
tel quel,
nous devrions avoir deux fois moins de
squelettes que d'orcs Mais voyons voir. Les
recevons-nous tous les deux ? Parce que nous devrions
avoir les deux. Nous avons donc quelques orcs qui apparaissent. D'accord, il s'
avère que le code
fonctionnait parfaitement
pour sélectionner un spawn aléatoire J'ai juste oublié d'utiliser la scène. Nous voulons donc prendre
la scène ici. Et au lieu d'une
instanciation nulle par définition aléatoire,
nous envoyons simplement une instanciation nous envoyons simplement OK, maintenant nous pouvons revenir
au spawn aléatoire et supprimer
ce message de débogage de Prince OK ? Et si on joue,
ça devrait bien fonctionner. Il devrait en fait
utiliser celui que nous avons sélectionné
au hasard plutôt que toujours le
premier du tableau. Nous devrions donc avoir deux
fois moins de squelettes que d'orcs, mais
voilà notre Et au fil du temps, vous verrez plus d'orcs
que de squelettes cause de l'attente.
OK, donc c'est bien. Et c'est essentiellement
l'idée qui se trouve là. OK, donc dernière chose
pour cette partie, vous devriez peut-être
retarder le temps qu' une définition d'ennemi puisse
réellement apparaître dans le jeu Par exemple, au début, vous n'avez
peut-être que des orcs, mais au bout d'un moment,
vous pouvez ajouter des squelettes Nous avons donc déjà
le temps écoulé. Donc, si nous disons une heure de début
et de fin en termes de temps écoulé pendant laquelle une
définition peut apparaître,
nous pouvons contrôler
quand les orcs peuvent apparaître et quand les
squelettes peuvent apparaître Donc, si je passe à la définition du
spawning, nous pouvons ajouter une variable d'exportation ici
ou une valeur flottante à l'heure de début, et cela peut être 0.0 par défaut Et puis l'heure de fin sera
également définie par défaut sur 0.0. Donc, ce que nous voulons faire
avec ces deux méthodes, c'est commencer à créer comme une méthode
qui peut être générée Nous pourrions donc dire que
la fonction peut être générée,
ce qui, bien sûr,
renverra un vrai faux booléen Et pour cela, nous voulons
en fait passer le temps écoulé, car
cela fait partie de la condition Nous devons
plutôt vérifier l'heure à
laquelle il se trouve dans le jeu ou
l'heure à laquelle le système de génération a été créé Ensuite, nous l'
utiliserons pour vérifier si le temps écoulé se situe entre l'heure début
ou
l'heure de fin Donc, si le temps écoulé est
antérieur à l'heure de début, nous
retournerons faux Si l'heure de fin n'est
pas égale à 0,0, ou plutôt si l'heure de fin
est supérieure à 0,0, je pense que c'est un
peu plus facile à lire. Ensuite, nous voulons vérifier si l'heure de fin est
réellement dépassée. Donc, si l'heure de fin est
zéro, nous l'ignorons simplement. Donc, si le temps écoulé est
supérieur à l'heure de fin, nous allons renvoyer false Sinon, nous avons rempli toutes les conditions pour
pouvoir revenir à la réalité. C'est donc en gros
tout ce que nous devons
faire pour un générateur basé sur le temps,
et nous vérifions simplement s'
il peut être Et s'il ne
peut pas être généré,
nous le retirons de la liste que nous envisageons pour la sélection
aléatoire Vous feriez quelque chose de
très similaire. Si vous souhaitez également, disons, avoir un nombre
maximum de personnes pouvant être générées, il
vous suffit de transmettre
le nombre qui a été généré et de
vérifier s'il est supérieur ou égal au
nombre
maximum autorisé la
définition de génération Ce serait utile
pour un boss qui ne peut apparaître qu'une seule fois Vous pouvez donc simplement vérifier, Oh, cela peut apparaître une fois.
Combien de fois apparaît-il ? Est-il égal ou supérieur à
celui de ne pas le générer. Nous verrons si nous y
reviendrons, mais cela devrait être tout ce dont
nous avons besoin pour écrire maintenant. Alors maintenant, de retour dans le système de
génération, nous voulons essentiellement filtrer
spawnb à partir Je vais donc
créer un
filtre de fonctions spawnb qui
utilisera un tableau
de définitions P, et c'est une arme. C'est la définition du
spawning Ensuite, nous retournerons
nos définitions filtrées. Retournez donc un tableau de
définitions de génération. Nous créons donc notre liste
filtrée ici. Var a filtré un tableau de
définitions généreuses, et cela sera
égal à un tableau vide Ensuite, pour les définitions DF
et P, nous vérifierons si le DEF
peut être généré. Je suppose que nous avons besoin du temps
écoulé ici, mais c'est une variable locale Nous pouvons donc simplement le transmettre directement
à celui-ci. Donc, le temps écoulé, nous
n'avons pas besoin de le mettre en paramètre pour cette
fonction car il
fait partie de l'état de l'objet,
qui est le système de génération. Donc, s'il peut être généré, nous l'ajouterons à
la liste filtrée Définition du stylo à points donc filtrée. Et puis à la
fin, nous renvoyons simplement filtré. Ici, dans un intervalle aléatoire, nous faisons var spanable et cela sera
équivalent au filtre spanable, qui prendra nos définitions
aléatoires
comme paramètre Ensuite, au lieu de
sélectionner le spawn aléatoire à partir de définitions aléatoires, nous sélectionnons le spawn aléatoire à partir de
notre variable spanable filtrée OK, maintenant que cela nous donne la possibilité dans le
système de génération, si nous passons aux définitions de génération,
nous pouvons dire heure de début, heure Disons simplement que les orcs
sont toujours actifs. Mais pour ce qui est de l'apparition de squelettes, nous ne pouvons pas faire apparaître de squelettes
avant 15 secondes, mais une fois que nous pouvons faire
apparaître des squelettes, nous avons un poids de deux,
donc nous finissons par voir beaucoup de squelettes dès qu'ils sont capables d' Alors on pourra jouer. Et si
tous les calculs se confirment, nous
ne devrions voir que des orcs au départ Mais au bout de 15 secondes, il
peut être utile d'avoir l'heure de fin de
partie ou quelque chose à voir, nous verrons si nous en avons besoin. Au bout de 15 secondes, nous pouvons voir que les squelettes vont commencer à
apparaître, car ils peuvent
désormais être étalés , car le temps de départ
de 15 OK, maintenant vous pouvez voir les
squelettes commencer à apparaître. Nous avons donc notre deuxième
vague d'ennemis, et nous pourrions simplement rendre
les squelettes La difficulté
augmente donc au
fur et à mesure que le jeu avance car nous ajoutons
des ennemis plus coriaces Et, bien sûr, dans
le système de reproduction, nous augmentons également le
taux d'apparition, comme ça Vous pouvez donc en quelque sorte voir
comment cela fonctionnerait. C'est la nature du
contrôle de l'apparition aléatoire de
notre système de reproduction C'est l'essentiel de ce dont nous avons
réellement besoin ici. Bon travail pour suivre le
rythme jusqu'à présent. OK,
nous pourrons donc apporter quelques modifications ici et là plus tard
si nécessaire,
mais dans l'ensemble, c'est notre système de génération. Alors maintenant, nous devrions
commencer à travailler à étoffer
un peu plus le combat et faire en sorte que nos ennemis soient réellement
capables de blesser nos joueurs Ce serait une bonne prochaine vidéo.
Partons donc de là.
26. Configuration P25 Player Hurtbox et Enemy Hitbox: Une partie de nos
mécanismes de combat de base consistera à configurer la capacité des
ennemis à frapper notre joueur, ce qui
impliquera de créer une zone de frappe pour les ennemis lorsqu'
ils croisent le joueur, et nous devons nous assurer que le joueur dispose également d'une zone de
blessures. Et nous allons probablement
ajouter un
temps d'invincibilité juste pour nous assurer de ne pas recevoir trop de coups lorsque nous nous faisons assaillir par un ennemi comme ça
. OK, donc sur notre lecteur, nous allons créer nos nœuds Hurt Box. Je vais donc cliquer avec le bouton droit
sur l'itinéraire du joueur, ajouter un nœud enfant, et chercher la case HRT
2 D. Entrez, ajoutez-le Nous allons attribuer le contrôleur de
statistiques, que nous n'avons pas encore ajouté
à notre joueur, afin de pouvoir cliquer avec le bouton droit sur le joueur, ajouter un nœud enfant, un contrôleur de
statistiques. OK. Ensuite, nous voulons
faire quelques missions. L'objet du contrôleur
SAT sera donc le root du joueur. Et puis dans la boîte HRT, nous voulons attribuer
le contrôleur de statistiques Donc, notre boîtier HRT, comme vous pouvez le
voir sur le panneau d'avertissement, nous avons également besoin d'une forme de collision Faisons donc un clic droit dessus
et donnons-lui un nœud enfant. Collision, forme 2 D.
Ensuite, en haut à droite, nous allons probablement créer une
forme circulaire. OK, nous faisons donc apparaître cette forme de
cercle. Nous voulons
réduire ce nombre à la taille à laquelle nous voulons être en mesure d'
infliger des dégâts à nos joueurs. Donc, selon la façon dont
nous voulons procéder, nous pouvons le rendre
légèrement plus petit ou légèrement plus grand que
notre forme de collision. Je vais aller plus loin pour le moment, puis nous pourrons le
réduire si nous en avons besoin pour équilibrer le jeu ou pour
améliorer l'ambiance des choses. Cela nous
donne donc déjà la possibilité d'infliger des dégâts au joueur. Nous devons maintenant donner aux ennemis
la capacité d'infliger
des dégâts au joueur. Donc, sur notre scène orc, cliquons avec le bouton droit sur Orc,
ajoutons un nœud enfant,
appuyons sur la case 2 D. OK. Et puis cela va avoir
besoin d'une forme de collision. Donc, cliquez avec le bouton droit,
ajoutez un nœud enfant , la forme de
collision deux D,
puis en haut à droite, nous en ferons un cercle, puis nous le réduirons à
l'endroit où nous voulons que l'orc
puisse atteindre des cibles Je vais donc la rendre
légèrement plus grande que la forme de collision principale
pour la collision réelle. Ensuite, dans notre boîte RT deux D,
si nous vérifions le script, nous pouvons voir que nous
recevons le signal
de frappe de la case de
frappe qui touche une case RT. Donc, pour infliger des dégâts, nous avons en fait
besoin d'un autre script pour infliger des dégâts sur le signal
atteint et émis. Mais avant cela, ajoutons les couches de collision pour notre boîte de
frappe et nos boîtes de secours. Ainsi, la case à cocher deux D sur la couche
de collision masquera
la couche joueur Donc masque la deuxième couche parce
que c'est la couche du joueur. Pour les couches sur lesquelles se trouve
cette boîte à hanches, nous pouvons simplement désactiver la couche 1, ou définir la couche 3
pour l'ennemi si nous le voulons. Mais je
vais probablement désactiver la surveillance parce que c'
est une boîte à hanche à sens unique Il suffit de détecter. S'il trouve une boîte branchée, il n'est pas
nécessaire qu'elle soit surveillable par d'autres nœuds du
jeu, du moins pour le moment Passons donc au
jeu et je vais faire l'inverse pour sa
boîte 2 D. Ici, nous allons
désactiver la surveillance, et nous allons
subir la collision. Nous allons créer
la couche en tant que joueur. C'est la deuxième couche très importante ici, nous pouvons désactiver le masque. Ensuite, à l'intérieur d'
ici, je vais cliquer avec
le bouton droit sur la case 2 D, et je vais
ajouter un nouveau nœud, ajouter un nœud enfant. Ce
sera un nœud deux D. Et renommons-le en
quelque chose comme attaque par collision Ainsi, lorsque l'orc entre en collision avec un autre ennemi en utilisant
cette case 2 D, il inflige tous les dégâts
sous forme de dégâts de collision Beaucoup de jeux classiques
proposent ce genre de choses où un ennemi
vous croise et vous subissez des dégâts. donc falloir cliquer
ici avec le bouton droit de la souris et créer un nouveau script. Mettons donc les ennemis
en attaque par collision . Je pense
que c'est approprié. Créez. Je vais le renommer Class Name collision
attack ici en haut Exportons une référence
vers la case Hit. Hit Box est donc du type Hit Box
two D. Et puis, une fois prêt, fonction inférieure au score
prêt, renvoie la valeur void. Nous allons prendre la Hit box, et nous allons nous connecter
au signal de frappe. Donc, point,
point, point, connexion, et nous
allons nous connecter après coup. Alors maintenant, nous avons besoin, disons, la variable at export damage ici, qui sera un entier. Nous pouvons le définir par défaut à dix. Nous allons donc obtenir le
rappel pour le hit
avec la fonction on hit
underscore on Vous devez maintenant
cliquer avec le bouton droit sur Hit et vérifier les paramètres du signal. Nous avons donc la
boîte Hurt two D ici. D'accord, cela nous permettra également d'
accéder aux statistiques. Donc, dans le cas d'
une attaque par collision, revenons en arrière. Nous avons donc la case P Hurt, qui est une boîte de type Hurt Box two D. Elle sera annulée, puis nous allons
toucher le joueur. OK, donc en appuyant sur P
Hurt Box two D, nous voulons prendre la boîte P HRT, et nous voulons
lui infliger des dégâts, et nous allons
répercuter les Et puis c'est à peu près tout parce que nous l'avons déjà
écrit dans la boîte à lettres. La boîte Hurt
gère donc déjà les rapports. Je gère déjà le
réglage du HP, qui émettra le signal pour que le HP change
si nous en avons besoin. Et c'est elle qui fait le calcul. Il assure également la protection pour s'
assurer que nous
pouvons atteindre la cible. Il est donc logique que
nous utilisions cette logique où. Tant qu'il y a
une attaque par collision, nous assignons la zone de frappe
ici et nous fixons nos dégâts. Nous verrons si cela fonctionnera. Je vais donc juste essayer de
croiser un ennemi et voir si notre joueur subit
des dégâts supérieurs à celui-ci. OK. Je dois juste être
sûr. Oh, d'accord, oui. Nous y voilà. Notre joueur
a été touché pour dix points. Nous savons que c'est le joueur
et non l'ennemi car la lance
en fait actuellement 100 Maintenant, actuellement, il
semble y avoir un problème
, à savoir
qu'un ennemi déjà mort semble toujours
capable de frapper le joueur. Il en a déjà fallu 100. Je
suis allé à Death State, et l'attaque par collision
était toujours activée. Nous pourrions donc gérer
cela de plusieurs manières. première serait de vérifier le contrôleur de statistiques et de nous assurer que
le
contrôleur de pile de l'orc,
les PV, sont supérieurs à zéro ou que
l'orc est toujours Sinon, nous
ignorons complètement cette attaque. Ce serait une bonne méthode. Une autre solution serait de le
mettre en état de mort, puis de désactiver
toutes les boîtes de frappe dès que notre orc
est considéré comme mort Je pense que c'est peut-être une
trop grande
responsabilité dans l'état de mort. Je pense donc que c'est
un peu mieux dans
le cas d'une attaque par collision. Nous allons donc exporter une référence à
notre contrôleur de statistiques,
exporter le contrôleur de statistiques V Stats. Donc, ce que nous allons dire à ce sujet, c'est si ce n'est pas un point de statistiques en direct,
nous y retournerons. Sinon, nous infligerons des dégâts. Donc, en gros, tant que
le personnage
n'est pas vivant, il ne peut pas attaquer, mais s'il est vivant,
nous considérerons les dégâts de collision sont valides si
nous obtenons cette connexion. Maintenant, si nous revenons
au jeu,
nous serons
en mesure de marcher sur un ennemi qui vient d'être vaincu
sans subir de dégâts. OK, donc je dois choisir
le bon moment. OK, je tombe dessus et
nous voyons que nous y sommes parvenus, mais j'ai oublié de définir les statistiques. C'est donc peut-être le bon
moment pour faire une assertion. Alors affirmez vos statistiques. Les statistiques doivent
donc être définies afin vérifier si le
personnage est vivant. Et puis cela nous
obligera déjà à avoir l'erreur «
hit box soda », si nous oublions de la définir
dans l'inspecteur. OK, si près.
Cliquez sur Attaque par collision. Attribuons les statistiques. Passons au jeu. Nous allons le faire encore une fois. Trouvez un orc. Et vous pouvez voir
que nous ne
subissons pas de dégâts si l'orc a déjà été
vaincu une fois de plus Oui, ça a l'air
de bien fonctionner.
27. Minuteur d'invincibilité des joueurs P26 et définitions de statistiques personnalisées: OK, alors, dernière chose
pour cette vidéo, nous voulons définir une période de
vulnérabilité, spécifiquement pour notre joueur. Donc, dans Stat Controller, nous pouvons entrer ici. Ainsi, dans le contrôleur SC, nous pouvons créer un temporisateur d'invulnérabilité Disons donc ici le temps V Invincible et nous
pouvons le définir par défaut à 0.0. Ce sera du type float. C'est donc le moment
après avoir été touché que l'objet
ne peut pas être endommagé. OK, notre
temps d'invincible étant réglé par défaut à zéro, ce sera une
bonne chose pour nos ennemis Cependant, pour un joueur de quatre heures, nous voulons avoir
notre valeur personnalisée pour le temps d'Invincible Et nous
voulons probablement aussi pouvoir
personnaliser des éléments tels que le HP, vitesse, le HP maximum, etc. Nous en sommes donc vraiment
arrivés au point où nous devons mettre en place une sorte
de définition des statistiques, laquelle nous pourrons définir les statistiques de départ de chaque
personnage. Donc, si nous pouvions créer
un nouveau script pour cela, qui ressemblerait beaucoup
à notre définition des armes, où nous
définissons simplement
les propriétés du personnage
et de son bloc de statistiques. Donc, sur la
photo du personnage, d'accord, cliquez sur Créer un nouveau script, et nous l'appellerons Stat
underscore definition Cela s'étendra à partir de la ressource
et cliquez sur Créer, d'accord ? Ensuite, recherchez le script
que nous venons créer Stat definition,
double-cliquez dessus. Et nous allons monter
jusqu'en haut. Donc, définition des statistiques du nom de classe. Cela définira donc les
statistiques par défaut pour un type d'objet. Les statistiques
que nous voulons refléteront donc essentiellement celles que nous
avons sur le contrôleur de statistiques Passons donc au contrôleur de
statistiques, et je vais simplement les
copier pour le moment dans notre définition des
statistiques. Je vais supprimer
tout ce code de réglage. Parce que nous
voulons simplement définir propriétés modifiables
d'exportation qui n'exécutent
aucun code supplémentaire Ce ne sont que des données pures qui sont essentiellement enregistrées dans le
GidoEditor Nous n'avons donc pas besoin d'Alive, et nous voudrons une valeur par défaut pour les HP et FenciBt
HP et MAX Exportons donc tout cela à l' exportation pour MaxHP
lors de l'exportation pour HP Ici, nous nous en chargerons
à l'export pour la rapidité
et à l'export pour le temps d'
invincibilité Vous pourriez également leur
faire part de quelques commentaires. Donc MaxHP,
santé maximale pour l'objet, HP, santé de départ pour
l'objet actuel OK, et ce sera tout. Nous avons donc maintenant besoin d'un moyen notre définition de statistiques charger
notre définition de statistiques sur le contrôleur de statistiques. Vous pouvez soit mettre une fonction de chargement dans
la définition des statistiques, ce qui
transformerait la ressource
en un peu
plus que de simples données homologues. Eh bien, nous pourrions le mettre
sur le contrôleur de statistiques et sur une sorte de
méthode de statistiques
initialisée où il
connaîtrait le type de définition des statistiques, puis il pourrait
charger toutes les valeurs d'un objet de ce type Je vais donc le faire de cette façon. Et cela va signifier que
nous allons devoir créer une nouvelle fonction
ici en bas. Étant donné que le contrôleur
de statistiques devra de toute façon
appeler initialize sur la définition des
statistiques,
car c'est le
nœud que le nœud
gérera lorsqu'il sera toute façon
appeler initialize sur la définition des
statistiques, car c'est le
nœud que le nœud
gérera prêt
à se configurer Quoi qu'il en soit,
il y aurait une légère dépendance à l'égard
de la définition des statistiques. Je vais donc créer la
fonction, configurer les statistiques, et cela prendra
une définition P, qui est une définition de statistiques. Eh bien, tapez void et
laissez-moi ajouter quelques lignes ici. Ainsi, dans les statistiques de configuration,
nous allons simplement refléter la définition sur ce nœud. Le HP maximum sera égal
à la définition p MxHP. HP sera égal au point
de définition p HP. Voyons voir quelle autre vitesse
sera égale
à la vitesse du point de définition p, et le temps invincible sera égal au point de définition
P Invincible T. Donc maintenant, nous devons
simplement le faire une fois prêts Donc, en cas de temps invincible, nous ajouterons la fonction «
underscore ready », et nous dirons « configurez les statistiques selon notre
définition Nous devons donc exporter une définition sur le nœud
afin de pouvoir réellement le faire. Donc, en haut, nous allons faire Export VR Stat definition
est une définition de type stat. OK. Ensuite, nous l'
utilisons dès que nous sommes prêts. Configurez donc les statistiques avec
la définition des statistiques. Cela va
charger toutes les statistiques dans notre valeur d'exécution. Cela nous permet de
personnaliser les valeurs des statistiques
de base de nos personnages l'aide de quelque chose que nous pouvons
configurer dans l'éditeur. Donc, si on clique sur
Stat controller, on passe en haut à droite. Je peux créer une nouvelle
définition de statistiques ici pour notre Oc. Et disons que le Mx
HP devrait être de 40 et 40, et que la vitesse est de 25. Nous l'enregistrons donc maintenant
dans le dossier où se trouvent les orcs. Cliquez sur
Définition des statistiques, enregistrez sous, et nous pouvons la mettre dans
le dossier de l'ennemi. Donc Ok Stats. Ça a l'air d'être un
nom parfait. Sauvegardez-le. D'accord, et c'est ainsi que se définit
Ok Stat. Ainsi, lorsqu'il se charge, il
se chargera avec ces valeurs dès que
le personnage sera prêt. OK, donc c'est essentiellement
ça pour l'orc. Maintenant, je veux également
copier cette configuration de boîte de frappe sur le squelette. Je vais donc dans Control C, passer dans Skeleton,
Control V, le coller dedans. Je pourrais accepter l'attaque par
collision, et je vais juste augmenter
les dégâts à 25, disons. Attribuons les statistiques
au contrôleur de statistiques, et la forme de collision
étant la même, cela fonctionne bien. Utilise les mêmes couches de collision. J'essaie
de toucher le joueur comme une pierre. Donc, tout le reste est
configuré et très bien. Ensuite, nous devons
configurer le contrôleur de statistiques. Donc, regardez le contrôleur ici,
allez en haut ou à droite. Et créez une nouvelle définition de
statistiques. Supposons que le squelette ait plus points de vie
, 50 points de vie, une vitesse
de 40, c'est bien. Nous allons donc cliquer avec le bouton droit sur Enregistrer sous, et nous indiquerons que Skeleton
Stats point TRS, Enregistrer. Maintenant, nous devons le
faire pour le joueur. Accédez au joueur, cliquez
sur le contrôleur de statistiques, allez en haut à droite,
définissez une nouvelle statistique. Maintenant, je veux que nous soyons là au moment
de l'invincible. Supposons qu'un personnage
soit invincible pendant 0,2 seconde après avoir été touché Nous allons donner au
personnage une vitesse
de base de 100, et
le maximum de PV de 100. Je pense que je vais laisser
ça comme point de départ. Cliquez donc avec le bouton droit sur la définition des
statistiques. Enregistrez sous, et nous l'
enregistrerons dans le dossier Player. Les joueurs cliquent TRS, puis cliquez sur Enregistrer. Et maintenant, les personnages devraient
chacun avoir des statistiques différentes. La dernière chose à faire est utiliser le
chronomètre d'
invincibilité Donc, sur St Controller, nous devons déclencher Invincible
avec un appel de méthode Créons donc ici un
ensemble de fonctions Invincible, qui renverra le type void Ensuite, nous aurons
une variable locale
pour savoir si elle est invincible ou non La variable invincible
est donc un booléen. La
valeur par défaut sera false. Si c'est vrai, l'objet
ne peut pas être endommagé. D'accord, si on peut le toucher, on veut dire
que le personnage est vivant et non invincible Je l'utilise donc avec les mots clés
plutôt qu'avec le symbole logique. Je suppose que cela facilite un
peu la lecture, en un sens. Donc, si le personnage est
vivant et non invincible, il peut être touché Et nous voulons qu'
invincible soit égal à vrai, mais nous voulons aussi
démarrer un chronomètre ici Et nous dirons que cela
équivaut à un nouveau chronomètre, égal à un nouveau point de temporisation. Ensuite, en
tant qu'enfant, nous l'ajoutons à cet objet, chronomètre d'
invincibilité, et nous nous
connecterons à son rappel Donc Invincibility Timer
Dot Timeout Dot Connect sur Alors, contrôlez ceci et
collez-le ici. Fonction d'expiration du délai d'
invincibilité. Cette ouverture et ce vide. Et nous dirons qu'
invincible est synonyme de faux. OK, maintenant nous devons
démarrer le chronomètre. heure ou le début de l'invincibilité, et nous dirons que c'
est le moment de l'invincibilité Cela devrait régler la
logique selon laquelle nous pouvons ou ne
pouvons pas frapper parce que le personnage
est invincible ou non OK, donc pour set invincible, nous pouvons vérifier quand les PV sont
définis et si les PV chutent, nous voulons déclencher
l'invincibilité Mais je pense que ce qui pourrait clarifier
notre intention est de créer également une fonction de prise de dommages dans cette définition. Nous pourrions donc faire quelque chose
comme fonctionner, subir des dégâts, et
passer un P de dégâts ici. Nous tapons et annulons, et
cela va
prendre des PV et les faire passer à P dégâts. Ensuite, nous voulons rendre le
personnage invincible. Nous pourrions même dire que si le
temps invincible est supérieur à 0,0, nous définirons invincible Sur cet objet. Et les PV vont en
fait être inférieurs aux dégâts ici parce que nous voulons prendre leur
valeur actuelle et la mettre à jour. Donc, cela continuera d'appeler que le live est
égal à HP
supérieur à zéro ici. Si vous le souhaitez, vous
pouvez même faire get live une fonction
qui vérifie cela, ce qui serait également bien, plutôt que de faire
cette configuration précédente. Mais nous l'avions déjà. Cela fonctionne très bien.
Nous allons opter pour ça. Maintenant, chaque fois que nous infligeons des dégâts, nous voulons vraiment appeler
Take Damage sur le contrôleur de
pile. Découvrons donc où
nous infligeons des dégâts, comme le projectile
pourrait les OK, nous
pouvons donc voir ici que tout revient à la boîte Rt. Faisons donc un clic droit
et passons directement au sujet. Et au lieu de régler directement
les PV, nous allons dire que le
contrôleur de statistiques ne subit pas de dégâts, et nous répercutons les dégâts P. Nous pouvons donc supprimer cette ligne, et nous n'avons en fait pas besoin
de la calculer car
ce calcul
est automatiquement géré dans le contrôleur de statistiques. Cela
illustre donc notre point de vue selon lequel si notre
contrôleur de statistiques subit des dégâts,
il se peut qu'il fasse autre
chose, comme rendre le personnage
invincible parce que celui-ci
a subi des dégâts Ce n'est même pas simplement que
nous avons modifié la valeur des HP. C'est précisément que nous avons subi des dégâts provenant d'une source endommagée. OK, alors appuyons sur Play et
voyons si tout va bien. Nous devrons subir des dégâts
infligés par quelques ennemis, puis nous devrons nous assurer que nous ne pouvons réellement
subir de dégâts qu' une fois par
quart de seconde. Donc, si je tire par ici, il
nous faut quelques
ennemis supplémentaires pour que cela fonctionne. Ce sera peut-être même plus facile si
je désactive les projectiles. OK, donc je vais
croiser ces gars. Je ne devrais voir des
dégâts se produire qu'une seule fois. OK, 25 ans. Je pense que cela fonctionne. Si je passe en revue tout ça. Je ne vois des dégâts
se produire qu'une fois à la fois. Mais pour VLC, c'est sûr, je dois éteindre
le projectile Je vais donc supprimer
temporairement l'arme à lance de la scène ici. Tu n'as pas
besoin de faire ça. Je fais juste une démonstration. OK, alors je vais juste marcher sur les ennemis. OK, donc nous ne sommes
endommagés qu'une seule fois. Maintenant, cette
collision ne se produit qu' en entrant dans la zone Donc, si nous
surmontons l'ennemi, nous ne sommes toujours touchés qu'une seule fois. OK ? Vous pouvez voir que même s'il y a un tas
de gars qui nous frappent, nous ne sommes touchés
qu'une fois par quart de
seconde environ, comme ça. Et nos personnages l'ont déjà fait, donc on ne peut pas être plus touchés.
28. P27 Réaliser des dégâts périodiques sur les boîtes à succès ennemies: Corrigez le problème selon lequel
la boîte HIP ne peut s'
endommager qu'une seule fois après l'autre. Le HipXTD entre dans cette boîte de frappe, mais pas s'il
persiste à l'intérieur Nous pouvons régler une minuterie à l'intérieur
de notre boîte à hanches sur D pour vérifier si la boîte HIP
se trouve toujours à l'intérieur de la zone, puis nous pouvons continuer à l'
endommager régulièrement. OK, donc une fois que nous aurons émis le hit, je pourrai également l'ajouter aux zones
du tract et au script. Supposons donc var targets, qui sera un tableau de Hurt box two D, ce qui n'
est rien pour le moment. Et nous dirons qu'
après avoir touché, nous ajoutons
des cibles, la zone P. OK, maintenant nous devons nous connecter
au signal de gauche de la zone. Donc, la zone est sortie par point connect. Et nous allons utiliser le
rappel à la sortie de la zone. OK. Fonctionne donc
sur la zone sortie. Nous obtenons la zone P. Nous voulons donc vérifier que
s'il s'agit d'une case HIT deux D. Donc, les zones de
type sont deux D. D'accord, donc nous vérifions si la zone P est case
Hurt deux D, alors
nous allons continuer. Nous allons maintenant vérifier si le point
des cibles a une zone P, puis nous allons l'
effacer des cibles. Les cibles effacent la zone P. OK, maintenant les cibles n'existeront
que tant que la zone de blessure cible restera à
l'intérieur de notre zone de frappe. Nous pouvons vérifier à chaque
instant si nous devons à nouveau
infliger des dégâts à l'ennemi. OK, nous pourrions donc le faire
avec quelque chose comme,
disons que nous avons une minuterie
optionnelle, donc sur Export var timer timer, puis nous nous connecterons
au signal d'heure ou de délai Donc, timer point timeout dot Knect et nous dirons on timer Timeout OK, nous allons donc remettre cet
appel ici, fonctionner à temps ou TO. Cela sera annulé, et nous
essaierons d'atteindre cette zone. Donc, à l'heure ou au délai imparti
pour Target et Targets nous atteignons un point Mt Target Ainsi, si les objets sont toujours dans la zone
après leur premier impact,
ils seront touchés à nouveau après chaque fois ou période. Nous allons donc sur Ok et
regardons notre case 2 D. D'accord, et peut-être voulons-nous
être un peu plus
clairs sur ce à quoi
sert ce chronomètre. Supposons qu'il s'agisse
en fait d'un chronomètre des dégâts, et je mettrai à jour la
propriété dès que possible. OK, maintenant pour
notre chronomètre des dégâts, nous voulons cliquer avec le bouton droit sur
Hipbox Two D, ajouter un chronomètre Et nous dirons pour cela que
nous faisons environ 0,25 seconde. Ce sera autosrt, puis nous n'aurons qu'à y faire
référence dans le Hip Box
two D. Je vais le renommer en
Damage Timer afin que les
noms correspondent également Cliquez donc sur Hit Box 2. Attribuez le chronomètre endommagé. Maintenant, cela va
se connecter au signal contenu dans le script. Et pour chaque objet ou cible qui se trouve dans la zone
lorsque le temps imparti est écoulé, cela va le déclencher Et comme il ne
s'agit pas d'une prise unique, elle
va automatiquement tourner en boucle. Donc, toutes les 0,25 seconde, il va continuer à le
faire et il
va vérifier les cibles à
chaque fois C'est donc probablement
une bonne chose là-bas. Nous avons juste besoin du squelette pour
avoir la même chose. Je vais contrôler C pour copier ce chronomètre sur le squelette. Et nous allons le coller
dans la case Hip 2 D. Assignons-le dans la
case Hit 2 D et en haut à droite, assignons le
chronomètre endommagé, sauvegardons et exécutons. OK, et nous pouvons voir que sur
certains des hipbox, deux D comme
le projectile,
le projectile rapide,
n'en ont pas Nous devons donc
préciser que nous disons : si le temporisateur est endommagé, nous nous
connectons à son signal. C'est donc facultatif,
et j'
y ai écrit un commentaire pour clarifier ce minuteur optionnel
qui émet
périodiquement des signaux d'impact
sur les cibles situées à l'intérieur la zone biD de la boîte à hanches après
un certain temps. OK, courons à nouveau. Et nous allons juste voir si un orc peut réellement nous blesser deux fois Eh bien, ça va être un peu difficile avec
les lances Désactivons également la
lance. Désactivez donc l'arme à lance
ou retirez-la temporairement. Revenons à la scène. OK, et trouvons un orc capable de nous
faire du mal à quelques reprises. OK, nous avons donc notre k. Voyons combien de fois
nous pouvons subir des dégâts. Oui, nous pouvons certainement être touchés plusieurs fois par le même orc Et c'est probablement trop rapide, honnêtement. Alors
joignons-nous cela. Tout d'abord, je vais contrôler Z pour réintégrer l'
arme de lance Passons à l'orc et je vais régler son temps de
pesée à 0,5 seconde. Et s'il vous semble que
le joueur subit trop de dégâts alors que plusieurs
ennemis se regroupent sur lui, vous pouvez toujours augmenter
le temps d'invincibilité, de
sorte que le nombre maximum de coups
par seconde diminuera de 5 à 4,
selon que
vous atteignez le chronomètre sorte que le nombre maximum de coups
par seconde diminuera de 5 à 4, à 0,2 ou 0,25 seconde.
Cependant, vous souhaitez ajuster
29. Défaite des joueurs P28: Le personnage n'a plus de PV, nous devons passer
à l'état de mort, et cela va également
consister à empêcher les attaques
de se poursuivre. Finalement, nous passerons un jeu
à l'écran, mais faisons-le simplement pour en arriver à la fin de l'
état de mort pour le moment. Donc, sur la scène des joueurs, nous avons notre état de déplacement. Nous voulons passer à l'état de mort, et je pense que nous pouvons
simplement passer à la scène des organisations, et nous pourrions même être
en mesure de le copier et de le réutiliser. Si je regarde le scénario de
Death State, je n'y vois rien
qui puisse vraiment poser problème,
sauf peut-être le quart
ici à la fin. Peut-être voulons-nous simplement informer un système de jeu que le
personnage a été vaincu. Je vais donc simplement copier le script. Nous allons passer au joueur. Je vais cliquer ici et ajouter un nouveau nœud d'état Limbo Disons que le joueur a vaincu l'État. Donc, joueur vaincu, cliquez avec
le bouton droit de la souris, joignez un script, puis nous le créerons dans le dossier du joueur.
Je vais le coller dedans. Nous allons renommer le nom de la
classe ici
en État vaincu par le joueur OK, vérifions le nom de l'animation et vérifions-nous qu'il figure sur le lecteur d'animation. Donc, la mort d'un joueur d'animation, c'est ce que
nous avons là.
OK, donc c'est bon. Si nous passons à l'état de mort, nous voudrons ajouter une piste appelée
Method Track
à notre état de défaite en tant que
joueur. Et si nous allons jusqu'au bout,
activons également le snapping en bas à droite, si cela peut vous aider Passez donc à la version 0.6, puis cliquez avec le bouton droit de la souris
et triez une clé, et nous appellerons terminé
le script. OK, donc je suis tenté d'utiliser le système de
combat déjà existant et faire quelque chose comme signaler la
défaite au joueur. La défaite du joueur revient plutôt à réinitialiser le jeu ou à
annoncer la fin de la partie Ce n'est donc pas vraiment une fonction
du système de combat. Donc, par souci de
séparation des préoccupations, je pourrais simplement créer un nouveau nœud pour gérer la gestion
du jeu, qui pourrait
éventuellement inclure sauvegarde et le chargement. Nous verrons. Donc, si nous
allons à la racine de notre projet et de nos systèmes, je
voudrais le créer ici. Je vais cliquer avec le bouton droit de la souris et
créer un nouveau
script, disons , que nous
appellerons game manager point gD Je pense que ça fonctionne comme nom. OK. Et dans le gestionnaire de jeu, nous allons le laisser en tant
que nœud, car nous allons en faire un Singleton à chargement
automatique Pourquoi ne pas simplement utiliser une
fonction de rapport de jeu terminée, afin qu'elle puisse être appelée de n'importe où, à condition de faire
référence au gestionnaire de jeu. Et lorsque nous signalons la
fin de la partie, imprimons simplement, ce qui affichera des
chaînes de caractères
sur la console, et nous dirons que le joueur a été vaincu. Plus tard, nous la
remplacerons par une interface utilisateur afin de
pouvoir passer à un nouveau jeu ou de voir les
statistiques du jeu, etc. Mais cela
montrera au moins que cela fonctionne. OK, nous voulons donc prendre
le gestionnaire de jeu et créer une scène afin de pouvoir modifier variables
d'exportation si jamais
nous en avons besoin. Je vais donc écrire en
cliquant sur Systèmes, créer une nouvelle scène. Ce sera le game
manager point TSCn. Je vais faire un clic droit ici, changer son type de nœud en nœud. Nous allons y faire glisser le script
du gestionnaire de jeu. OK. Ensuite, nous
voulons l'enregistrer, aller dans les paramètres du projet. Dans Globals,
nous voulons
charger automatiquement la publicité TCN du
gestionnaire de jeux pour consoles,
qui désormais un symbole de gestionnaire de jeu
référençable dans le monde entier référençable Donc, si nous voulons utiliser cela, nous pouvons simplement revenir
à notre joueur et l'
état vaincu et terminé. Au lieu de faire la queue gratuitement, nous y
laisserons le personnage. Et nous dirons que Game Manager ne
signale pas la fin de la partie, et c'est tout ce que nous avons à faire. L'une des raisons de ne pas
retirer
le joueur de la scène est que, dans l'état actuel des
choses, tous les ennemis
dépendent de l'existence du joueur pour
pouvoir continuer à se déplacer. Donc, dès que vous retirez
le joueur de la scène, tous les scripts ennemis
vont commencer à se casser. Maintenant, si vous voulez
étoffer cela et autoriser le personnage à être retiré de la scène de jeu, il vous suffira de vérifier essentiellement chaque série de,
disons, la scène C Chase ici. Vous devez simplement vous
assurer que la cible est toujours valide, et si elle ne l'est pas,
vous devez simplement revenir. Cela peut donc être
quelque chose comme si cible du
soulignement est égale à zéro, alors vous revenez, ce qui signifie simplement qu'
elle ne bouge tout simplement pas du tout Donc, vous savez, pour le fun,
nous pourrions passer à l'état
joueur vaincu. Nous pouvons en fait ajouter
l'agent point q gratuitement, et nous pourrions simplement voir
comment cela fonctionnerait. Donc, si j'ajoute
simplement cette vérification que les cibles ne sont pas nulles pour
la scène de poursuite, est-ce que ça va se casser ou
est-ce que ça va fonctionner ici ? Alors essayons-le. Voyons si nos ennemis peuvent continuer à fonctionner sans aucun joueur à l'écran. OK, donc nous allons
être vaincus. Je n'ai pas encore configuré la transition pour le joueur HSM Donc, dans Player HSM, créons une autre
fonction, configurons les transitions OK. Cela va donc nous obliger
à ajouter une transition entre l'état de déplacement et
l'état de défaite, et cela se fera lors de
l'événement vaincu. OK,
définissons-les ici pour le HSM du joueur à l'état
export var move,
qui est un état limbo à l'état vaincu à l'
export var,
qui est un état limbo Ensuite, nous allons créer une
constante pour defeated, qui
sera un nom de chaîne égal à entre guillemets OK, nous devons maintenant mettre à jour les noms de
nos variables ici
pour ajouter une transition. Donc, un casse-serpent pour
ces variables. Et nous ne devrions pouvoir passer
d'un coup à l'autre que
parce que
nous n'avons aucun
mécanisme de résurrection dans le jeu. Donc, une fois que nous aurons vaincu,
les parties seront
terminées, et tout ira bien. Vous pouvez toujours
ajouter une transition si vous avez un
moyen de ressusciter Nous voulons maintenant appeler les transitions de
configuration
dans le HSM de configuration, y
configurer des transitions, et nous pouvons gérer
la transition en connectant au signal des statistiques du
joueur Donc, après avoir affirmé que
les joueurs ne sont pas nuls, nous voulons nous connecter au
signal du joueur Ce sera donc vraiment le signal sur le contrôleur de
statistiques. Il peut soit faire
directement référence au contrôleur SAT, soit se
connecter au contrôleur de statistiques via le lecteur, bien qu'il
ne dispose pas encore de cette configuration. Donc, je suppose que dans ce cas, il serait un peu plus direct de simplement faire
référence à un point supplémentaire Exporter les statistiques VR du contrôleur de
statistiques OK, puis ici, nous dirons que statistiques Alive ont changé de point Connect, et ce sera sur Alive changed. Créons donc cette fonction
en bas et rappelons. Et cela
aura la valeur P, la nouvelle valeur du live. Le S renvoie nul. Donc, si la valeur P est fausse, nous voulons envoyer
l'événement vaincu. D'accord, cela
gérera
le déclenchement de la transition de l'état de déplacement à l'état vaincu si nous
sommes dans l'état de déplacement. Si vous finissez par ajouter un
tas d'autres états, il est également possible
de créer n'importe quel état ici. Ainsi,
si les personnages sont vaincus, de n'importe quel
état, vous pourrez simplement passer directement
à l'état vaincu. Il est
peut-être préférable penser à long terme, car vous pourriez ajouter
une sorte d'état d' attaque dans lequel vous jouerez
une animation différente. Vous devriez tout de même pouvoir passer immédiatement en mode vaincu plutôt que de simplement passer du mode déplacement
au mode vaincu lorsque cette
expédition aura lieu. Sinon, si vous effectuez un envoi alors que le personnage
n'est pas en état de déplacement, peut qu'il ne passe jamais
à l'état de mort. Je pense donc que ce serait généralement
la meilleure façon de procéder. OK, maintenant nous devons
tout assigner à l'inspecteur. Attribuez donc le contrôleur de statistiques, attribuez l'état du mouvement et assignez les vaincus
30. P29 Test et amélioration du comportement lors de la défaite d'un joueur: Pour accélérer les choses, je vais cliquer
sur Stats Controller. Prenons le nombre de PV et réglons-le
sur dix, et je vais appuyer sur Play. Donc, si notre personnage
est touché une fois, nous passerons immédiatement
à l'état de mort. OK, alors trouvons un orc. OK, allons-y. OK,
nous sommes donc arrivés à l'état vaincu. Mais nous pouvons constater que l'
agent n'a pas de statistiques,
car nous n'en avons pas
exigé le personnage. Donc, si nous
voulons juste être constants, alors oui, nous pouvons ajouter des statistiques
au joueur. Je pense qu'il est normal de référencer les
statistiques par le biais du joueur car nous
comprenons généralement que le joueur
aura des statistiques, en
particulier dans un jeu de type
RPG De plus, nous pouvons supprimer cette variable de
vitesse ici. Je peux voir que le
joueur utilise toujours la vitesse du script de base au lieu
de celle des statistiques. Donc oui, faisons référence
à Export var stats, qui est un contrôleur de statistiques. OK. Ensuite, lorsque
nous avons de la vitesse, nous voulons utiliser la vitesse des points de statistiques. D'accord ? Et copions-le et
remplaçons-le également là-bas. l'utilisons donc régulièrement dans notre processus physique
pour le joueur. D'accord ? Si nous attribuons les
statistiques et l'inspecteur, nous pouvons le faire sur place. Et puis, si nous examinons le HSM, nous n'avons plus besoin d'une référence
directe aux statistiques, car nous
les
avons déjà obtenues par le biais du joueur Nous pouvons donc modifier
player.stats.ai,
et nous nous connecterons au
live changed grâce à cela et nous nous connecterons au
live changed grâce à Donc, pour être un
peu plus cohérent façon dont nous procédons
dans nos scripts, même si les deux options fonctionnent, bien
sûr, vous le fassiez directement sur le contrôleur de statistiques ou
par le biais du joueur. Passons donc au mode jeu
et faisons en sorte qu'un personnage
soit vaincu ici. Les personnages ont donc été supprimés, et ce qui va se passer,
c'est que lorsque de nouveaux personnages seront créés, de nouveaux PNJ, nous affirmons que le joueur cible doit exister, mais
il n'existe pas OK, donc, en fait,
nous allons simplement
supprimer cette assertion
parce que nous pouvons apparaître des personnages dans le monde du jeu
sans avoir de cible Donc, si c'est nul, je pense que cela
pourrait toujours fonctionner. y aura donc n'y aura donc plus de cible car le
personnage est déjà mort. Ensuite, nous arrivons ici. Lorsque la cible est nulle,
nous ne faisons rien pour l'état Chase.
Je vais donc appuyer sur Play. OK, alors voilà. Les
ennemis s'arrêtent en quelque sorte. Ouais. D'accord, vous pouvez donc voir
qu'il est indiqué d'essayer d' attribuer une instance précédemment
libérée. Donc, ce dont nous avons besoin ici,
c'est d'un contrôle supplémentaire. Nous dirons que si l'agent point cible point joueur n'est pas égal à zéro,
alors nous l'attribuerons. OK, ça a l'air d'être bien maintenant. Plus aucune erreur.
Maintenant, les personnages sont toujours en place. Nous pouvons donc même mettre les ennemis
en état d'
inactivité si nous voulons que
cela soit un peu plus crédible, car
ils ont terminé leur travail, alors maintenant ils ne font que
rester assis Donc, ce que nous pourrions réellement
faire ici sur Update c'est envoyer un événement. Supposons qu'il s'agisse de
l'événement d'inactivité. OK, donc nous allons expulser
Idol de l'
État de Chase, non ? Alors maintenant, si nous passons à Ok Enemy HSM, nous voulons ajouter une transition de l'état Chase
à un état inactif Dites donc « ajouter une transition ». Passez de l'état Chase à l'état inactif. Et ce sera dans
le cadre de l'événement Idle. OK, nous avons donc besoin d'un état inactif. Je vais donc le faire à Export
var Idle state, qui est un état Limbo ici Cliquez avec le bouton droit sur Ajouter un
nouveau nœud enfant dans l'état Limbo. OK, et ça va être vraiment similaire à
l'état de mort. Je vais aller dans
Death State et
tout copier ici dans
le nouvel état des limbes Cela va donc
être un état inactif ici. Cliquez avec le bouton droit de la souris, joignez un
script, Idol State. Et contrôlons
V, collez cela en renommant
simplement cet état inactif Si je devais
créer plus d'états, je commencerais probablement à
penser à créer un
état d'animation de base à ce stade. Mais en réalité, ce n'est
pas beaucoup de code. Nous dupliquons ici, donc
ce n'est pas vraiment un gros problème. Et c'est le
moyen le plus simple de le gérer. Au moins pour parler à court terme. OK, donc avec le AlpiPasted
for the Idol state, je veux juste renommer l'
animation L'animation est déjà
jouée depuis le Blackboard. Nous voulons supprimer cette partie concernant le fait
de faire en sorte l'agent ne soit plus
en vie, car ce n'est pas vrai. En gros, c'est juste ça.
Nous avons une animation. Nous diffusons l'animation
depuis le tableau noir, et lorsque nous entrons, nous
jouons l'animation Et l'animation
est inactive ici. Maintenant, dans Enemy HSM, nous voulons simplement attribuer
l'état inactif En dehors de cela, cela devrait
gérer la transition. Nous voulons passer à
l'état de mort et le remplacer
par n'importe quel état. Ainsi, que les personnages
tournent au ralenti ou poursuivent, nous pouvons passer à la mort si le décès survient.
C'est important. Ensuite, nous
voulons simplement nous assurer copier l'état inactif
dans le squelette. Collez-le ici et
assignez-le dans le HSM ennemi. Attribuez donc
à droite l'état inactif. Et à part ça,
ça devrait être bon. Je vais donc appuyer sur
Play, et nous
verrons si nous pouvons vaincre notre
personnage. OK, alors
allons-y. Notre personnage est passé à l'
idole et c'est tout. Ils n'ont donc plus besoin de cible. Ils ne
poursuivent plus de cible. Ils tournent juste au ralenti
dans leur état d'inactivité.
31. P30 Création d'une scène Pickup2D: Nous allons maintenant
passer à la création de micros d' EXP afin que
notre joueur puisse gagner des
points d'expérience et monter de niveau va donc comporter Cela va donc comporter un
certain nombre d'
étapes. La première consiste à créer notre script de base,
un script à collectionner, puis à faire en sorte
que notre personnage puisse réellement
les acquérir, puis attribuer le bonus d'XP à l'expérience actuelle du
joueur. Commençons donc par créer le véritable pick-up du monde en deux
D. Je vais donc créer
une nouvelle note ici. Nous allons utiliser deux scènes en D, et je vais la
renommer pour qu'elle soit pick-up two D. Cliquez dessus avec le bouton
droit de la souris, et changeons le
type pour qu'il soit une base de zone deux D. Et maintenant, si nous cliquons sur le bouton de script
ci-joint, nous obtiendrons un pick-up
deux D qui étend zone deux D.
Disons le dossier Objects, puis je créerai un nouveau
dossier à l'intérieur d'ici Nous l'appellerons pickups. Ensuite, je peux enregistrer le
micro sous le carré deux points D GD à l'intérieur d'
ici, créer le script Et en haut, nous
allons lui donner le nom de classe pick
two D. Nous allons l'enregistrer dans les pickups du dossier Objects Test de ramassage TACN. Alors,
gardez-le là. Il s'agira donc d'un nœud
physique mondial qui représente un objet global
qui peut être saisi et appliqué à un personnage
d'une manière ou d'une autre. Cela peut impliquer de l'appliquer
directement
aux statistiques ou, dans
d'autres circonstances, le
récupérer et de l'
ajouter à l'inventaire d'un
personnage. Nous n'aurons pas d'
inventaire pour le jeu, mais nous aurons la
possibilité d'ajouter des niveaux à l'arsenal d'armes ou de créer
un nouveau stock d'armes pour
un nouveau type d'arme Pour le pick-up two
D, nous voulons créer une fonction T afin de pouvoir retirer l'objet de la carte du jeu et l'appliquer aux personnages. Supposons donc la fonction Tr take, qui aura besoin d'une cible. La cible P est donc un double D, et nous voulons renvoyer une valeur booléenne cela ait été un
succès ou
non OK, je vais donc
envoyer une erreur ici qui indique qu'il s'agit
d'une fonction virtuelle, implémenter un script étendu. Maintenant, dans Gudo 4.5, ils auront des classes
abstraites, ce
qui rend la configuration plus concrète car ils ajoutent des mots clés supplémentaires pour cela Mais comme nous sommes sur Gudo 4.4, qui est la version
stable actuelle, nous allons simplement procéder à l'ancienne méthode, ce qui
signifie simplement que nous
devons nous rappeler que lorsque nous étendons notre classe
pick-up two D, nous devons la
remplacer manuellement par une nouvelle version de la fonction nous-mêmes Avec les mêmes paramètres
et le même type de retour. Pour TriTek, nous allons
renvoyer la valeur false parce que nous essayons de prendre un objet
appartenant à cette classe abstraite, le pick-up two D. Donc, pour les différents
micros du monde du jeu, nous voulons qu'ils aient tous
leur propre méthode personnalisée d' application au joueur
ou au nœud cible Nous devrons donc implémenter un extension
personnalisé
pour chacun d'entre eux, un script
L pour l'EXP, puis
un pour le ramassage d'armes, ou il se peut qu'il y ait
un script d'amélioration vont donc tous
fonctionner un peu différemment, ils ont
donc tous besoin de leur
propre méthode Tritak OK, nous avons donc notre script
Pickup Two D ici. Cliquez avec le bouton droit de la souris et
ajoutons un nœud enfant. Nous avons besoin d'une forme de collision. Donc, pour la forme de collision ici, je vais simplement passer à cette
forme en haut à droite, et nous allons en faire
une forme de cercle. Vous voudrez donc probablement également utiliser un sprite
par défaut ici. Je vais donc cliquer avec le bouton droit de la souris
ici, ajouter un nœud enfant, et nous voulons obtenir un sprite Donc, pour un objet
qui ne fait que
jouer une animation encore et
encore, sans changement ou quoi que ce soit d'autre,
je pense que le
Sprite two D animé est une
meilleure option Par exemple, si une pièce
tourne encore et encore sur la carte et que
vous voulez simplement qu'elle joue automatiquement cette animation, alors le Sprite two
D animé est parfait pour Nous allons donc le sélectionner
et appuyer sur Créer. Maintenant, pour les icônes du jeu, il se peut qu'elles ne soient même pas
vraiment une animation. Mais si nous voulons en
faire le modèle par défaut, je voudrais l'
ouvrir comme une possibilité. Donc, pour notre Sprite animé, nous passons à l'
animation ici Nous allons créer une nouvelle
ressource Sprite frames et l'ouvrir. Nous avons donc une
fenêtre d'animation différente en bas à gauche. Je pourrais donc simplement le renommer
en Idol, si je le souhaite. Passons à l'art. Nous voulons passer aux icônes de
Raven Fantasy et à la fiche complète de Sprite Examinons cela et voyons
si nous voulons quelque chose Donc, pour y accéder correctement
depuis cette fenêtre d'animation, il y a cette icône Ad
frames from Sprite Sheet Alors cliquez dessus.
Passez ensuite à Art Fantasy Icônes, feuille Sprite d'
automne, 16 par 16 Vraiment, tu pourrais en utiliser un
plus grand si tu veux. Peut-être que je vais juste
utiliser le 32 par 32. Donc, pour un peu plus de
résolution, ouvrez-le, et vous pouvez simplement sélectionner
les icônes que vous souhaitez. OK, maintenant pour que cela
soit correctement découpé, nous avons besoin du bon
nombre de lignes et colonnes sur notre feuille de
sprites ici Ou si vous connaissez la
taille de chaque icône, je pense que vous pouvez simplement
passer à la taille ici et mettre 32 30 Oui. OK, c'est certainement
la façon la plus rapide de procéder. Lorsque vous en modifiez un, il calcule
automatiquement l'autre. Nous en avons donc 16 horizontaux. En fait, ce sont les colonnes, puis 128 lignes verticales
sont les lignes. Donc, plutôt que de calculer cela, nous savons simplement que
chacune mesure 32 x 32. D'accord ? Maintenant, nous pouvons facilement choisir
l'icône que nous voulons à partir de là. Vous pouvez donc utiliser
ce que vous voulez
comme gemme EXP. Je crois que dans
le projet de modèle, j'utilisais celui-ci ici juste une sorte de joyau bleu.
Nous ajoutons ce cadre. Et cela se jouerait automatiquement si nous cochions simplement la
fonction de lecture automatique en bas, mais vous pouvez voir que cela n'a même pas vraiment besoin
d'être joué Et c'est probablement un peu plus performant si nous
désactivons la lecture automatique Il s'agit donc simplement de montrer
cette image
et de ne même pas essayer de boucler quoi que ce soit. pure supposition de ma part, C'est une pure supposition de ma part,
mais mettons
les choses au point. Et ce sera notre
pic par défaut pour le nœud racine Pickup two D. Donc, pour le nœud racine
Pickup two D, nous souhaiterons probablement également
configurer les couches de collision. Je ne pense donc pas que nous ayons une couche
spécifique pour les camionnettes. Ajoutons donc une
nouvelle couche de collision. Il suffit de passer à la
cinquième couche et de dire micros. OK, ferme. Ensuite,
nous voulons, bien sûr, placer le capteur sur la couche 5, et nous désactiverons le masque. Nous allons désactiver
la surveillance car cela va être
détecté par quelque chose. Il ne surveille pas les camionnettes. Il permet au joueur qui ramasse l'objet
de le détecter. Il s'agit donc simplement de surveiller
un bol avec la couche 5. Et c'est la
scène de base de notre pick-up
32. P31 Mise en œuvre du système de collecte d'expériences avec héritage: Ce que nous pouvons faire en
bas à gauche c'est rechercher à nouveau le ramassage. Cela devrait afficher
le dossier des pickups, et nous voulons
cliquer avec le bouton droit sur Pickup two D et créer une scène d'
héritage C'est donc en haut, une
nouvelle scène héritée, ce qui signifie que nous
créons une nouvelle scène
basée sur cette scène, afin qu'elle hérite des mêmes
valeurs par défaut de notre parent Nous créons donc cette nouvelle scène, et vous verrez que certains de
ces nœuds deviennent orange, ce qui signifie qu'ils sont en fait basés sur
la scène parente. Vous pouvez accéder au parent en
cliquant ici. Vous pouvez donc avoir des
scènes à l'intérieur des scènes. Et nous voulons renommer le nœud
racine EXP pick-up two D. Parce que nous voulons être précis
sur ce que nous faisons Et enregistrons cette scène
en tant que nouvelle scène. Donc XP pick-up tod
dot TCN, sauvegardez ça. Ensuite, faisons un clic droit sur le nœud racine et
étendons ce script. OK, donc cela
va nous donner notre script EXP Pickup two D, qui part du pick-up deux D. Ensuite, nous allons monter
en haut et dire le nom de
classe EXP Pickup two D. Nous voulons donc
donner une variable EXP que nous allons
réellement récupérer
chaque fois que le personnage utilise
Tri take sur le pick-up chaque fois que le personnage utilise
Tri take sur le Donc, à Export, VR sera un entier, et nous le nommerons par défaut à un. Maintenant, si nous examinons
le script pick-up two D, nous voulons prendre cette
fonction et l'
implémenter correctement dans notre script d'
héritage Je vais donc le copier
, et nous
allons passer à
EXP Pickup two D. Je vais le coller
et nous allons
écrire notre véritable méthode de tri take Le pick-up d'EXP appliquera
donc l'expérience à la cible si celle-ci possède
réellement de l'expérience Supposons donc que si ptarget
point stats est égal à null, nous allons
renvoyer false ici Sinon, nous pouvons dire que var stats est égal à ptarget point stats Et comme nous ne
savons pas ce que signifie réellement cette
variable de statistiques dans
le contexte de chaque script, attribuons-lui directement le hype du
contrôleur de statistiques Donc, une fois que la condition est remplie, savoir qu'il s'agit d'une cible
dotée d'un bloc de statistiques, nous pouvons dire que les statistiques marquent un point d'expérience
plus l'équivalent d'expérience, puis nous reviendrons à la réalité. Donc, une fois que nous avons
repris l'expérience, nous ne voulons pas que le capteur soit
à nouveau utilisable Je vais
donc dire que monitorable
est égal à faux, puis nous repérerons
librement l' Ainsi, lorsque vous n'aurez plus de signal,
il faudra un certain temps avant
qu'il ne soit finalement
retiré de la scène. Nous voulons donc nous assurer que rien d'autre ne pourra accidentellement capter le pick-up
EXP une seconde fois Je change donc le paramètre monitorable pour que rien
d'autre ne puisse Juste à titre de sauvegarde, puis nous le retirons complètement de la
scène. Donc, cette partie
ici, je veux probablement la réutiliser
dans tous mes micros Je vais le découper en deux D, puis
dire « suppression de la fonction », ce qui renverra « nul », et je vais juste faire
cette étape de conclusion. Alors maintenant, si je
reviens à EXP pickup, j'appelle simplement remove, qui
provient de la classe de base Cette fonction est donc
déjà écrite dans la classe de base, et
nous pouvons la réutiliser ici. Alors, oui,
chaque fois que nous implémentons le banal, si nous
voulons le refaire,
nous pouvons simplement le supprimer ici Et pour que cela
fonctionne, nous devons ajouter les statistiques expérimentées
à notre contrôle des statistiques. Donc, dans le contrôleur set, je vais créer
cette propriété EXP OK, nous allons donc
avoir l'expérience de Vara et la valeur par défaut du sol égale
à zéro sous forme d'entier OK, et en quelque sorte pour ce
qui est des dégâts subis, où nous appelons le set invincible indépendamment
du réglage des PV, je préférerais peut-être
ne pas créer de setter ici Plutôt pour faire fonctionner l'expérience
publicitaire, et nous lui donnerons un montant. Donc P amount, c'est un entier
et nous allons renvoyer void ici. Nous voulons donc prendre l'
expérience plus un montant égal à P. Et puis, pour le faire,
vérifiez si vous montez de niveau. Et on peut aussi parler d'expérience d'
impression ici. Nous profiterons donc d'
une expérience totale en collectant des objets
sur la carte dans la console. Ensuite, pour mettre à jour le nombre
d'EXP en conséquence,
je voudrais faire en sorte que les statistiques n'ajoutent pas d'expérience à de
l'expérience OK, donc nous sommes
un peu plus explicites. Cette fonction implique donc que
tout ce qui concerne l'expérience
doit changer lors l'
ajout d'expérience
, ce qui signifie que nous devons vérifier
s'il y a un niveau supérieur, etc. Et je pense que cela
aurait un avantage. exemple, nous pourrions modifier la valeur de l'
expérience sans déclencher
ou vérifier
automatiquement une augmentation de niveau si nous en avions
besoin plus tard. Au lieu de toujours le faire, quoi
qu'il arrive, comme nous l'avons fait avec le setter HP, met toujours
à jour votre vie. Les deux manières de faire
sont valables dans une certaine mesure. Il s'agit en quelque sorte de la façon dont vous voulez exprimer
votre intention ici. Et voulez-vous masquer le fait que la définition de l'
expérience déclencherait également une montée de niveau plaçant dans un outil de définition d'
expérience, ou souhaitez-vous
être plus explicite avec la fonction d'ajout d'expérience
33. P32 Configuration de Collector2D et correction des animations des joueurs: Pour transférer de l'expérience à notre manette
de statistiques depuis le Pickup two D, nous avons besoin de notre nœud Collector
Two D, qui
collectera les micros pour notre joueur Passons donc à la scène des joueurs. Je vais cliquer avec le bouton droit sur le joueur. Nous ajoutons un nœud enfant. Cherchons une zone deux
D. Donc, cette zone deux D, je vais la renommer ici en
collecteur deux D. Ensuite,
cliquons avec le bouton droit sur joindre un script Donc, le script sera écrit, il
pourrait être en personnages, donc je vais le
mettre en personnages. Il
se peut que nous fassions en sorte qu'un ennemi soit capable de
ramasser des objets, mais je ne veux pas que cela soit
complètement spécifique au joueur. Je vais donc y mettre le script. Créons. Ensuite,
en haut à gauche, nous lui donnerons le nom de
classe collector
two D. Ce qui nous
intéresse pour la zone de
collecte deux D c'est lorsqu'un pick-up
entre dans l'espace. Nous allons donc dire que la fonction underscore ready va renvoyer la valeur void, et nous dirons que la zone saisie se
connecte à la zone saisie Ensuite, nous allons créer la fonction de
rappel underscore sur la zone saisie qui recevra une zone P zone deux D en paramètre
et renverra Donc, si la zone P est un micro deux D, alors nous allons prendre le point de zone P
Tri sur notre nœud racine. Notre nœud racine est donc notre joueur. Nous pourrions exporter notre nœud
racine ici à l' exportation. La racine de l'objet est le
nœud deux D, je suppose. Ensuite, nous enverrons
cet objet root ici. En tant qu'objet TriTek, celui que nous voulons traverser Maintenant, dans notre inspecteur, signez le joueur ici, et c'est
peut-être tout ce dont nous avons besoin. Ajoutons donc une copie de
notre collection d' EXP dans
le monde du jeu. Nous allons vraiment en mettre quelques-unes.
Je vais donc cliquer avec le bouton droit sur Monde. Créons un nœud 2 D.
Je vais renommer ces micros, puis j'ajouterai quelques
micros au monde du jeu Donc un, deux, trois, puis je les mettrai tous
sur le pick-up parent On voit qu'elles
sont assez grandes. C'est bien pour le
moment, mais nous
allons probablement les réduire
pour le reste de notre jeu. Donc, avant
que cela ne fonctionne, je me rappelle juste que
nous n'avons pas configuré le collider sur le joueur Pour le collecteur 2 D,
cliquez avec le bouton droit sur un nœud enfant, et nous voulons ici
la forme de collision 2 D. Donc, sur la droite, ajoutez une nouvelle forme de cercle et réduisez-la pour qu'elle soit peut-être
juste là, un peu plus grande que la forme de collision
normale. Va voir Collector TD et
prends en charge la collision. Nous allons masquer la couche de
micros, puis
désactiver la couche de masque 1 monde et la couche de
collision 1 monde Il doit s'agir d'un script
de surveillance uniquement. Et je viens de
remarquer que, comme ces images lumineuses
sont de
tailles différentes pour nos animations, elles ne s'alignent pas correctement
au centre. Par exemple, l'idole a l'air bien, mais courir se trouve peut-être à un
pixel vers la droite, et puis la mort est un peu
incorrecte là aussi. Donc, une façon de résoudre
ce problème pour nous assurer qu'ils sont
tous corrects est d'
attribuer une propriété de position
à chacun des SprikeFrames, ce que j'ai déjà
fait ici pour la Idle a donc sa propre valeur. Voyons ce qui se passe si je supprime
réellement ces propriétés de
position. Alors fais ça pour Death
Idol et cours, d'accord ? Ensuite, nous le supprimerons également pour la réinitialisation s'il est là. OK, donc, oui,
il semble que nous devions le personnaliser à nouveau. OK.
Commençons donc par la course. Je vais
le positionner ici à moins 30 et l'intégrer à
cette animation Nous irons à Idle. Je vais
appuyer sur W et le déplacer vers le bas. Donc c'est comme si c'était juste
là, moins 13 et keyframe. OK,
allons-y courir. Passons à Idle. Il semble qu'Idle soit
toujours inférieur d'un pixel, donc je vais le déplacer jusqu'
à moins 14, le saisir par image-clé Je pense que c'est ce que
nous avions avant, mais je vais prendre la
fuite, le déplacer d'un côté vers la mais je vais prendre la
fuite, le déplacer d'un côté vers la
gauche et l'encadrer. Alors maintenant, si nous passons du
mode veille au mode exécution. OK, ça
a vraiment l'air correct maintenant. Passons à la mort,
déplaçons-le ici vers la droite
et encadrons-le. C'est donc dix pixels
vers la droite. Et maintenant, nous passons au ralenti. OK, la mort, c'est un pixel de trop
vers la droite. Cela doit donc passer à
moins neuf, encadrez-le. Nous sommes donc inactifs. OK, nous devons
donc aller deux pixels de plus vers la gauche pour la mort et l'encadrer. Donc ça fait un huit, puis
le temps d'inactivité est nul pour X. OK, on
dirait qu'ils sont tous alignés maintenant. OK. Voici donc
les valeurs réelles. Huit, moins 14 pour le décès. L'idole vaut zéro moins 14. Run est égal à moins un
et à moins 30. Et puis la réinitialisation, qui
devrait correspondre à l'idole, qui est zéro, moins 14. La réinitialisation
ramènera donc à moins 14. Le négatif 14 est juste
là, Keyframe le. OK, et cela devrait résoudre
tous les problèmes d'animation nous rencontrons avec
ces feuilles de sprites OK, revenons maintenant au collecteur
2 D. Assurez-vous de
désactiver la première couche ainsi que le masque
de la première couche. OK, et maintenant nous pouvons appuyer sur
Play et voir si nous pouvons réellement récupérer
ces petites icônes. Nous avons donc obtenu celui-ci. Vérifions le résultat. Avons-nous acquis cette expérience ? Oui, nous l'avons fait. Nous avons une expérience à ce
sujet. Nous allons descendre ici. Nous acquérons l'expérience 2. Maintenant, celui-ci en possède trois, nous pouvons
donc confirmer que
nos micros
fonctionnent en fonction de la sortie de
notre console Et notre personnage a
été vaincu en arrière-plan. Mais c'est une bonne chose
, cela montre que ce système de jeu sur console fonctionnait également.
34. P33 Création de mécanismes de chute ennemis et redimensionnement des capteurs: Nos camionnettes. Maintenant, nous
voulons nous assurer que ennemis les abandonnent réellement
lorsqu'ils sont vaincus. Nous
voulons probablement aussi rapidement redimensionner le micro deux D, car il fait le
double de la taille de notre lecteur à ce stade Donc, dans EXP pick-up two D, je peux soit remplacer
le sprite
animé par la version 16 x 16, ce qui est pratique car
nous l'avons déjà, soit prendre le nœud
et le réduire Je peux donc le faire comme 0,50 0,5. Et puis ce serait une
façon de le faire rétrécir. Mais si nous savons déjà que la taille ne sera pas
constante dans notre jeu, il serait peut-être plus judicieux de
passer à la scène
de base,
qui consiste à choisir deux D changer le sprite animé Et puis nous ajoutons la même icône, mais à partir du pack 16 par 16. Alors, allez dans la feuille
Sprite complète des icônes artistiques, 16 par 16. Dimensionnez-la en 16 par 16 car il s'agit de la
plus petite feuille de sprite Ensuite, nous contrôlerons le rouleau de souris
en métal, zoomerons, trouverons le sprite, l'ajouterons et retirerons le gros Sélectionnez donc zéro et supprimez-le, puis il redescendra à l'
image zéro. Sauvegardez ça. Et puis de retour dans cette scène,
vous pouvez également l'enregistrer, et cela devrait être bon pour
la vision du monde OK, maintenant c'est la
bonne taille. Bien,
passons à la scène orc, et nous allons ajouter la
possibilité de déposer des objets Ici, nous voulons un
script qui
gère les objets que nous pouvons ajouter au jeu,
et nous
pouvons les
sélectionner au hasard dans une liste d'objets,
et nous pouvons les pondérer de la même manière
que nous
le faisions en attendant
l'apparition de l'ennemi Je vais donc cliquer avec
le bouton droit sur l'état de mort, car
il sera directement lié à l'état de mort dans le sens où nous
lâchons des objets en cas de décès, et j'ajouterai un nœud enfant. Faites donc un nœud normal ici. Ensuite, nous allons le renommer en
quelque chose comme drops. Cliquez avec le bouton droit de la souris, ajoutez un script ,
puis
nous le créerons ici. Nous allons donc lui donner le nom
de classe drops. Nous allons donc lui donner le nom
de classe drops. OK, et dans notre script de dépôt, nous allons avoir besoin
d'une liste d'objets que nous pouvons supprimer. Supposons donc qu'à Export VR, nous utilisions des définitions de gouttes, et il s'agira d'un tableau
de définitions de gouttes. Donc, en suivant le
même schéma qu'avant, lorsque nous avons une ressource
définie par l'éditeur, nous pouvons répéter
cela. Dans le système de fichiers,
nous allons vouloir
aller quelque part, nous allons vouloir
aller quelque part le dossier
Objects pickups cliquer avec le bouton droit de la souris
pour créer un nouveau script Et je vais appeler
cela la définition de la chute. Et cela dépendra des
ressources. Créez ça. Nous pouvons maintenant ouvrir la définition de
dépôt, lui donner le
nom de classe drop definition. Et nous allons avoir besoin
d'Export VR Scene, qui est une scène pleine à craquer. Alors, qu'allons-nous ajouter
au monde du jeu, à savoir la véritable perte d'objets ? Donc, comme il s'agit d'une scène bondée, il peut s'agir de tout ce qui a un nœud à la racine. Tu pourrais lâcher des ennemis
si tu le voulais. Cet emballage le
rend donc simplement flexible. OK, et ensuite
nous voulons un poids. Le poids de la voiture d'exportation est donc à flot. Nous allons le définir par défaut à 0,1, et c'est un bon début. Nous allons donc réexaminer le script de
dépôt, et nous avons notre gamme de définitions de dépôt afin que nous
puissions cliquer sur des gouttes. Et si vous ne pouvez pas voir le tableau ici et l'
inspecteur ici, vous pouvez simplement accéder à Project
et recharger le projet OK, donc maintenant, si vous
vérifiez l'inspecteur, il devrait y apparaître
tant que vous n'
avez aucune erreur. Nous allons donc créer notre
première définition de drop. Donc, nouvelle définition du drop, et nous pouvons en faire un
gymnase EXP avec un poids d'un, si nous le voulons. Chargement donc rapide. Et nous allons chercher
le pick-up EXP à deux entrées en D, et c'est ce qui le met en place Notre orc
ne
pourra donc lâcher que les gemmes d'EXP, et c'est parfaitement bien
pour notre ennemi de base Nous voulons donc fonctionner, nous pouvons faire
appel à notre état de mort ou notre animation qui
serait capable de générer les
drops dans le monde du jeu. Nous pourrions donc dire « suppression de
la fonction » si vous le souhaitez, vous pouvez la transmettre un
certain nombre de fois ici, exemple P fois est un entier, et la valeur par défaut peut être un, et cela renverra la valeur void. Nous pourrions donc dire quatre fois dans plage de zéro à P, en
incrémentant d'une à chaque fois Cela signifie donc que nous partons de zéro, que nous montons une fois jusqu'à ce que
nous atteignions P fois. Donc, si P fois est égal à un,
celui-ci sera exécuté une fois
car il fera zéro, puis il atteindra
P fois et s'arrêtera. Nous allons donc y faire les deux points. OK, et après avoir
fait la boucle, nous devons générer
un drop à chaque fois. Il serait donc probablement
préférable de calculer le poids total une fois, puis
de l'utiliser à l'intérieur d'ici. Nous allons donc générer le poids. Donc, avant de générer les gouttes, nous allons dire quatre définitions de DF et de
drop. Nous accumulerons
le poids total, nous avons
donc besoin d'une
variable supérieure. Jusqu'à présent, le poids total, il y a un flotteur qui
commence à zéro, zéro, et ce
sera le poids total majoré du poids du point DF.
OK ? Nous l'avons donc. Maintenant, à l'intérieur de ces quatre boucles en bas, nous les
parcourons à chaque fois. Nous voulons obtenir le poids que nous avons
sélectionné entre zéro et
le poids total. Cela reprend donc en quelque sorte
la même logique que autres randomisations que nous avons
effectuées dans ce cours Supposons donc que le poids
sélectionné par var soit égal à rand F
, soit 00-1 0,0, et nous multiplierons cette
valeur par notre poids total, ce qui
nous donnera notre sélection Maintenant, pour chacune des gouttes définir dans
les définitions de
gouttes, nous allons ajouter le poids indiqué jusqu'à présent. Jusqu'à présent, le poids actuel, qui est un flottant
et commence à
zéro, nous dirons que le poids actuel augmenté
est égal au poids de définition. OK, donc ça nous donne
ce que nous en sommes jusqu'à présent. S'il est supérieur
au poids sélectionné, nous voulons renvoyer cette goutte ou l'ajouter à un tableau de gouttes. Donc, si le poids actuel est supérieur ou égal
au poids sélectionné, c'est celui que nous
voulons ajouter à un tableau Créons donc un tableau au-dessus de la boucle à
quatre, et nous dirons que var drops est
un tableau de définitions de gouttes. Maintenant, l'essentiel ici, c'est qu'il peut y avoir plusieurs copies de la même définition de drop. C'est un tableau, pas quelque chose
d'autre comme un ensemble de hachages. Nous pouvons donc avoir la même baisse deux ou trois fois si nécessaire,
ce qui est important. Supposons que des gouttes ajoutent
la définition, puis nous sortons
de ces quatre boucles, puis tout
revient ici Ainsi, une fois que nous arrivons à un point où
le poids actuel est égal ou supérieur
au poids sélectionné, nous sélectionnons le drop, et
nous faisons une nouvelle boucle pour chaque fois que nous en avons besoin
pour cette configuration de drop. Maintenant que nous avons tous
les menus déroulants ici, nous voulons
les intégrer au monde du jeu. Disons quatre gouttes en gouttes. Nous allons créer une
instance qui sera égale
à drop point
seen point Instantiate Ensuite, nous allons
ajouter cela en tant qu'enfant
à un parent dans notre monde
de jeu. Donc, dans le monde, nous pourrions simplement réutiliser ce
nœud de collecte si nous le voulons Je peux donc prendre des camionnettes. Passons au nœud en
haut à droite, et j'ajouterai un nouveau groupe. Nous dirons donc des camionnettes. Je vais le rendre mondial. Donc, pour tout ce qui est un
objet à récupérer dans le monde, nous l'ajouterons en
tant que groupe de nœuds. Ainsi, lorsqu'il se trouve dans un groupe de nœuds, il est très facile de le trouver
dans notre script Et nous pouvons
accéder à ce
nœud de collecte dès que notre orc sera chargé, afin de savoir s'
il y a un problème Nous allons donc dire var pickups parent, et ce sera le nœud 2 D, et nous dirons déjà
function underscore et ce sera le nœud 2 D,
et nous dirons déjà
function underscore
.
Permettez-moi de zoomer ici. Le
parent des pickups sera égal à Gtree point Get first
Node in group, et nous
recherchons ces pickups.
Ainsi, dans les groupes de nœuds situés ici dans les groupes
de nœuds de l'
inspecteur,
vous pouvez voir des pickups,
il y en a déjà un,
et celui-ci est attribué
à ce nœud vous pouvez voir des pickups,
il y en a déjà un,
et celui-ci est attribué
à ce Donc, tant que le nœud de
micros existe dans notre monde de jeu actuel,
il fonctionnera parfaitement Nous pourrions aller un peu plus
loin
et transformer cela en une variable
constante. Nous allons donc dire
groupe de collecte ici, tout en majuscules, puis groupe de collecte constant
est un nom de chaîne égal à, et je dirais esperluette,
Control V, collez la Donc, tant que vous avez un nœud dans le groupe de micros
pour cela, que vous avez assigné ce nœud
au groupe au sein de votre projet de jeu et
qu'il existe dans la scène, cela
fonctionnera
parfaitement Vous n'avez pas besoin de références directes, ce qui serait difficile
car l'orc n'
existe pas dans la scène tant qu'
il n'est pas apparu. C'est donc un moyen décent d'obtenir le nœud parent
auquel nous pouvons le parent. Si nous voulons être sûrs que
nous pouvons même dire, par exemple,
assert pickups parent
et que ce n'est pas égal à null, puis nous dirons qu'il doit y avoir un parent pour que les objets
soient déposés. OK, c'est assez
clair. OK, nous instancions chacune des scènes, puis
nous voulons
les ajouter en tant qu'enfant au parent
du pickups Donc, les camionnettes sont parents d'AchildeStance. Et l'emplacement où nous voulons que le
dépôt se trouve sera basé sur le
nœud deux D. Nous devons
donc effectuer des dépôts
et le remplacer par un
nœud de type deux D. Donc, ici, nous pouvons dire que position globale de
l'
instance sera égale à la
position globale du script. OK, donc cela signifie
revenir à notre scène organisationnelle. Maintenant, nous voulons
changer ce type de nœud, je vais cliquer avec le bouton droit de la souris
et changer le type, rechercher des gouttes, et
vous devriez le voir ici. Double-cliquez. OK,
cliquez sur Drops. Assurez-vous que dans l'
inspecteur, vous y avez toujours votre définition de dépôt
pour l'EXPJM Et nous devons probablement
le déplacer hors
des nœuds HSM ici Comme il s'agit d'un nœud deux D, nous voulons qu'il soit un enfant
de notre nœud principal deux D. Je vais
donc aborder ce point
ici en tant qu'enfant du travail. Et ça devrait
probablement être une bonne chose. Nous avons donc l'objet ou tout ce que nous voulons ajouter à l'instance
dans le monde du jeu. Il devient un enfant du nœud
du groupe de ramassages, puis nous lui donnons la
position de ce nœud drops, qui ne représente qu'un décalage, le
cas échéant, par rapport à la position des orcs Nous n'avons pas besoin de
le changer, mais nous pourrions simplement avoir une valeur par défaut égale à zéro, zéro
ici. C'est très bien. Et maintenant, nous pouvons soit
appeler des interruptions depuis
l'animation de la mort,
soit depuis l'état de mort. Donc, si je passe dans le lecteur
d'animation ici et que nous ouvrons l'
animation de la mort, voyons voir. État de mort. Alors voyons voir. Nous appelons « état de mort
terminée ». Nous pourrions simplement mettre les gouttes dès que l'orc commencera à mourir Je pense que c'est peut-être plutôt ainsi que se déroulent
la plupart des jeux, où vous voyez la boucle avant qu'ils ne sortent
de la scène Donc, sur une piste, appelez la
méthode sur le nœud Drops. Ensuite, ici, à la première
image. Zoomons. Bien, cliquez sur Insérer
une clé. Nous faisons des drops. Vous pouvez voir les paramètres
fonctionner dans le lecteur d'animation. Donc, en haut à droite, nous avons nom de
notre méthode de dépôt.
Ayez l'argument. Le premier et le
seul argument est donc une valeur entière. Alors, combien de fois
voulons-nous appeler Drops ? Nous pourrions dire 50 pour le fun, puis appuyons sur Play pour voir
si cela fonctionne réellement. Cela ajoutera donc beaucoup de ces joyaux d'EXP à la
scène si cela fonctionne, mais au moins nous saurons
certainement si cela fonctionne Voyons donc ce qui
se passe. OK, je pense qu'ils
apparaissent tous au même endroit Je vais donc passer en revue cela. Et oui, vous pouvez voir que nous avons
ramassé 50 pierres précieuses.
35. P34 Générer des positions de dépose d'objets aléatoires: Ly, quand l'orc laisse tomber
50 de ces objets, ils sont tous empilés les
uns sur les autres, si je
regarde le résultat Nous avons donc obtenu 50 XP. Et je pense que ce que
nous voudrions faire, c'est que lorsque l'objet apparaît, soit nous lui donnions
un décalage, soit nous le faisions s'éloigner de l'objet Ça baisse un peu. Je pense donc que le
moyen le plus rapide de le
faire serait de générer une position de
décalage aléatoire, un
certain nombre de
pixels du personnage
dans une direction aléatoire Nous pouvons donc simplement l'ajouter
dans le script de dépôt. En haut, je vais
exporter
notre distance maximale de chute,
qui sera un flotteur. Et allons-y avec dix
pixels par défaut. Cela va représenter la
distance par rapport au nœud Drops. C'est sur ce
nœud spécifique sur lequel nous
travaillons que l'
objet peut apparaître, et il s'agit d'une quantité maximale, elle peut
donc mesurer efficacement de 0 à 10
pixels Donc, en bas de page,
je vais créer une nouvelle fonction. Je vais l'appeler function, underscore, get span, offset Et cela passera
par une distance P max, qui est un float, et nous pouvons utiliser par défaut la distance maximale de
chute. Nous n'avons donc pas besoin de
passer de paramètre. Il se peut que ce soit simplement cela par défaut. Ensuite, nous voulons revenir
au vecteur deux en tant que décalage. Donc, pour obtenir un décalage final,
nous avons besoin de la direction, puis de la magnitude,
la magnitude est juste ici dans
la distance P max. Supposons donc que la direction
var soit un
type déduit du vecteur deux, et que nous allons
créer un nouveau vecteur deux,
alors mettez-le entre parenthèses
ici, nous avons besoin d'un X et d'un Y. Donc, pour obtenir cela, nous devons
essentiellement générer une direction aléatoire entre moins un et
1,0 Je vais donc dire rand F, et je pense que nous avons besoin d'une fourchette
ici parce que nous voulons
passer à moins 1,0, et
non de zéro à un. Donc, la plage de F aléatoire est comprise entre
moins 1,0 et 1,0. Ensuite, nous devons le faire
une deuxième fois afin de pouvoir simplement copier cette ligne pour
la valeur Y jusqu'ici. Ensuite, je veux normaliser le vecteur pour qu'
il soit une direction pure. OK, maintenant nous avons notre compensation. Le décalage de var
sera donc égal à la direction
multipliée par la distance P max. Ensuite, nous renvoyons le décalage,
et c'est tout. Nous prenons donc Get
spawn offset ici, et lorsque nous définirons
la position globale,
nous allons faire la position globale plus
GitsPawNofset La valeur par défaut est
Drop Max distance, nous pouvons
donc simplement l'utiliser
comme valeur par défaut ici. Vous n'avez donc pas vraiment
besoin de passer la distance maximale,
mais vous le pourriez. Ce serait donc simplement la
valeur qui se substituerait à elle-même. Quoi qu'il en soit, ce sera pareil, mais vous avez la possibilité
de le laisser vide, puis cette valeur
sera simplement
définie par défaut ici. Je pense
que c'est tout ce dont nous avons besoin. Passons donc en mode
jeu et voyons si ces 50 objets tombent réellement
à différents endroits. Alors, appuyons sur Play,
et nous allons entrer ici. Je vais lancer une flèche
ou une lance sur l'orc. Et nous pouvons voir qu'ils
apparaissent tous dans des directions aléatoires Mais en fait, j'ai commis une erreur. Nous ne voulons donc pas normaliser
le vecteur car je veux le pourcentage de distance puisse
aller de 0 à 100 % OK, donc parce que j'ai normalisé le vecteur pour la direction, cela vous
donnera toujours la distance
maximale totale ici Ce ne sera que la direction
pure. Mais ce que je veux vraiment, c'est que
lorsqu'il prendra cette direction, ce sera un certain pourcentage
de la distance. Et nous pourrions plutôt
appeler cela un vecteur aléatoire. Ensuite, nous descendrons pour
compenser ici et au-delà. Donc, lorsqu'il prend le X, ce sera entre
0 et 100 % de la distance
sur le X multipliée par la distance P max, et
il en va de même pour le Y. Cela lui donnera
donc
une position un peu plus aléatoire à l'intérieur
d'un cercle imaginaire Si vous deviez créer
une forme de collision, elle
ressemblerait un peu à cela pour
les emplacements de travée possibles. Passons donc au mode jeu, et cela devrait être plus correct maintenant lorsque nous lâchons les 50
objets en même temps. Alors voilà. Ils sont tous générés
aléatoirement
à l'intérieur de ce cercle. Nous n'allons
jamais lâcher 50 objets en même temps. Donc ça
a l'air plutôt sympa. Mais s'il y a
deux ou trois gouttes, je pense que ça marchera très bien. Donc, à titre de démonstration, je vais passer au lecteur d'animation, et quand nous parlerons de la mort, je prendrai la
fonction drops ici et nous
changerons la valeur de son argument, c'est-à-dire le
nombre de gouttes, à environ trois. Je pense que c'est plus réaliste. Appuyons sur Play, puis
nous entrerons dans le vif du sujet. Dans la plupart des cas, je
pense que la plupart
des ennemis ne lâcheront qu'un seul objet. Mais si nous décidons
d'en perdre trois, nous pouvons au moins voir qu'ils ont des positions
différentes, et il est évident de voir au
moins où ils en sont. OK, donc je voudrais
terminer en remplaçant
les gouttes par une. Chacun d'entre eux ne fera
gagner qu'une seule EXP.
36. P35 Mise en œuvre d'une zone de gravité de pick-up: C'est un peu fastidieux
si votre joueur doit
passer par-dessus chaque
pick-up que vous voulez récupérer, surtout lorsque vous
devez esquiver tous ces ennemis orcs qui
s'étendent sur Nous voulons donc ajouter une zone de gravité pour
les capteurs. Donc, sur notre scène de joueur, plutôt que d'ajouter
la zone de gravité à notre nœud collecteur à deux nœuds D, je vais créer un nœud de zone à deux D
distinct pour la gravité en particulier. La raison en est que la forme de collision (deux D) utilisée
ici pour
ramasser les objets se situera une zone différente de celle dans
laquelle la gravité est appliquée. Ce serait donc un peu confus avec le
collecteur à deux D, a deux formes de zone ici. Nous allons donc
créer un nouveau nœud. Je vais cliquer avec le bouton droit sur le
joueur pour ajouter un nœud enfant. Ce serait dans la zone 2 D. Nous allons l'ajouter
ici en bas,
et je vais le renommer en Pickup Gravity
Two D, car il s'agit spécifiquement des objets de la
carte qui peuvent être ramassés OK, alors faisons un clic droit
sur le joueur pour ajouter un nœud enfant. Nous allons
chercher la zone deux D, et je pourrais l'appeler
quelque chose comme zone de
gravité deux D. J'ai pensé à l'appeler
gravité deux D, mais nous voulons rendre le script un peu
plus générique, car il peut y avoir des cas
où vous
voudrez vraiment que la gravité s'applique
à quelque chose
qui n'est pas un pick-up, et gérer la gravité
spécifique du pick-up est simplement géré par
la forme de collision. La gestion du fait qu'
il s'agit de cibler des micros est uniquement gérée
par les couches de collision Donc, pour cibler les micros, il
vous suffit choisir le masque 5
pour la couche de micros,
puis de désactiver la première couche là où elle se trouve et de la
faire uniquement surveiller OK, c'est donc notre configuration. Ensuite, il suffit de
l'
appliquer dans la zone de gravité à tous les objets qu'il détecte à l'intérieur
. Donc, à l'intérieur de la
zone de gravité, nous allons cliquer avec le bouton droit de la souris. avant de passer à
l'inspecteur,
si nous examinons cette section de
gravité, a une zone de gravité à
deux D intégrée, y a une zone de gravité à
deux D intégrée,
mais le fait est que cela s'applique aux corps rigides
à deux D, qui sont des
objets physiques complets dans le jeu, et nous ne voulons pas que 1 000 corps
rigides
flottent sur l'écran. Donc, plutôt que d'utiliser
la physique standard pour contrôler la
gravité de nos micros, nous voulons simplement un script simple lequel nous
allons simplement la
faire entrer dans le centre du
joueur Et ne vous occupez pas du tout de deux D à
carrosserie rigide. Il s'agit donc essentiellement d'une optimisation des
performances. Nous n'avons pas besoin d'une physique complète
pour chacun de nos articles de ramassage. Ils existent juste pour être
récupérés par le joueur. Il est donc parfaitement normal de les aspirer
directement dans le joueur parfaitement normal de les aspirer
directement Je vais donc cliquer avec le bouton droit
sur Gravity Area two D et nous allons joindre un script. Bien sûr, j'appellerai
cette zone de gravité deux D. Créons
ce nom de classe. Bien sûr,
zone de gravité deux D. Bien sûr, lorsqu'un objet
se trouve dans la zone, nous voulons le suivre et lui appliquer
un mouvement
constant,
en faisant passer un
autre nœud deux D à travers l'écran vers le
point central de cette zone deux D, la zone de gravité deux D. Donc,
prenons une variable locale Je vais l'appeler des cibles, et ce sera un tableau
de nœuds deux. D. C'est bien. Lorsque la fonction est prête, nous
voulons nous connecter au signal de cette zone deux D.
Nous allons donc dire zone saisie par point, soulignement sur la zone saisie Nous nous connecterons également à
la zone de sortie de zone
sortie , point de connexion
sur zone sortie Nous devons créer
ces fonctions dès maintenant. Fonction de soulignement
sur la zone saisie, ce qui nous donnera
la zone deux D comme paramètre Donc, zone P, zone deux D, nous essayons le vide ici. OK, alors qu'allons-nous
faire de cette zone ? Nous allons le déplacer vers le point central de
notre zone de gravité deux
D. Cela
fonctionnera parfaitement avec le
capteur, car les zones de collecte se fonctionnera parfaitement avec le
capteur, car les zones de collecte trouvent à
leur origine dans
la zone deux D. Donc, tout ce qui se
trouve en dessous sera automatiquement déplacé vers le centre. Nous avons donc besoin
qu'il ait ce type de configuration. Dans le cas contraire, vous
aurez besoin d'une référence au nœud parent de la scène. Quelle que soit la base de votre scène de capture, c'est
plutôt
l'objet ou le nœud qui doit se déplacer. Soyez donc conscient de cela.
Comme nous effectuons tous les micros de cette
manière
et que les micros sont
exclusifs à la couche 5, cela fonctionnera parfaitement tel quel Si vous voulez être encore plus prudent
et vous limiter
aux seuls scripts de capture,
vous pouvez bien sûr vérifier si la zone P
est de type pick-up two D. Cela ne semble pas être
nécessaire comme c'est le cas actuellement, mais il faut
en être conscient. Je vais donc simplement faire
un petit commentaire à propos de ce que je viens de dire. D'accord, et puisque la
zone P capte comme ça. Je vais bien travailler tel quel. Je dirais donc que les cibles
parsèment un stylo, la zone P. N'oubliez pas que la zone P, la zone deux
D est de type nœud deux D, donc cela fonctionne bien ici. Inutile d'être
plus
précis car nous n'avons besoin d'accéder qu' aux
deux fonctions D du nœud. Donc, sur la zone sortie, fonction, soulignement sur la zone La zone P, zone deux D, renvoie la valeur vide, puis
nous allons dire que les cibles effacent la zone P. Maintenant, pour ce qui est de
la fonction d'effacement, si l'objet que vous
essayez
d'effacer du tableau n'
existe pas dans le tableau,
cela ne fera rien. S'il efface,
il le supprimera. Il n'est donc
pas nécessaire de vérifier s'il est déjà
dans le tableau. Parce que s'il n'
existe pas dans le tableau, cela
ne fera déjà rien. Il n'est donc pas
nécessaire de vérifier. C'est vrai. Ensuite, nous avons besoin
d'un processus physique. Supposons donc que la fonction
souligne le processus physique, et que pour une
cible parmi les cibles, nous voulons la traduire sur
l'écran
vers le point de la zone de
gravité centrale Nous avons besoin d'une vitesse au sommet exporter loin. La
vitesse de gravité est un flotteur. Si je me souviens bien, cela
sera exprimé en pixels par seconde. Je vais donc essayer quelque chose comme 50.0. Ensuite, nous devons
calculer la direction entre la cible et le point central de notre zone de
gravité. présent, la direction sera égale
à la position globale du
point cible, à la
direction du point deux, à la position globale. OK ? Ensuite, il nous suffit
de calculer le montant de notre déménagement. Donc, var move sera égal
à la direction multipliée par la gravité, la
vitesse, par le delta. Puisque nous utilisons la traduction, nous devons en tenir
compte directement ici pour le vecteur de déplacement final. Nous pouvons dire qu'il s'agit
d'un facteur deux D, si cela est plus clair. Ensuite, nous voulons
prendre la cible et la faire passer sur l'
écran en fonction du décalage du mouvement. Il s'agit essentiellement de notre script de
gravité. Je pense que la dernière chose dont
nous avons besoin est d'ajouter une forme de collision à
notre zone de gravité. Cliquez donc avec le bouton droit sur la zone de
gravité jusqu'à D, ajoutez une forme de collision à
D. Passez en haut à droite, une nouvelle forme de cercle
et agrandissez-la pour obtenir
la zone où la gravité sera
réellement
appliquée
vers le centre. OK, donc je peux jouer, et nous allons entrer ici
et vous pourrez voir que nos objets sont
aspirés vers le centre Donc, à l'heure actuelle, la
gravité est linéaire. Nous pouvons lui
donner une courbe de telle sorte que plus il
se rapproche du point central, plus il anime rapidement cette translation
vers le centre Donc, si nous passons à la zone de gravité
deux D, et à l'intérieur d'ici, je dirais à l'exportation, disons courbe d'effet ou courbe de
type courbe. Nous allons enregistrer cela. Ensuite, dans l'inspecteur,
modifions cette
courbe d'effet, nouvelle courbe. Ensuite, nous voulons que X ou le domaine
maximum ici soit essentiellement la
distance par rapport au centre. Ensuite, la valeur ici sera le pourcentage de
la vitesse maximale que vous souhaitez
appliquer en fonction de cette distance. Supposons donc que
la distance soit 100 ici pour
le domaine maximum. Plus on se rapproche, plus
on veut se rapprocher de 1,0. Prenons donc le premier point
et déplaçons-le ici à 1.0. Je vais zoomer ici
pour que vous puissiez voir. Ensuite, je vais simplement ajouter un
deuxième point comme celui-ci. OK. Donc, s'il atteint
une distance de 100,
il sera très
faible à ce moment-là. Et cela serait mesuré
en pixels, bien sûr. Donc, avec cette courbe, nous voulons revenir
ici et ajuster le mouvement en échantillonnant cette courbe. Trouvons donc le modificateur de courbe, et cela sera égal
à l'échantillon de points de courbe d'effet. Et nous devons
échantillonner en fonction de la distance entre notre cible et le centre de
gravité. La distance du vara
sera donc la position globale du point cible, la distance du
point par rapport à la position
globale OK, donc nous
passons simplement cette distance dans l'échantillonnage du
modificateur de courbe, puis nous prenons
le modificateur de courbe et nous le multiplions par le Delta. Il s'agira donc d'une valeur
comprise entre 0,0 et un. Et cela devrait affecter la
gravité en fonction de cette courbe. Plus il est proche,
plus il est fort. Et ici, ça s'affaiblit. N'hésitez pas à personnaliser
une courbe si vous avez
besoin de modifier un peu la forme de l'
animation. OK, donc je vais appuyer sur Play ici et nous allons en quelque sorte
tester ça. C'est un peu difficile
à voir parce que j'ai
peut-être fait la
distance maximale ici trop grande. Donc, ce que vous pouvez faire,
c'est vérifier la forme de collision et
voir quel est son rayon. Donc 27 pixels. Nous créons donc une
courbe allant jusqu'à 100 pixels, mais le maximum de ce rayon
est de 54 pixels, 27 ici. Oh, vraiment, non, non, non, 27 pixels parce que c'est le centre par
rapport au point extérieur, non ? Pas le diamètre, bien sûr. Oui, je pourrais prendre le rayon ici et
le fixer à 30 pixels, un beau nombre pair, puis nous passerons à
la zone de gravité. Ensuite, prenons
le point de la courbe ici et déplaçons-le également sur
30 pixels. OK, donc ce sera un peu comme notre distance maximale sur
cette forme ici. Il n'est pas nécessaire que
ce soit parfaitement 30. exemple, à peu près ici pour qu'on puisse voir un peu mieux la forme. OK, maintenant si je clique sur Play
et que nous passons ici, ça devrait être un peu
plus précis. OK, maintenant vous pouvez
voir la gravité vraiment à
mesure qu'elle se rapproche, donc elle est lente à l'
extérieur, presque trop lente Je pourrais donc l'augmenter légèrement, et vous pourrez ajuster la forme de
la courbe en tirant sur
les poignées, ce que vous devez faire.
Tu vois, j'aime bien ça. Nous allons appuyer une
fois de plus sur Play juste pour tester. Et oui, je pense que c'est
bon pour la gravité. Alors voilà.
Diminution de la gravité. Plus votre objet se rapproche du
champ de jeu, plus il se déplace rapidement, et il absorbera tous les objets
ramassés ou, en fait les zones que vous marquez sur la couche de masque ici Dans ce cas, pour le
moment, ce ne sont que des camionnettes, mais vous pourriez le faire
avec d'autres zones
37. P36 Créer une interface utilisateur avec les barres de progression HP et EXP: Bien que le
combat principal fonctionne dans le jeu, nous pouvons récupérer des objets
tels que des points d'EXP, mais nous n'avons aucune indication
de ce qui se passe dans l'interface utilisateur Nous ne pouvons pas voir le niveau de notre
personnage, nos PV, notre barre d'EXP. Nous allons donc
commencer par travailler sur la barre d'
EXP et ajouter
un compteur de niveau,
disons, en haut à gauche de l'écran Et nous allons le faire
sur un nouveau nœud. Je vais donc aller jusqu'à
la section centrale,
ajouter une nouvelle scène. Et nous voulons que ce
soit une interface utilisateur. Je vais donc appeler
cette interface utilisateur du joueur. Enregistrons-le dans le
dossier de l'interface utilisateur. Et gardez-le là-dedans. Ensuite, je vais cliquer
sur l'interface utilisateur du joueur, et nous allons ajouter,
disons, un conteneur de panneaux. Ce sera donc essentiellement
l'arrière-plan de l'interface utilisateur principale de
notre joueur. Maintenant, vous dites que l'interface utilisateur du joueur s'étend sur
tout l'écran par défaut. Nous voulons donc passer à la
mise en page sur la droite
et modifier le préréglage des ancres de
Full Wrecked à haut à gauche OK, maintenant, ça va
réduire la taille ici à pratiquement rien. Ensuite, nous voulons dimensionner les conteneurs, étendre le
remplissage horizontal et vertical Ensuite, sous notre conteneur de panneaux, nous voulons cliquer avec le bouton droit de la souris
et ajouter un nouveau conteneur, disons, un conteneur V-box. Un conteneur VBox organise
ses enfants verticalement. Donc, si vous mettez deux éléments ici, celui qui se trouve juste
en dessous
se superposera à l'autre en
termes de présentation visuelle. Faisons donc un clic droit
sur le conteneur VBox, et maintenant je veux un conteneur HBox. Ainsi, notre conteneur HBox, le premier,
ira de gauche à droite, et il sera placé au-dessus de tout autre conteneur
HBox pour enfants Cela nous aide donc
à disposer les choses presque comme une
grille, mais pas exactement. OK, et puis en tant qu'enfant
pour le conteneur HBox, nous voulons ajouter une barre de progression de
texture afin que vous puissiez rechercher Progress
et vous la trouverez ici Cela vous permet,
en haut à droite, définir les textures de
la sous-texture, la texture supérieure et de
la texture de progression. Ainsi, au fur et à mesure que les valeurs se remplissent, elle affichera plus ou moins la texture de
progression, puis en dessous se
trouvera la texture de base, qui apparaît toujours en
arrière-plan. OK, et puis en
plus de cela, nous voulons une étiquette
à droite de celui-ci. Je vais donc cliquer avec le bouton droit sur le
conteneur HBox, ajouter une étiquette. Une étiquette de base
devrait convenir ici. Nous pourrons toujours le remplacer par
une étiquette de texte enrichi ultérieurement. OK, et maintenant pour cette barre de progression de
texture, nous voulons trouver l'
illustration de notre barre de progression. Minimisons donc tout en bas
à droite et
agrandissons le dossier artistique. Passons à l'interface graphique de Crimson Fantasy. Et je pense que c'était
sous la direction de GI Sprite ici. Donc, en haut à droite pour le dessous, je vais créer une nouvelle
texture d'atlas , puis l'étendre. Et faisons glisser GI Sprite
vers l'atlas ici. Nous pouvons donc voir l'atlas complet, style d'art gothique
plutôt cool qui s'y déroule. Et nous pouvons sélectionner ce que nous
voulons que soit notre sous-texture. La sous-texture
sera donc essentiellement notre barre où elle
sera complètement vide. Donc, si je modifie une région, je peux zoomer ici, et je la sélectionnerai,
mais ici, comme ça, cela peut être notre
sous-texture sur Fermer. Et puis, pour l'
étiquette, disons zéro sur 100 HP pour le
moment, juste à titre de maquette. Alors maintenant, il est logique de
renommer ce conteneur HBox, quelque chose comme HP Et dupliquons-le, puis je renommerai le
second en EXP display Accédez à la barre de progression de la texture. Et dans les textures, nous allons en
sélectionner une autre dans la zone d'édition. Voyons donc ce que nous
aimons ici en tant que barre d'EXP ? Nous pourrions utiliser celui-ci
de base ici, mais je pense que
cela pourrait être utile si nous pouvions
voir différents morceaux Donc, avec celui-ci, nous avons pu
voir sur sept à quel
point nous sommes sur le point
de monter de niveau Mais vous remarquerez que dès que je modifie la valeur
ici pour celui-ci, la valeur du haut est également automatiquement
mise à jour
car nous utilisons une ressource de texture d'
atlas partagée. Donc, ce que nous
devons faire ici, je vais fermer, c'est cliquer avec le bouton droit sur cette texture
, puis la rendre unique. Ainsi, lorsque vous le ferez, cette
texture sera unique. Nous devons revenir au
premier et le corriger, cliquer avec
le bouton droit de la souris, puis
rendre unique, et nous devons redonner à
celui HP sa texture HP. Ici, nous allons
sélectionner cette offre HP, et maintenant nous pouvons voir qu'il s'
agit de deux choses distinctes OK, alors maintenant, remplissons
également celui du haut. Je vais passer à la progression
ici, à la nouvelle texture de l'Atlas, puis nous pourrons charger rapidement, depuis le menu déroulant,
notre sprite graphique Maintenant, nous voulons modifier la région, et nous voulons récupérer la barre de santé
remplie ici. OK, ça va ressembler à
ça et appuyer sur Fermer. Maintenant que nous avons défini
cette texture, si vous passez, disons, à la valeur ici et que vous tapez 50, vous verrez qu'une partie de la barre de
santé est maintenant remplie. Mais vous voyez aussi qu'
avec cette configuration, cela peut être dû en partie au fait que le cœur cache
des choses, mais il ne
semble pas vraiment
refléter exactement 50 % de
votre santé totale ici alors que la valeur est de 50. Donc, pour contourner
ce problème, je changeais la valeur masculine pour qu'elle changeais la valeur masculine pour soit quelque chose comme
moins 20 pour compenser
cela vers la droite. Maintenant, vous pouvez voir qu'il y a quatre blocs de santé
visibles sur huit Cette valeur de 50 est donc beaucoup plus logique lorsque vous avez ce décalage négatif de 20. Il se peut donc que vous ayez
juste besoin de le personnaliser. Donc, évidemment, lorsque vous
caractérisez zéro santé, cela indique que zéro est la valeur qui
se trouvera ici. Mais ce qui compte vraiment,
c'est comme les 50 sur 100 ici et
les 100 sur 100 là-bas. Donc, juste pour nous assurer que nous donnons une valeur 100 pour une barre
de santé complètement remplie, et ça a l'air bien.
On peut dire 20. Nous pouvons toujours voir notre état de santé. Et même à cinq ou dix ans, eh bien, je suppose qu'à cinq ans, nous n'
avons pas nécessairement besoin de le voir. Mais comme à dix heures, on peut
encore voir un petit éclat. Je pense que c'est plutôt bien tel qu'il est
actuellement. Nous pouvons donc simplement
laisser cette valeur par défaut à 50. Et travaillons sur la texture de l'écran
EXP. Il suffit de cliquer avec le bouton droit sur
la base sous la texture ici, copier, puis de
cliquer avec le bouton droit sur la
progression vide et de la coller dedans. Ensuite, nous voulons
cliquer avec le bouton droit de la souris ici, le rendre unique et le modifier
à la valeur dont nous avons besoin. Donc, modifiez la région, et nous voulons récupérer cette
version remplie de cette barre. D'accord ? Et nous pouvons taper 50
pour la valeur à tester. OK, et ensuite nous pouvons voir que c'est à moitié rempli.
Donc c'est bon. Nous n'avons pas besoin de définir
une valeur minimale négative sur cette version de la texture. Il y a un petit
problème :
notre barre de progression
pour l'XP est rouge, tout comme celle du haut. Donc, ce que nous
voulons vraiment faire, c'est que cette partie métallique soit
teintée d'une couleur différente Donc, pour y parvenir, il faut passer
ici à la teinte de progression et remplacer par un
vert, un peu comme ça. Mais vous pouvez voir
que cela
teinte en fait toute la texture Nous voulons donc faire un
clic droit sur la texture inférieure, contrôler la copie, puis la
coller sur la texture supérieure. OK, donc maintenant, seuls les pixels qui n'existent
pas en dessous
et en dessous seront affectés par le changement de
texture progressif. Donc, quelle que soit la couleur que
vous
souhaitez voir apparaître, vous pouvez simplement la modifier en
manipulant simplement la teinte ici peut changer l'
obscurité, et c'est probablement suffisant
pour votre barre d'XP,
pour être honnête, en tant que solution la
plus simple sans utiliser de
shader ou quoi que ce soit d' Donc, si nous passons au label maintenant, nous voulons le
remplacer par EXP. Donc zéro EXP sur 100. OK, puis nous
voulons
centrer verticalement ces barres de
progression de texture. Je pense que vous pouvez sélectionner
les deux même temps si vous maintenez
la touche
Ctrl enfoncée et que vous cliquez avec le bouton
gauche de la souris
, puis que vous passez du remplissage vertical au centre de réduction Ouais D'accord. Ensuite, cela les prend
essentiellement, et tout est centré sur
les autres éléments comme cette étiquette ici sur la droite. Donc ça va faire bonne figure. Ensuite, nous
voulons simplement réduire le texte. Donc, ce que nous pourrions
vouloir faire en fait, c'est simplement aller dans l'interface utilisateur du joueur
à la racine et changer son thème si nous
chargeons rapidement notre thème de jeu depuis le
menu déroulant. Ensuite, il aura
cette police pixel art, qui est déjà par défaut,
un peu plus petite. OK, dernière chose pour
terminer notre maquette, nous voulons probablement un conteneur de
marge aussi visible que le conteneur du
panneau Cliquez donc avec le bouton droit sur les racines, interface utilisateur
du joueur, ajoutez un conteneur de
marge. Recherchez donc la marge, puis placez le conteneur du panneau en dessous. Maintenant, dans le conteneur de
marges, vous pouvez accéder aux remplacements de thèmes
sur les bonnes constantes, et vous pouvez personnaliser une marge Je vais donc opter pour cinq pour
les marges dans toutes les directions. OK, un peu comme ça. C'est donc probablement une marge
suffisante, mais je me suis trompée
de commande. Le conteneur du panneau passe
sous l'interface utilisateur du joueur, puis le conteneur de marge passe sous le conteneur du panneau, puis le
conteneur VBox passe en dessous OK, donc le fait est que nous
voulons que le conteneur du panneau étire
l'image d'arrière-plan jusqu'aux bords, puis nous voulons que tout le reste soit
contenu dedans. C'est pourquoi le conteneur de
marge doit
se trouver à l'intérieur du conteneur de
panneaux, afin que le
conteneur de panneaux puisse
s'étendre plus loin que le conteneur de
marge. C'est juste une question de
commande. Donc ça va être plutôt décent. Mettons-le dans notre monde. Donc, sur notre scène mondiale, créons une
couche de canevas sous laquelle placer l'interface utilisateur. Cliquez donc avec le bouton droit sur Ajouter un nœud de couche
Canvas maintenant. OK, et la raison pour laquelle
vous auriez une couche de canevas ici est qu'elle
vous donne une zone
de rendu séparée de tout le
reste de la scène. L'interface utilisateur est donc rendue de manière
totalement indépendante du monde du jeu Toti Et ce serait important
si vous avez, par exemple, lampes de jeu
Toti, et que vous ne voulez pas que cela
affecte l'interface utilisateur Vous voulez qu'ils soient
rendus séparément. Les lumières du
monde sont donc différentes de celles de l'interface utilisateur, ce
serait une chose distincte. Et vous les
gérez simplement séparément. Je vais donc maintenant
ajouter l'interface utilisateur du joueur ici, donc filtrez vos fichiers, recherchez l'interface utilisateur Underscore du joueur Si c'est le nom que vous avez
donné, Dragon dépose la scène
dans la couche Canvas, et elle apparaîtra juste
là, en haut à gauche de notre interface utilisateur Avant de lancer Play, assurez-vous que interface utilisateur
du joueur se trouve sous
la couche Canvas. Ce sera important
pour qu'il ne s'affiche pas également dans le monde du jeu, mais plutôt dans le cadre
de l'écran. C'est donc là en haut à gauche. C'est en fait assez petit. C'est plutôt hilarant,
pour être honnête. Nous pouvons soit améliorer l'interface utilisateur ici, soit l'
agrandir dans la scène de base Peut-être que ce que je
veux juste faire, c'est prendre la couche de toile ici et
nous allons simplement la transformer, augmenter l'échelle
à environ quatre X. Vous pouvez effectuer un zoom arrière.
Cherchez la boîte doublée de violet. peut
que vous deviez cacher
le monde terrestre pour
qu'il puisse vraiment le voir. OK, voilà. Nous avons donc
la boîte violette ici. Il s'agit de la zone portuaire avec vue complète. Donc, votre interface utilisateur ici est
en quelque sorte adaptée à cela. Donc, à une échelle de quatre fois, je pense que cela fonctionne plutôt bien. Maintenant, je vais à nouveau montrer la terre
et l'herbe. Nous allons appuyer sur Play. Et voyons si l'interface utilisateur est
bien là en haut à gauche. Et je pense que cette taille
est en fait assez correcte. J'aime beaucoup ça. Nous allons nous y prendre pour le moment,
puis nous travaillerons à le
scénariser.
38. P37 Mise en œuvre d'un système d'interface utilisateur basé sur des statistiques avec des signaux: Donc, pour que cette interface utilisateur fonctionne réellement, nous devons la connecter
à des signaux qui
seront liés au bloc Sp de notre
personnage. Cela signifie donc que nous avons besoin d'un signal
modifié par EXP ou d'un signal modifié par
HP Nous voulons
nous assurer de le mettre à jour. Nous avons également un autre problème
mineur
, à savoir que cette interface utilisateur
est essentiellement très grande sur la
zone d'écran où elle se trouve actuellement. Je voudrais donc ajouter rapidement
un script dans lequel je peux simplement faire en sorte que la couche Canvas affiche
automatiquement au démarrage du jeu, mais nous pouvons éventuellement simplement désactiver lorsque nous sommes éditeurs Je ne veux
donc pas toujours avoir à activer
manuellement la visibilité. Ce que je vais faire, c'est
cliquer avec le bouton droit sur la couche Canvas
ici, joindre un script. Ce serait donc juste
Canvaslayer point GD. Enregistrons-le dans le dossier Bin de l'
interface utilisateur. Créez. Et je dirais simplement que la fonction de
soulignement est prête. Cela va renvoyer le résultat nul, puis nous dirons
visible, égal à vrai. Et c'est tout ce dont
nous avons besoin pour cela. Nous pouvons maintenant le masquer
lorsque nous
regardons notre vue cartographique
ici et que nous appuyons sur Play. Et il devrait toujours apparaître
dès le début du jeu. Maintenant, nous pouvons le
masquer sur notre carte ici, appuyer sur Jouer, et il sera toujours affiché
dès le début du jeu. Donc, dans le
coin supérieur gauche, c'est là. Cela nous sera donc utile
pendant le montage. Une autre façon de gérer
cela serait
d'avoir une scène complètement séparée pour votre interface utilisateur Canvas lorsque
vous la modifiez, puis votre scène du monde,
et vous
les combinez dans
une scène parent. Si vous chargez réellement le monde du jeu,
ce serait bien. Et ce serait peut-être
la solution à long terme. Mais c'est juste une solution vraiment
sympa, rapide et facile. Travaillons donc sur la connexion notre interface utilisateur
aux statistiques des joueurs. Passons donc à la scène
de l'interface utilisateur du joueur. Je vais cliquer avec le bouton droit sur l'interface utilisateur du joueur. Et joignez un script. Le playi point gD
peut donc étendre le contrôle
et l'intérieur d'ici Nous allons juste aborder une
exportation R et nous
parlerons du contexte du
joueur. Puisque nous avons déjà
créé cette ressource, elle est très facile à utiliser. Et l'inspecteur,
en haut à droite, charge rapidement le contexte du
joueur. Et si vous vous souvenez que,
plus tôt dans
le cours, le joueur s'y
installera automatiquement Nous pouvons
donc simplement saisir les statistiques du joueur en points
contextuels, et boum, nous avons une
référence aux statistiques. Nous avons juste besoin de signaux pour
mettre à jour l'écran HP
et l'écran EXP D'accord, nous pouvons donc
consulter les statistiques. Voyons voir, Stat
Controller point GD. Si nous nous lançons dans ce script,
nous avons une vie qui change. Créons des
signaux indiquant que HP a changé, que le nombre maximum de HP a changé et que
l'expérience a changé. OK, donc le signal Mx HP a changé. Et vous pouvez voir qu'il s'agit
d'un grand nombre de statistiques que nous
allons modifier avec
un type très similaire. Nous souhaiterons peut-être transmettre l'
objet en cours de modification, l'ancienne valeur, la nouvelle valeur et le montant de la modification. Nous pouvons donc créer
une classe pour encapsuler toutes nos statistiques
qui vont changer Et c'est un système de jeu très
basé sur les statistiques, semblable à un
survivant, d'
accord, parce que vous pourriez avoir une réduction du temps de recharge, vitesse de
déplacement des joueurs, PV, de la puissance d'attaque, tout
ce genre de choses supplémentaires. Et ce sont toutes des statistiques qui
peuvent être représentées à l'intérieur d'un objet et que nous
pouvons transmettre à un événement. C'est également beaucoup plus facile
si vous n'avez qu'
un seul paramètre pour envoyer ce paramètre
et qu'ils le
reçoivent ensuite en une seule pièce
plutôt que trois ou quatre. Donc, pour montrer ce que je
veux dire, créons un nouveau script dans notre système de fichiers. Je vais donc tout
réduire, puis nous passerons aux objets, disons, parce que les
objets ont des statistiques. Je vais donc cliquer avec le bouton droit de la souris
pour créer un nouveau script. Ce seront donc des données qui
seront envoyées à un signal chaque fois qu'
une statistique changera. Un nom assez clair
serait donc le point de données modifié par stat gD. ce que nous créons. OK, et
ouvrons ce script. Donc, Stat a modifié les données. Nom de la classe, données modifiées par les statistiques. Et cela va en fait s'étendre
à partir du nombre de références, qui est un objet qui, lorsqu'
il n'est plus référencé, sera automatiquement
supprimé du jeu. Donc des références. Et au lieu d'étendre non, cela va en fait
s'étendre à partir de ref counted, qui est un objet Gadot qui garde une trace du nombre d'
objets qui le référencent Et lorsqu'aucun objet n'y fait
référence, il
se met en file d'attente pour être supprimé, vous n'avez
donc pas besoin de le libérer
manuellement. Il sera simplement récupéré
et supprimé par le moteur. ailleurs, c'
est également la valeur par défaut lorsque vous n'
étendez à partir d'aucune classe, car lorsque vous n'
étendez à partir d'aucune classe,
c'est également la
classe par défaut. OK, donc notre statistique a changé les données, nous voulons lui donner une fonction d'
initialisation, afin que la fonction souligne un NIT Et lorsque nous créons
un NIT pour un objet, nous pouvons transmettre tous les
paramètres dont nous avons besoin. Je vais donc dire objet P,
l'objet que nous
affectons avec notre changement de statistiques. Donc pas de TD, la valeur P Nu,
qui, je suppose, sera un
entier pour le moment. Il peut y avoir une
statistique flottante, auquel cas, vous pouvez remplacer ce
type par une variante pour prendre en charge
à la fois les
nombres entiers et les nombres flottants. Mais je ne pense pas qu'à l'heure actuelle,
il y aura vraiment flotteurs dans le jeu pour des statistiques telles que
l'
expérience et les PV Nous en avons fait un entier
concret, ce qui est probablement
préférable de toute façon. Donc, la nouvelle valeur que
nous transmettons, puis nous voulons l'ancienne valeur. Et lorsque nous avons la
nouvelle et l'ancienne valeur, nous pouvons
calculer automatiquement le changement. Ajoutons donc les
propriétés d'état de cet objet. Je dirais que l'objet
var sera un nœud deux D, le var new sera un entier. Le var old sera un entier. Le changement de variable est
également un entier. Ainsi, lorsque nous initialisons
la fonction, nous prenons simplement les
paramètres et nous
définissons les variables locales
sur ces valeurs L'objet sera donc égal à l'objet P. Un nouveau
sera égal à P Nu, un
ancien sera
égal à P ancien. Maintenant que nous avons le
nouvel et l'ancien ensemble, notre changement sera égal
au nouveau moins l'ancien,
je pense que c'est le cas à moins que
je ne fasse l'inverse. OK, donc si l'ancienne valeur est
30 et la nouvelle valeur est 20, alors le changement sera
de moins dix, c'est
ce que nous voulons ici. Donc oui, le neuf moins l'ancien. Donc, essentiellement, ce que nous
faisons ici, c'est transmettre ces quatre paramètres au signal sous
la forme d'un objet de données
modifié St. Ensuite, sur le récepteur de signal,
la fonction de rappel, nous pouvons accéder
à tout ce qui se trouve dans St changé thêta simplement en faisant St
changed data point object, point new point point CAGE Et nous n'avons peut-être pas
besoin de tout cela, mais nous l'avons accessible. De plus, si jamais nous ajoutons autre
chose ici, comme var Cookie, qui est une texture vraie
ou quelque chose comme ça, nous n'avons pas besoin de l'ajouter
en tant que paramètre supplémentaire. Il est contenu dans
cette classe. Vous pouvez donc modifier cet objet sans avoir à modifier
vos rappels ou le paramètre du signal
d'envoi,
car vous n'
envoyez
qu' vos rappels ou le paramètre du signal
d'envoi un seul objet J'espère que cela a
du sens. Il est plus facile de le modifier au fur et à mesure. Quoi qu'il en soit, nos
statistiques ont changé de données. Donc, si nous revenons à notre script de contrôleur de
statistiques, nous pouvons
maintenant créer nos signaux. Donc, Max HP change
, ce qui signifie que les données de la
statistique seront modifiées. OK, puis nous faisons signal pour l'autre signal,
HP a changé les données, les statistiques
ont changé données, l'
expérience du signal a changé. Data Stat a modifié les données. Maintenant, si je
mettrais un signal pour chacune d'
entre elles c'est parce que
dans le script de réception, nous pouvons choisir les statistiques qui
nous intéressent réellement. Ainsi, par exemple,
l'écran
EXP ici ne se soucie que de l'évolution de
l'expérience Nous allons donc uniquement nous
connecter au signal de
changement d'expérience et peut-être aussi à un signal de
changement de niveau pour mettre à jour l'étiquette du niveau s'il se trouve
dans la même zone d'affichage. Nous avons donc ces signaux.
Il suffit de les émettre. Donc, ce que je faisais
auparavant avec, par exemple, le setter HP ici, si vous voulez simplement
émettre la valeur modifiée, je pense que c'est une utilisation acceptable d' un ensemble. Nous émettons donc que la valeur a changé et en
faisons simplement une propriété
observable Je vais donc dire ici que
chaque fois que nous réglons le HP, nous disons simplement que HP
a changé point am HP. Maintenant, si nous passons à 100
HP alors que c'est déjà
100 encore et encore, nous devrions peut-être ignorer
cette émission de signal, afin de pouvoir dire si HP
est égal à la valeur, puis nous revenons simplement parce que nous n'
avons pas besoin de
mettre à jour en direct ici. Nous n'avons pas besoin de mettre à jour le HP car il a la même valeur. Donc, en suivant ce schéma, je vais essentiellement faire
la même chose avec MAX HP. Nous allons donc faire du colon.
Ligne suivante, définissez la valeur. Si Mx HP est égal à
la valeur, nous retournons. Sinon, Max HP est égal à la valeur, et nous émettons Max HP modifié. Oh, mais ici, j'ai oublié qu'il ne s'agit pas
simplement de la valeur at HP ici, mais que nous devons également créer l'objet de données modifié par les statistiques. Les données sont égales à stat
changed data point new. Et nous allons transmettre
cette référence d' objet ici
pour le contrôleur de statistiques. Donc, objectez, puis nous faisons la nouvelle valeur de HP et l'ancienne valeur, que
nous devons d'abord obtenir. Donc, avant de définir la nouvelle valeur
sur HP, juste avant cela, nous faisons var Old égale HP, et maintenant nous mettons l'ancienne valeur ici, et nous transmettons les données à
l'émission du signal. HP a donc modifié le MMI à points avec les données, et c'est
tout ce que nous avons à faire Maintenant,
ces quatre propriétés
de données seront intégrées à cet objet
au lieu d'une seule, mais cela semble toujours
très propre car nous n'envoyons qu'un seul objet. OK, maintenant dans MX HP, nous voulons le refaire. Nous allons donc dire que var
Old est égal à Max HP, puis nous allons faire far data equal stat
changed data point u. Il en va de même pour
l'objet, le pH max
et l'ancien, puis nous émettons le
signal HP changed avec les données,
et c'est tout l'objet, le pH max
et l'ancien, puis nous émettons le
signal HP changed . OK, donc en suivant
le même schéma, encore
une fois, ici en termes d'expérience, valeur définie
par deux points,
nous pouvons toujours nous prémunir contre le fait que l'expérience soit
la même valeur, juste au cas où. Donc, si l'expérience est égale à
la valeur, nous revenons. Sinon, nous obtenons que l'
ancien est égal à l'expérience, puis que l'expérience
est égale à la valeur. Et puis les données Vara sont
égales à stat changed data point w. Object experience old, et nous émettons une expérience
modifiée avec les données. D'accord ? Et je pourrais ajouter ceci. Oh, oui, d'accord, j'ai oublié le
D en haut pour le signal. Contrôlez STA, et
ça devrait être une bonne chose.
39. P38 Affichages dynamiques HP et EXP pour l'interface utilisateur des joueurs: Nous avons donc la configuration des signaux, notre contexte
ici et l'interface utilisateur du joueur, qui nous permettra de
récupérer ces signaux
depuis le bloc de statistiques. Mais nous n'avons pas vraiment besoin de le faire directement
dans l'interface utilisateur du joueur. Nous devons le faire sur l'
écran HP et sur l'écran EXP. Je veux donc créer des scripts pour l'écran HP et l'écran
EXP ici. Je vais donc cliquer avec le bouton droit sur
l'écran HP, joindre un script, et nous pouvons le mettre dans l'interface utilisateur, donc HP Display Point GD Génial. Nous pouvons simplement faire en sorte que
cela s'étende à partir du conteneur. Peu nous importe de
quel type de conteneur il s'
agit , car vous pouvez créer un
affichage en utilisant d'autres types. Peut-être que vous affichez votre HB verticalement
plutôt qu'horizontalement Vous pouvez donc utiliser une classe de base
différente, comme container
plutôt que HBox container, et vous pouvez toujours créer le nœud réel dans le conteneur
HBox Donc, le simple fait de garder les choses
flexibles est l'idée ici. Et je vais dire le
nom de la classe HP Display. OK, donc sur notre écran HP, nous avons besoin d'une référence aux statistiques de la manette du joueur. Nous pourrions exporter le contexte du
joueur, puis obtenir
directement ici
pour chacun des écrans. Cependant, si nous configurons
les choses comme ça, pour chacun des composants de votre
sous-interface utilisateur, si chacun d'eux possède une
propriété d'exportation que vous devez définir, il devient très
difficile de le faire glisser dans la scène pour le réutiliser car
vous devez ensuite, par exemple, cliquer dessus avec le bouton
droit de la souris, le rendre
modifiable et vous assurer attribuer toutes les propriétés
individuelles,
comme le contexte du joueur À chaque nœud de sous-interface utilisateur directement. Une autre option, qui
pourrait être préférable, est de demander à l'interface utilisateur root injecter
le contexte du joueur ou, ce qui en découle,
le contrôleur de statistiques dans
chacun de ses nœuds de sous-interface utilisateur Ensuite, il vous suffit de vous
assurer que l'interface utilisateur du lecteur
connaît ses sous-composants, tels que l'écran HP
et l'écran EXP Mais ensuite, vous laissez l'
interface utilisateur du joueur s'occuper du gros du travail. Donc, dans le contexte de notre écran HP, signifierait que nous aurions besoin de notre contrôleur de statistiques
local. Donc, si notre underscore
Stats Controller. Nous le fabriquons donc localement, non ? Ensuite, nous allons créer une
fonction de réglage afin de pouvoir configurer le contrôleur de statistiques
depuis l'interface utilisateur du joueur Supposons que la fonction définit les statistiques, et cela nécessitera un contrôleur de statistiques P
underscore Quel est le type de contrôleur de
statistiques. Je vais retourner nul. J'ai mis le trait de soulignement P pour paramètre afin qu'
il soit très clair que cette variable est un
paramètre de la fonction Si vous avez un autre contrôleur de
statistiques ici, il n'y aura aucune confusion entre notre référence locale
au contrôleur de statistiques et
notre étendue de fonctions, contrôleur de statistiques
P underscore Nous allons donc utiliser cette fonction de définition des
statistiques pour ce faire. Les statistiques de soulignement
sont donc égales au contrôleur de
statistiques de soulignement P. OK, nous avons donc notre méthode de
définition des statistiques. Il attribue les
statistiques aux statistiques, qui sont privées ici à
cause du trait de soulignement Survolez, il s'agit d'un script GD, il n'est
donc pas vraiment privé Il est simplement indiqué que vous
ne devez pas y accéder en
dehors de la classe, mais vous pouvez toujours le faire techniquement. Nous avons donc notre outil de réglage des
statistiques ici. Nous voulons nous
connecter au signal maintenant. Voici donc l'écran HP. Et je voudrais dire les statistiques
HP hanged point Connect, et nous dirons que HP a changé Et nous pouvons également dire
underscore stats mxhpChanged Et cela ne peut être qu'un
soulignement lorsque le nombre maximum de HP a été modifié. Donc, techniquement, les deux signaux
ont les mêmes paramètres, nous pourrions
donc utiliser une seule fonction de
rappel si nous le voulions Mais pour rester flexible, il y aurait
peut-être du code que nous voudrions
faire différemment, selon qu'il s'agit de
MaxHP ou que le HP a changé.
Je vais juste avoir deux rappels
ici, Je vais juste avoir deux rappels donc le soulignement de la fonction Sur Max HP modifié, ce qui va
avoir les données P, les statistiques ont changé
les données,
ce renversement est annulé Et ce que nous voulons
faire, c'est actualiser LUI. Je vais donc simplement créer une fonction d'
actualisation ici, puis nous ferons de même pour
les modifications apportées à HP. Nous pouvons donc simplement le copier ici, puis
supprimer le bit Max. Supprimez donc quatre fois.
OK, c'est ça. Nous avons maintenant besoin d'une fonction de rafraîchissement. Nous allons donc dire rafraîchissement de la fonction. Et que voulons-nous
faire sur l'écran HP ? Chaque fois que le HP change ? Nous voulons mettre à jour la valeur du curseur et mettre
à jour l'étiquette de texte Nous voulons donc
obtenir le pourcentage pourcentage de
santé, et cela sera un
flottant égal à, disons, le point PV de
soulignement, divisé par le point PV de soulignement, point de
PV maximum OK, alors avec le
pourcentage de santé, nous pouvons l'attribuer à la barre de progression de la
texture. Vous pouvez donc voir maintenant que nous avons besoin d'une référence à la barre de
texture ci-dessous. Donc, la seule fois où nous
allons configurer la référence à
la barre de texture, c'est
comme la première fois que
nous créons cette scène d'affichage
HP. Peut-être que nous l'enregistrons dans une scène
séparée de notre projet, et que la scène principale que
nous avons réellement mise dans le monde est la scène de l'interface utilisateur du
joueur. Mais je pense qu'il est
parfaitement raisonnable d'exporter la
barre de texture et l'étiquette ici. Il existe également d'autres moyens de
les récupérer. Mais c'est la méthode que je vais utiliser. Je dirais donc qu'à l'
export, var progress est une barre de progression de texture. Et puis, à l'export,
var label est un label. Ainsi, lors de l'actualisation, nous pouvons prendre la progression
et prendre l'étiquette,
et nous dirons que la
valeur du point de progression est égale au pourcentage de santé. Alors laisse-moi voir. Cela devrait
être sur une échelle de 0 à 100 Et ce calcul va
en fait
vous donner un 0,021 0,0. Nous voulons donc multiplier
ce chiffre par 100 pour obtenir un pourcentage réel multiplié par 100. Et je ne suis pas sûr de l'
ordre des opérations ici. Je vais donc simplement emballer
cette partie pour m'assurer qu'elle
s' exécute avant
cela avec certitude OK, puis la
valeur de progression sera
notre pourcentage de santé de
0 à 100 sous forme de flottant Ensuite, nous devons définir la valeur
du texte sur l'étiquette. Le texte du point d'étiquette sera donc égal à la chaîne. Nous pourrions simplement dire entre
guillemets HP, pourcentages, avec une
barre oblique, pourcentages, puis nous remplaçons
ces valeurs par un signe de pourcentage et nous les transmettons
à
un Les valeurs que nous allons
utiliser
seront donc le HP actuel et le MX HP. En d'autres termes, les statistiques de
soulignement marquent les PV
et les statistiques de soulignement marquent
les PV MAX. Donc, si vous souhaitez que cela
soit personnalisable, nous pouvons le supprimer
avec Control X et le remplacer par un modèle de texte de santé. Ensuite, ici en
haut, nous pourrions dire que dans la barre
d'exportation, le modèle
de texte Health sera égal à, puis Control V le collez. Ces pourcentages sont toujours utilisés
comme symboles à remplacer. Nous continuons donc à utiliser
le modèle de texte sur la santé, puis le tableau des deux valeurs dans
l'ordre, soulignement
du point HP,
puis le point de soulignement du point de
statistiques PV maximum. OK, cela mettra
à jour la barre, et nous mettrons à jour le texte. Nous voulons donc également l'appeler
chaque fois que nous définissons les statistiques. Je vais donc vous conseiller de rafraîchir ici pour nous assurer qu'
après avoir défini les statistiques, nous mettrons également à jour
ce texte immédiatement. Nous avons besoin de deux points
pour terminer cette fonction, et c'est plutôt bien. Maintenant, sur le
côté droit du script, nous devons attribuer la
progression et l'étiquette. Assignez donc la
barre de progression de la texture et attribuez l'étiquette. Assurez-vous de sélectionner ceux
situés sous la barre HP. Maintenant, ce sera
une bonne chose pour l'écran HP. Nous voulons presque le même
script pour l'affichage EXP, mais il y a
quelques différences Je vais donc contrôler A, Control C pour
tout copier dans ce script. Nous allons passer à
l'écran EXP. Cliquez avec le bouton droit, joignez le script. Exp display point gD
me semble bien. Nous allons cependant changer le type d'héritage
ici en conteneur, puis simplement tout sélectionner et le remplacer par un
Control V qui le colle dedans Nous devons maintenant changer le nom de la
classe en affichage EXP. Notre modèle HealthText. Nous allons sélectionner
ce Control R pour remplacer par un modèle de texte
EXP Dans ce modèle de texte sur la santé,
sélectionnez le texte. Vous pouvez double-cliquer dessus
pour sélectionner le tout. Ensuite, faites Control R. Ici, nous
allons remplacer le modèle de texte
Health par un modèle de texte EXP, tout
remplacer, puis nous
voulons remplacer ce HP
ici par EXP comme
modèle tout
remplacer, puis nous
voulons remplacer ce HP par défaut La dernière chose à faire
est de modifier la connexion du signal pour faire
l'
expérience d'un changement. Nous pouvons complètement nous débarrasser
de la valeur maximale modifiée, puis remplacer le nom de cette
fonction ici même sur HP Change afin que vous puissiez la
sélectionner, Control R, puis ici, nous
voulons le remplacer sur EXP modifiée ou expérience modifiée, selon ce
qui vous Nous allons le remplacer.
Débarrassez-vous des données modifiées sur
Max HP ici
pour terminer cette partie. Ne mettons pas encore à jour la barre de
progression, je vais
donc les commenter. Pour l'instant, nous allons
zoomer ici et je vais remplacer le modèle de texte d'expérience par l'expérience à
points soulignés, et je vais également replacer l'expérience
ici Donc ça va dire un sur
un ou deux sur deux, mais au moins on peut
le voir fonctionner. Maintenant, en haut à droite,
assurez-vous d'attribuer la progression. Vers la barre de progression de la texture, de l'étiquette vers l'étiquette. Ensuite, nous avons juste besoin de l'
écran HP et de l'écran EXP pour appeler leur
fonction de réglage des statistiques depuis l'interface utilisateur du joueur Donc, dans le script de l'interface utilisateur du
lecteur, passons à l'affichage ExportVRHP
de type HP à l'affichage Export var EXP
de type Et puis la fonction de
soulignement est prête, nous allons appeler hp display point set Stats pour mettre en
contexte les statistiques point play point point, et nous devons l'obtenir
deux fois pour pouvoir même dire var stats of stat Controller, puis nous le définirons comme
égal à ce bit Donc je vais couper
ça, aller ici, faire signe
égal, le coller dedans. Nous avons donc défini les statistiques sur les statistiques. Nous faisons la même chose
avec EXP Display
XP Display Dot Set Stats Ensuite, nous faisons des statistiques. La dernière chose dont nous avons besoin est d'
attribuer l'écran HP l'écran EXP et l'inspecteur afin d'avoir cette référence Cliquez donc sur l'interface utilisateur du lecteur, allez en haut à droite,
attribuez l'écran HP. Et attribuez un affichage EXP. Maintenant, en réalité, l'écran HP et l'écran EXP peuvent être
et devraient probablement être des
scènes autonomes dont nous avons une copie
dans l'interface utilisateur de notre lecteur Je vais donc faire
un
clic droit sur l'écran HP, et nous allons
enregistrer la branche sous forme et nous allons
enregistrer la branche sous forme de scène dans notre interface utilisateur, puis cliquer avec le bouton droit sur écran
EXP et faire
la même chose Enregistrez une branche d'une scène
dans l'interface utilisateur. Nous pouvons donc maintenant nous y intéresser
et personnaliser individuellement ces petits écrans selon nos besoins dans le contexte de notre interface utilisateur améliorée
pour les joueurs. Nous avons donc des scènes à l'intérieur des scènes, puis nous prenons notre scène
d'interface utilisateur, et nous l'intégrons dans
le monde du jeu, qui est invisible pour le
moment parce que l'interface utilisateur de Canvas est activée.
Mais oui, voilà. Et si nous sommes en train de jouer, nous verrons si quelque
chose fonctionne correctement. OK, donc définissez les statistiques
et l'affichage HP est nul parce que j'ai oublié de les
attribuer dans l'inspecteur. Vous pouvez voir ici qu'ils
sont nuls lorsqu'ils sont prêts, ce qui signifie
que je l'ai oublié lors de l'exportation. De plus, comme il s'agit d'une vérification, nous n'avons pas besoin d'assertions,
car cela implique en quelque sorte que
cela est requis maintenant Passez donc à la scène du lecteur, cliquez sur l'interface utilisateur du joueur, attribuez l'écran HP
et l'écran EXP Quoi qu'il en soit, maintenant nous pouvons jouer,
et nous allons le tester à nouveau. Nous avons donc dix CV sur 100. Si je me souviens avoir
regardé les statistiques, notre PV maximum était de 100 et
notre PV de base de dix, ce qui est évidemment le cas ici. Vous pouvez voir les
mises à jour HP à zéro. La barre de progression de l'EXP ne fonctionne pas encore car
nous devons définir nos
exigences d'expérience de niveau E, ce qui va créer une hiérarchie complète
de montée en niveau. Mais essayons très vite, en réglant le HP à
50 sur notre joueur. Je vais donc passer à notre scène de joueurs, puis j'examinerai
le contrôle des statistiques ici. Et nous allons régler le HP
à 50. Laisse-moi voir. Si je le fais sur place,
puis-je revenir au jeu ? Non, parce que les joueurs ont
déjà été retirés, je crois. Mais en appuyant sur Play, nous devrions voir la barre HP se mettre à jour ici avec la bonne
valeur de progression, mais ce n'est pas le cas. Il indique la bonne valeur HP, mais nous devons réparer l'écran
HP très rapidement. OK, donc sur l'écran HP, laissez-moi voir ce qui se
passait ici. La valeur de progression est égale
au pourcentage de santé. Laissez-moi définir un point d'arrêt
ici, et je vais appuyer sur Play, et nous verrons ce qui le
définit réellement que le pourcentage de
santé soit de 0,0. Ah, c'est vrai, parce que je
divise par des nombres entiers. Ainsi, lorsque nous divisons
par deux entiers, nous obtenons un entier, qui va
automatiquement
atteindre le plancher de zéro. Mais
ce n'est pas ce que nous voulons. Nous voulons en fait
qu'il renvoie un flux. Donc, ce que nous pourrions
faire comme solution rapide, c' est simplement dire float sur le Mx HP. Donc maintenant, ce sera un entier divisé par un flottant, qui renverra un flottant. Si nous appuyons sur Play, nous devrions voir la
bonne valeur y aller. Nous pouvons donc maintenant voir un
pourcentage de santé de 50 %. Si nous appuyons sur Play, la barre s'y
affiche correctement. Moins le décalage de
la valeur. Alors laisse-moi voir. Y ai-je compensé la valeur, écran HP ? Nous avons la
barre de progression de la texture, et pour une raison elle va jusqu'à 00 ici, mais je veux qu'elle soit négative 20 afin que lorsque la valeur est de 50, 20 afin que lorsque la valeur est de 50,
elle apparaisse correctement
au milieu. Vous pouvez voir juste là que cela
représente quatre barres sur huit. Et la valeur ici est de 50. J'ai dû annuler
cela à un moment donné, mais le genre de solution
stupide, c'est qu'il suffit de faire la valeur minimale soit plus grande vers sorte que
la valeur minimale soit plus grande vers
la gauche pour que 50
se retrouve au milieu Parce que si c'est
zéro ici, alors 50 devient, en fait, la troisième barre. Vous voyez, je m'assure que votre
valeur masculine est négative de 20, et cela devrait fonctionner
pour l'écran HP. OK, donc dernier test, nous avons réglé la
barre de progression du jeu sur 50. Je peux annuler ce
point d'arrêt, appuyer sur Play. Et nous pouvons voir que notre barre
de progression de la santé se trouve correctement au
milieu, juste là. Notre HP nous montre 50
sur 50. Faisons nous frapper. Vous pouvez voir nos PV baisser, l'interface utilisateur le
reflète immédiatement, y compris la barre de progression. Donc, tous nos signaux se
connectent correctement. L'
expérience est là,
et nous devons simplement ajouter
nos définitions de mise à niveau afin de pouvoir améliorer le niveau
de notre personnage Avant de terminer complètement la vidéo sur notre
fonction de définition des statistiques, il y a un défaut, que si jamais nous réinitialisons
les statistiques avec des statistiques définies, et qu'une d'entre elles est déjà définie ici, nous nous retrouverons avec des signaux
dupliqués Nous voulons donc dire ici que si les statistiques de soulignement ne sont pas
nulles avant d'appeler set Stats, nous voulons nous déconnecter
des signaux Nous pouvons
donc dire underscore stats
point mxhpChanged point Le soulignement de MAX HP a été modifié. Et il en va de même pour
le HP normal. Nous copions donc cela
et faisons en sorte que le SATS soit modifié par HP, puis par HP Il ne s'agit pas simplement de le
rendre robuste. Je n'ai jamais l'intention de régler le contrôleur SATS sur quelque chose différent, mais juste
au cas où vous le feriez, cela évitera un
horrible bogue où vous
auriez deux signaux connectés pour deux contrôleurs de
statistiques différents, mais sur un seul écran HP Maintenant, faites la même chose
sur l' EXP également Donc, si vous regardez
l'écran EXP, je vais simplement le coller et nous changerons le nom
du signal expérience du Sats a donc changé, puis aucune EXP n'a changé ici OK, donc c'est à ça
que ça devrait ressembler. Soulignez que l'
expérience des SAT a changé déconnexion lorsque l'
expérience a OK, donc ça devrait être utile si jamais vous changiez
le contrôleur SATS Je voulais juste montrer
que c' est un peu plus complet.
40. P39 Débogage et optimisation des scripts d'interface utilisateur et de pickup: Je voulais clarifier
quelques avertissements et erreurs. Je suis entré dans la console
avec le projet jusqu'à présent. Donc, si vous avez copié
le code mot pour mot, vous avez peut-être rencontré
les mêmes problèmes. Donc, choisissez deux D
où il est indiqué que vous ne
pouvez pas utiliser monitorable
est égal à faux, normalement parce que c'est bloqué et que vous devez
attendre que le set Donc, si vous double-cliquez dessus,
cela indiquera que dans
la fonction de suppression, j'essayais de définir
monitorable Eh bien, en fait, il suffit de
supprimer le monitorable égal à faux ici parce que
lorsque vous libérez Qu, il est supprimé à la fin
de la trame en cours Lorsque vous appelez set deferred, il est supprimé à la fin
de la trame en cours. Donc, le rendre non surveillable en même temps que vous
le libérez
ne va pas vraiment
aider Le but était de
faire en sorte que si deux objets essayaient de le prendre
en même temps, il ne le ramasse pas deux fois. Cependant, ce que nous pouvons faire si
vous voulez être encore plus en sécurité. Cependant, si vous voulez être
encore plus prudent et choisir deux D, donnons-leur une variable sélectionnée. Et ce sera un
booléen défini sur false par défaut. Je sous-entends donc simplement qu'
il s'agit d'un booléen. Je veux dire, si vous voulez le
déclarer avec certitude, vous pouvez le faire.
C'est donc choisi. Et si nous essayons d'en déduire
que c' est vrai, alors nous l'autoriserons. Dans le cas contraire, nous renverrons la valeur false. Donc, ce que je vais faire avec Tr take, c'est créer
une protection, puis nous aurons une fonction de prise
distincte, qui sera celle que les
micros implémenteront réellement, comme la fonction virtuelle,
ce qu'ils font actuellement Je veux donc faire
une fonction, souligner T, et cela ne renverra
rien,
donc c'est un type de retour de void Et je vais prendre cette erreur push
et l'indiquer ici. Je vais donc
revenir à la vérité maintenant. Je vais remplacer cela soulignement T. Nous appelons donc
la fonction virtuelle, puis nous allons
nous prémunir contre devoir répondre une deuxième
fois ici Nous allons donc dire : « J'ai
choisi », « renvoie faux ». OK, voilà donc notre gardien. Sinon, on arrive ici. Après avoir pris, nous
choisissons « vrai ». Et je le mets ici
pour que nous n'ayons pas à nous
soucier de ce booléen
et des classes héritées Nous devons juste nous préoccuper de l'
implémentation de la fonction take. Je pense donc que c'est
une meilleure configuration. Cela fonctionnera bien
avec Air Quarter, et tant que nous passerons
à vrai après avoir appelé nous sommes sûrs qu'il ne
décrochera pas une deuxième fois parce que
nous avons ce gardien ici. Il ne nous reste plus qu'à mettre à jour
nos autres scripts de collecte. Donc, recherchez Pickup. Je pense que nous
n'avons que du pick-up EXP pour l'instant Je vais donc double-cliquer dessus. Nous allons le renommer pour souligner
Take , le type de retour est nul Et au lieu de
renvoyer false ici, si les statistiques sont nulles,
nous enverrons une erreur. Donc, appuyez sur une erreur. Percent n'a pas de contrôleur de
statistiques. Ce sera l'objectif du
pourcentage P. Nous le remplaçons donc par
un nom de nœud ici. Et puis on ne
revient pas au bas de l'échelle. Nous appelons simplement Remove.
Et nous devons nous assurer que nous correspondons à la signature des
parents. Je dois donc probablement transmettre la cible P
au script parent. OK, alors allons-y. Et oui, nous voulons dépasser cet objectif P. Donc, cible P, nous allons supprimer le trait de soulignement parce que nous
l'utilisons actuellement Ensuite, nous soulignons que la cible
P est un nœud deux D. Maintenant, cela devrait corriger
les erreurs dans notre
EXP Pickup two D. Et juste pour vérifier,
nous allons passer en mode jeu OK, alors les autres
avertissements, allons-y. Dans la plupart des cas, il ne s'agit
que de paramètres inutilisés. Donc, dans le cas de quelque chose
comme pick-up two D, vous voyez que la cible P n'est pas utilisée Vous devez
donc simplement la marquer d'
un trait de soulignement pour qu'elle soit marquée comme
étant inutilisée intentionnellement Passons à la suivante ici. La taille de l'appareil photo n'a jamais été utilisée. La taille de la caméra a donc été
utilisée pour créer
le recto de caméra. Ce n'est donc pas
nécessaire ici car dans cette fonction de calcul du spawn
final, nous l'avons utilisée pour le système de génération Le champ de caméra est créé, puis la taille en est
extraite. Nous pouvons donc supprimer la taille de la
caméra en tant que
paramètre, la supprimer. Ensuite, là où nous
appelons cela ici, suffit de supprimer également la taille de la
caméra en tant que paramètre, et nous la simplifierons
en trois paramètres. Ce serait donc un
bon cas où cet avertissement nous aurait en
quelque sorte aidés. Ensuite, si vous avez une mise à jour qui
n'utilise pas le Delta,
ce qui serait le cas si vous vous déplacez et glissez parce que
le déplacement et glissement n'
ont pas besoin de faire le Delta, vous définissez la vélocité,
puis vous vous déplacez et glissez
automatiquement avec le Delta. Nous soulignons donc le Delta
et c'est tout. Et ce script de suppression,
le nom déposé
ici , suit le nom
de la fonction Nous pourrions donc changer le nom ici en quelque chose
comme drop instance. Et puis partout où nous
utilisons drop under it, comme ici, nous disons plutôt
drop instance. Vous voulez simplement vous assurer que si vous utilisez une variable localement, cette variable n'est pas
également déclarée en dehors de la portée de la base de classe, comme les variables locales. Et vous ne voulez pas qu'il également
le même nom que le nom d'une
fonction. Ensuite, dans chacune de ces
statistiques, les signaux de changement, les rappels correspondants, je me contentais de rafraîchir
chaque fois que la valeur changeait, et je n'ai pas vraiment besoin d'utiliser directement
les données P pour ces
fonctions Je voudrais donc simplement
souligner les deux une fois de plus dans le script d'affichage
EXP Cliquez ici et soulignez-le, ce qui devrait supprimer tous les
avertissements et erreurs actuels Et je vais appuyer sur Play.
OK, aucune erreur pour.
41. Système de nivellement P40 avec expérience et progression de statistiques: Santé et expérience Maintenant, nous devons ajouter une
sorte de mécanisme de mise à niveau, et nous avons besoin d'
une statistique de mise à niveau sur notre contrôleur de statistiques
afin de gérer
la montée en niveau de notre joueur et peut-être
d'autres personnages également, mais certainement pour Nous allons donc passer
au contrôleur d'étapes, et je vais ajouter
une nouvelle variable ici. Nous dirons que ce sera
un entier égal à zéro, et nous aurons une configuration similaire à celle d'ici
où nous aurons simplement une valeur satur où nous dirons que niveau
I est égal à la
valeur que nous retournerons, sinon nous répéterons simplement
le même schéma en émettant le signal pour le
changement de niveau afin de pouvoir
y répondre dans notre interface utilisateur Nous allons donc dire que var
old est égal au niveau, et nous dirons que le niveau
est égal à la valeur. Nous dirons que var data
est égal à stat changed data point u
object level old, et nous émettrons un signal de changement de
niveau. Avec les données. Maintenant, nous devons
créer ce signal, bien
sûr, pour que le niveau de copie
change en haut. Nous allons créer un signal, des données modifiées de
niveau, des données de
statistiques modifiées. Nous pouvons donc maintenant y
souscrire si nous en avons besoin. Nous pouvons maintenant pleinement
implémenter l'ajout d'expérience. Ainsi, chaque fois que nous ajoutons de l'expérience, voulons également vérifier si nous sommes
prêts pour le niveau suivant. Je l'ai indiqué ici plutôt que le paramètre d'expérience,
car je ne
veux pas trop d'effets secondaires
aléatoires en définissant l'expérience Je souhaite
donc appeler explicitement la méthode de
l'expérience publicitaire, qui augmente de niveau lorsque le
seuil est atteint OK, donc pour cela, nous allons avoir besoin
de créer un objet de définition de
niveau. Créons donc un
nouveau script pour cela. Tout tournera autour,
disons, des personnages. Cliquez avec le bouton droit ici,
créez un nouveau script, et nous l'appellerons définition de
niveau. Donc, point de définition du niveau gD. Cela va s'étendre à
partir d'une ressource, créer. Double-cliquez pour l'ouvrir, et nous donnerons une définition
du niveau du nom de classe. Cela augmentera les ressources,
ce qui
définira un niveau supérieur
pour un personnage. Ce dont nous avons besoin ici c'est donc du seuil
d'expérience. Donc, chez Export VR, nous dirons que l'expérience est nécessaire. Et ce sera un entier. Nous pourrions choisir par défaut
quelque chose comme dix. Et nous voulons probablement aussi des statistiques que nous
allons améliorer. Pour le moment,
nous allons simplement
commencer par les PV et rester simples,
mais vous ajouterez des statistiques
supplémentaires
plus tard au fur et à mesure que vous vous entraînerez pour
qu'elles deviennent des mécanismes. Donc, à Export var HP, nous dirons que c'est un
entier, par défaut égal à dix Et on pourrait dire que c'est le
bonus de PV en cas de montée en niveau. Donc, si vous atteignez ce niveau, votre
personnage obtient autant de PV. Maintenant, comment appliquer nos
modifications de statistiques au personnage ? Vous pouvez le faire manuellement un par un, mais une méthode plus intelligente serait de créer une méthode
pour le faire pour vous. Supposons donc que la fonction s'applique, et nous l'appliquerons un contrôleur de statistiques, disons. Donc les statistiques P d'un contrôleur de statistiques. Ensuite, nous retournerons
nuls avec ceci. Nous voulons donc essentiellement mettre
à jour les ensembles. Donc, P stats point HP plus
est égal au montant des PV. Et avant cela, nous
voulons également augmenter le MX HP. Donc p commence par un point MX
HP plus égal à HP. Il est important que vous
utilisiez le HP MAX avant le HP, car le
HP actuel est plafonné au HP MAX. Ainsi, si un personnage à pleine santé
augmente ses PV de dix, il n'en gagnera pas
à
moins que les PV MAX ne soient d'abord mis à jour. C'est tellement important de commander là-bas. Et cela peut être notre définition de
base pour le moment. Donc, dans le domaine du contrôle des statistiques, ce
serait un bon endroit pour définir nos définitions de niveaux. Je vais donc dire à l'exportation des définitions de
niveau supérieur en réalité virtuelle. Et il s'agit d'un tableau
de définitions de niveaux. OK, donc
pour vérifier le niveau supérieur, nous devons passer au
niveau suivant de la séquence. Créons donc une fonction pour obtenir
le niveau suivant, s'il y en a un. Donc, ici en bas,
disons fonction,
soulignement, passage au niveau suivant Ce qui renverra une
définition de niveau ou une valeur nulle. Et cela va renvoyer les
définitions de niveau supérieur point Git, et nous allons
passer au niveau de l'index. Donc, si nous
arrivons au niveau de l'index, c'est parce que le niveau est en fait la
deuxième place dans le tableau. Donc, si notre personnage
est au niveau 1, nous sommes actuellement
sur l'indice zéro, et nous voulons regarder
l'index plus un, qui est le niveau parce que le
niveau commence à un. OK, donc pour gérer notre augmentation
d'expérience, nous devons d'abord obtenir la définition du niveau
suivant pour le niveau suivant Donc, comme pour le niveau plus un, nous devons placer cette
définition de niveau en haut. Nous allons donc à Export, pas d'une manière ou d'une autre, mais en fait
un dictionnaire ici. Donc, lors de l'exportation des
définitions de niveau VR, nous dirons. Et ce sera un dictionnaire d' entiers affectés
à la définition des niveaux L'entier est donc le niveau que
nous essayons d'atteindre, et la définition du niveau correspond aux changements de statistiques qui
se produiraient s'il existait. Donc, avant de monter de niveau
ou d'essayer de monter de niveau, nous devons d'abord voir s'il existe
réellement un niveau défini. Donc, en bas, nous allons créer une autre
fonction privée, la fonction underscore get next level, qui renverra une définition de niveau ou
une valeur nulle Nous allons donc renvoyer nos définitions de
niveaux (point GET au niveau plus un. Notre niveau actuel plus un, nous voulons l'obtenir et
nous voulons renvoyer null. Si on ne le trouve pas. Donc, si nous renvoyons null, nous ignorerons la montée en niveau Donc, dans cette expérience,
Let's Do VR next sera une définition de niveau
égale pour passer au niveau suivant. Donc, si next est nul, nous revenons simplement ou vous
pouvez même envoyer un avertissement. En fait, oui,
lançons un avertissement. Le personnage ne peut pas
atteindre un pourcentage de niveau plus un car ce niveau n'
a pas de définition définie. Nous pourrions donc dire chaîne de
niveaux plus un ici à la fin et terminer par une autre parenthèse.
OK, ça va marcher. Nous prenons donc le niveau plus un. Nous essayons de passer au
niveau deux si nous sommes au niveau un, et nous constatons que nous ne
pouvons pas monter de niveau parce
que cela n'est pas défini. Vous pouvez donc l'
avoir comme avertissement,
ou si vous êtes sûr que ce n'est pas le cas, vous pouvez simplement le commenter
ou le supprimer. Je vais le laisser de côté pour le moment
afin que nous puissions au moins voir quand nous ne parvenons pas à définir
une définition de niveau. Le niveau suivant est donc nul, donc si le niveau suivant est nul, nous reviendrons car
nous ne pouvons pas monter de niveau. Il n'y a pas de niveau suivant défini. Nous sautons donc complètement. Ensuite, nous voulons vérifier si l'exigence d'
expérience de niveau supérieur est inférieure ou égale à
notre expérience actuelle. Nous pouvons donc le placer dans le cadre
d'une fonction à trois niveaux. Soulignez donc le passage au niveau supérieur, et nous passerons au suivant Nous venons donc ici et
nous aurons notre fonction. Souligner. Essayez de monter de niveau. Soulignez parce que c'est privé, et nous passons à la définition du
niveau suivant Ou en fait, vous savez,
je pense que cela devrait vraiment être contenu dans
cette fonction. Cela va donc renvoyer un booléen, et nous l'
aurons ici Nous arrivons donc au niveau suivant
dans cette définition. Ensuite, nous n'avons pas
besoin de transmettre de paramètre. Nous essayons juste de
monter de niveau après avoir ajouté de l'XP, non ? C'est juste comme ça. Donc, si nous ne pouvons pas
monter de niveau, nous renvoyons false. Ensuite, nous voulons vérifier si l'expérience est supérieure ou égale à l'
expérience requise au point suivant. Si c'est le cas,
alors nous monterons de niveau. Mais je vais inverser la tendance.
Je vais dire que si c'est moins que l'expérience requise, alors nous renvoyons faux. OK, donc nous n'avons plus
de déclaration if. Et puis, si nous arrivons ici, nous aurons passé les contrôles de sécurité, donc nous pourrons dire que le niveau
plus est égal à un. Nous allons soustraire l'expérience requise de l'expérience
actuelle Donc, moins d'expérience
est égal au niveau suivant. Oh, désolé, ensuite, une
expérience en matière de points est requise. Ensuite, nous appliquerons les statistiques du niveau suivant
à nos statistiques actuelles. Donc, après avoir soustrait l'XP, nous appliquons le point suivant à self parce que nous travaillons dans
le script du contrôleur de statistiques, puis nous reviendrons à vrai
parce que nous avons réussi à monter de
niveau Maintenant, laissez-moi y réfléchir.
Je pense que je veux vraiment que le niveau augmente une fois les statistiques
appliquées, comme ça. Donc, si nous voulons dire, faites monter le
niveau d'un personnage, puis nous lui donnons le choix
des récompenses. Donc, choisir une amélioration
lors de la montée en niveau, qui est un mécanisme
de base similaire à celui de nos survivants, nous voulons le faire une fois les statistiques de
base appliquées, afin que l'interface utilisateur soit toujours mise
à jour au même moment, mais juste avant monter de
niveau et d'émettre notre signal de changement de
niveau, faisant
ainsi
réagir l'interface utilisateur et nous montrer
nos choix d'amélioration Je pense que c'est un changement de
commande important à cet égard. OK, donc oui, alors le signal de changement de
niveau
va être émis
ici à cause du setter. Et c'est essentiellement
notre montée en niveau. Si, pour
une raison quelconque, vous souhaitez obtenir la définition du
niveau actuel, cela peut être utile
en dehors du script. Et celui-ci pourrait même être
utile en dehors du script. Je vais donc passer au niveau suivant, et nous allons supprimer
le trait de soulignement pour faire
pivoter le coup de soulignement
et essayer Et ajoutons une
fonction G niveau actuel. Définition ou peut-être simplement clarifier suffisamment les niveaux
actuels. Ensuite, nous retournerons la définition
du niveau. Nous allons donc renvoyer le point de définition des
niveaux GIT, et nous voulons renvoyer
le niveau ou la valeur null. OK. Ils
peuvent donc être utiles pour d'autres scripts qui souhaitent examiner ce qui se passe
avec le contrôleur de statistiques. Il est donc
logique de les rendre publics. En ne le soulignant pas C'est pourquoi. OK, nous
avons donc cette propriété statistique, et nous pouvons monter de niveau
chaque fois que notre EXP augmente, qui devrait être automatique
car cette expérience
publicitaire sera appelée depuis
notre pick-up, notre collecte d'EXP Donc, tout va
bien se dérouler si cela fonctionne bien. Sauf que maintenant, nous
devons plutôt nous assurer que nous nous connectons à
la statistique de niveau et nous nous connectons à
la statistique de niveau et
au signal de montée de
niveau ou au signal de changement de niveau. Et nous allons le faire à l'
intérieur de l'écran EXP. Nous devons donc
rechercher EXP dans un projet et faire défiler l'écran vers le bas, trouver notre
point d'affichage Scene XP TSCn, l'ouvrir OK, maintenant que notre
mise à niveau devrait fonctionner, nous devons accéder à l'affichage de
l'EXP, et nous
assurer qu'il indique l'EXP dont nous avons
besoin pour le Alors allons-y. Et lorsque nous
actualisons, nous voulons obtenir un niveau d'expérience supérieur. Nous voulons remplacer ce point
par le Mx XP des statistiques si les statistiques ont un niveau supérieur auquel
nous pouvons réellement accéder. Donc, vous vous débarrassez de ce bit et vous
dites que VarnNxt sera
égal au point de soulignement des
statistiques au Nous passons donc au niveau suivant, et s'il n'y a pas de niveau suivant, nous dirons que I next
est égal à null, puis nous voulons modifier le texte du point de l'
étiquette pour qu'il soit égal,
disons, à notre chaîne de niveau maximum. D'accord, nous devons donc le
définir ici lors de l'exportation de la chaîne de niveau var max, et ce sera juste
égal à quelque chose comme le niveau maximum en majuscules. OK, sinon, nous allons
définir le texte sur notre EXP,
notre numéro actuel à partir
du numéro de niveau suivant Nous avons donc confirmé
que next n'est pas nul, nous pouvons
donc remplacer ce bit
par next point experience Ned. Maintenant, si je lance le jeu, il
indiquera probablement simplement niveau
maximum car nous
n'avons défini aucune définition de
niveau. Si nous sommes au niveau MAX, je veux également
prendre la barre de progression et définir cette valeur sur 100. Donc maintenant, si nous lançons le
jeu, cela va nous donner une
erreur car je n'ai pas défini la progression,
alors allons-y. Donc, sur notre écran XB, allez vers la droite et
assignez la barre de progression. OK, maintenant nous pouvons courir, et nous devrions voir une barre de progression
complète. Nous sommes au niveau MAX. Ok, donc récupérer XB n'a plus d'importance. Je peux toujours avoir une bonne expérience, mais ça ne montera plus jamais de
niveau. Parce que les définitions de niveaux sont attribuées dans l'éditeur,
pas pendant le jeu. Bien que vous puissiez le faire, mais ce serait
assez bizarre, non ? Comme simplement définir
la fin de partie que vous pouvez atteindre jusqu'au niveau 31, alors qu'avant 30 était le plafond, non, c'est quelque chose que
vous faites dans l'éditeur. 99,99 % du temps. La
valeur de progression est donc définie ici. Nous allons
vouloir obtenir un pourcentage entre notre expérience et
la prochaine expérience requise, puis nous mettrons à jour
la valeur de progression ici pour savoir quand nous pourrons passer au niveau supérieur. Notre progression est donc nulle
et nous allons définir ce chiffre égal
à expérience requise sur le point suivant,
divisée par le point de soulignement, l'expérience par point
. Maintenant, n'oubliez pas que nous divisons
un entier par un entier, mais que nous voulons en
fait que ce soit un nombre flottant. Nous devons donc en prendre
un et transformer en flotteur.
Alors dis « flotter ». Ensuite, dans Stats
Dot Experience, nous finissons de l'
encadrer entre parenthèses C'est ce que nous faisons, et cela
devrait maintenant nous donner quelque part entre
0.0 et 1.0. Mais cela doit être
essentiellement converti en pourcentage, car
notre barre de progression a
par défaut une valeur
maximale de 100 Nous examinons
donc des pourcentages Quoi qu'il en soit, vous devez réduire
la valeur maximale à un. Les deux sont en fait valides. Ici, nous pouvons simplement le mettre
entre parenthèses et le multiplier par 100, ce qui devrait nous
donner nos progrès réels Nous n'y
arriverons donc toujours jamais car nous devons définir des définitions de
niveau supérieur. Passons donc au joueur, et nous allons cliquer sur
le contrôleur de statistiques. Nous avons nos
définitions de niveaux ici. Nous pouvons donc ajouter des valeurs clés du
dictionnaire. Nous voulons que le niveau
deux suivant soit défini ici. Ajoutez-en donc deux et une nouvelle définition
de niveau. À l'intérieur, nous pouvons simplement
dire que XB avait besoin de dix HP dix. C'est bien pour commencer.
Ajoutez la paire clé-valeur. Il est important que tu
n'oublies pas de cliquer dessus. Sinon, il ne figurera pas
dans le dictionnaire. Nous avons donc notre dictionnaire
avec une touche au niveau deux et une définition de
niveau pour améliorer notre personnage. OK, un dernier petit
ajustement que nous devons faire est assurer que notre joueur passe
par défaut au niveau Passons donc au contrôleur de statistiques et à
l'
endroit où nous avons le niveau. Nous devons nous
assurer qu'il en est un. Ainsi, lorsque nous
vérifierons le niveau plus un des deux, nous trouverons cette définition de
niveau,
qui devrait s'afficher
correctement dans l'interface utilisateur. Alors, appuyons sur Play, et nous
aurons besoin de notre XB ici. La barre de progression n'a pas été mise à jour, mais voyons voir si
nous obtenons une EXP, elle augmente et elle
apparaît sur dix Et oui, simple erreur. J'ai oublié d'attribuer la progression à la valeur du point de progression. Il est donc peut-être
judicieux de le
changer de nom. Nous suivons une variable. Je parie que si je vérifie
les erreurs ici, vous verrez que oui, je l'ai masquée avec le nom de la barre de texture de
progression Disons donc que le pourcentage nivelé
serait un bien meilleur nom. Ensuite, nous dirons que la valeur du point de
progression est égale au pourcentage nivelé. Et maintenant je suis presque
sûr que cela devrait fonctionner. Jouons. Vas-y. Nous pouvons comprendre pourquoi EXP
n'aimait pas là-haut, et maintenant c'est
un sur dix C'est intéressant. Je
dois donc définir un point d'arrêt ici pour voir ce que cela montre Et passons en mode jeu. Et nous pouvons voir qu'il indique
0,0 en ce moment, mais prenons-en un et nous
en obtenons 1 000. Une autre simple erreur de logique, je devrais diviser l'
expérience par l'expérience requise.
Nous inversons donc cette tendance. Je vais prendre l'expérience
nécessaire et la mettre ici,
puis je vais couper les
statistiques sur l'expérience et la mettre
ici sur la gauche. Nous pourrions toujours faire le
flotteur sur la
droite. C'est très bien. OK, alors rejouons. Tester ça ? Donc, d'accord, maintenant il affiche 0 % de niveau supérieur. Nous ramassons un article.
Nous y obtenons 10 % ,
deux ou trois, mais cela
devrait aller jusqu'au bout. Je veux donc vérifier la valeur d'
arrêt de progression ici et voir
pourquoi cela se produit. OK, nous
avons donc augmenté de 40 %. Le pourcentage nivelé est donc correct. se peut donc que nous
ayons besoin de vérifier l'interface utilisateur en dehors du jeu. Passons donc à l'affichage
EXP ici. Je vais tester le réglage de
la valeur à zéro. OK, c'est exact.
100 est correct. Cela va jusqu'
à l'extrême droite. Disons 25, 50, 75. OK, ça a l'air correct. Mettons donc la valeur à zéro. C'est bon, joue.
Testons ça un peu. OK, supprimez le point d'arrêt. Passez en mode jeu, et
faisons-en un, deux, trois. C'est donc 30 % ? Peut-être que c'est correct, en fait. OK, donc on obtient quatre sur
dix, puis cinq sur dix. OK, oui, ça fonctionnait bien. Faisons sept sur
dix. En fait, améliorons simplement notre personnage
pour prouver qu'il fonctionne. OK, donc nous en avons neuf sur dix, puis le
squelette apparaît. Nous pouvons en obtenir un de plus,
dix sur dix. OK, vous avez vu que nous
venons d'obtenir dix PV ici, puis nous sommes passés à zéro sur
dix pour l'EXP nécessaire La partie concernant le niveau suivant
devrait donc renvoyer
quelque chose, mais ce n'est pas le cas. Donc, la raison pour laquelle
cela s'est produit est que notre
expérience est mise à zéro. Il émet un signal, puis notre niveau modifié
ne se connecte pas ici Ainsi, une fois le niveau modifié,
il ne s'actualise pas à nouveau. OK, donc la solution la
plus
simple est de souligner le changement du niveau des
points des statistiques, et nous nous connectons au niveau
modifié pour actualiser à nouveau. Nous pouvons donc le copier
ici et le déconnecter. Nous allons donc créer notre fonction de
rappel
dans la fonction inférieure,
soulignée au niveau modifié Nous n'allons pas utiliser les
données, alors soulignez les données P. Stat a modifié les données,
nous renvoyons la valeur nulle et nous allons simplement les actualiser. D'accord, de cette façon, une fois l'
expérience réglée à zéro, juste avant d'
augmenter notre niveau, cela actualisera l'interface utilisateur, mais ensuite le niveau changera
et nous actualiserons à nouveau l'interface utilisateur. Montrons donc une fois de plus
que tout fonctionne comme prévu. Je vais donc juste acquérir assez d'
expérience pour monter de niveau ici. Donc pour et ensuite, cinq, six, sept, huit, neuf. Skillsins ne laisse encore rien
tomber. Nous allons
bientôt régler ce problème. Puis dix. OK, maintenant il affiche le niveau maximum, mais nous avons également augmenté nos PV. Cela a donc actualisé notre interface utilisateur deux fois. Une fois, nous avons modifié nos statistiques, diminuant ainsi l'expérience, et une autre fois où nous avons
augmenté notre niveau, ce qui indique que le niveau
suivant n'existe pas. Nous affichons donc le niveau maximum sur notre barre
d'EXP comme nous nous y attendions. Tout
semble donc fonctionner.
42. P41 Configuration des seuils XP et des connexions de signal pour des récompenses de niveau: À présent, nous
voudrions ajouter un système de mise à niveau semblable à
un voleur. Nous augmentons donc le niveau de notre personnage lorsqu'il atteint
un certain seuil d'expérience, puis nous pouvons
sélectionner l'une des trois options
pour améliorer notre personnage. Et celui-ci est choisi
parmi une liste aléatoire d'options disponibles. Donc, pour des raisons de commodité,
avant d'entrer dans le vif du sujet, je voudrais modifier
l'exigence d'expérience, ajustant le niveau deux à un, juste que nous puissions
le déclencher très rapidement. Donc, si je passe au SAN du joueur, nous allons ouvrir le point TCN du joueur, puis passer au
contrôleur de statistiques, je crois que c'est là que
nous l'avons défini Et pour ce qui est de la définition du niveau, nous avons
ici le premier niveau fixé à dix XB nécessaires. Changeons-le
en un très rapide. Et puis peut-être que j'
ajouterai quelques niveaux supplémentaires. Nous pouvons donc faire un niveau trois
ici en tant que nouvelle clé, puis faire
une nouvelle définition. Nous allons juste faire en sorte
que celui-ci en ait besoin de dix. Nous allons donc ajouter cette paire
clé-valeur. Vous pouvez en ajouter
autant que vous le souhaitez ici. s'agit donc essentiellement Il s'agit donc essentiellement d'une liste géante des
niveaux que nous essayons de
définir ici sur
la gauche et de la définition de l' augmentation du niveau des
statistiques
sur la droite. Donc, au niveau 4, nous
pouvons gagner, je dirais, 20 XP nécessaires, et cela
augmente les PV de dix Et continuez
comme vous le souhaitez. Donc niveau cinq, disons
30 X P et L niveau dix. Je vais juste étoffer
les choses pour ne pas avoir à m'inquiéter à ce sujet bien
plus tard. Passons au niveau 7. Donc nouvelle définition de niveau. Nous allons dire 50 XP, ajouter une paire clé-valeur, sept, et nous allons faire une nouvelle définition de
niveau à 100 XP et l'ajouter. Et je pense que cela devrait
être une bonne chose surtout pour notre prototype à
sept niveaux différents. C'est certainement suffisant
pour tester les choses. Nous avons donc
configuré ces définitions de niveau lors de la montée en niveau, elles émettront
le
signal de changement de niveau depuis notre contrôleur de statistiques Nous voulons donc nous y
connecter dans notre nouvelle interface utilisateur, qui nous permettra de choisir
l'un des trois éléments différents
ou d'améliorer les fonctionnalités. Et nous voulons que le
jeu soit suspendu pendant que notre joueur
fait ce choix Créons donc une nouvelle interface utilisateur. Je vais ajouter un nouveau nœud de
contrôle ici, augmenter la sélection, je
pense que c'est un bon nom, et nous y ajouterons un nouveau
script. Donc, niveau Uselection DotGD. Nous allons bien sûr enregistrer cela dans le dossier de l'
interface utilisateur. Donc, interface utilisateur, puis ouvrez et créez. OK. Contrôlez également pour enregistrer la scène à côté de l'
endroit où se trouve le script. Cela se trouve donc également dans le dossier de l'interface utilisateur.
Je vais juste le sauvegarder ici. OK, maintenant nous allons en quelque sorte
commencer à travailler sur le script. Je vais sélectionner le nom de la classe par
niveau supérieur. En général, à moins que quelque chose ne
soit très spécifiquement un script à usage auquel rien d'autre n'
a besoin de faire référence, je
créerai presque toujours un nom de classe, si cela n'était pas clair
à ce stade. simple fait d'avoir un nom référençable facilite considérablement le travail entre les
scripts OK, donc le moyen
le plus rapide d'obtenir la référence
au contrôleur de statistiques du joueur est de l'
avoir deviné. Le contexte
du joueur. Ajoutons donc export var, le contexte, qui sera le contexte du
joueur ici. Contrôlez S pour enregistrer cela. Ensuite, dans l'inspecteur, nous allons charger rapidement le
contexte individuel de notre jeu, ce qui
nous donne essentiellement la référence
au joueur et donc
au contrôleur de statistiques. OK, puis dans la fonction
underscore ready, nous voulons passer au point de contexte point
joueur point stats point point niveau Chang et nous connecter à cela
avec le niveau du joueur modifié, qui sera une nouvelle fonction que
nous créerons juste en dessous La fonction souligne donc
le changement de niveau du joueur. Et celui-ci aura l'objet de données
de changement de niveau. Les données P sont donc ce qu'on
appelle les données modifiées par les statistiques. Nous ne voulons donc fournir l'interface utilisateur que si les
niveaux augmentent réellement. Il peut y avoir des
circonstances étranges où nous
déciderons que le niveau pourrait
baisser à l'avenir. Pour éviter cela,
nous dirons que si le
changement de point de données P est supérieur à zéro, nous savons qu'il augmente OK, donc lorsque le niveau change, nous voulons uniquement réagir
en montant de niveau,
pas en descendant. Nous allons donc dire que si le changement de point pdata est
inférieur ou égal à zéro, nous allons simplement
revenir ici car ce
n'est pas une condition que nous
voulons gérer Sinon, nous allons
augmenter le niveau du joueur. Pour l'instant, je vais
uniquement écrire
le code pour gérer les
niveaux un par un, car dans le contexte
du jeu actuel, c'est la seule façon dont
cela serait possible Je vais donc écrire au
moins le prototype du script pour ne gérer
la montée en
niveau qu'une seule fois à la fois Si, pour une raison ou une autre, vous avez choisi
un objet de 1 000 EXP et que cela déclencherait
trois ou quatre niveaux, vous souhaiterez peut-être gérer
cette condition plus tard Mais je pense que c'est un peu inutile, car nous
n'allons gagner qu'
un seul XP à la fois de toute façon. Mais pour ce script, pour le
moment, nous allons
juste gérer un
niveau à la fois. Créons donc une fonction ici. Je vais l'appeler « démarrer
la sélection ». Et puis cette fonction,
que je vais placer au-dessus sélection de
début de
fonction , nous
fournira trois options. Il affichera également l'interface utilisateur. Nous pouvons donc simplement
commencer par un show call ici. Ensuite, nous voulons également
mettre le jeu en pause pour pouvoir dire « mettre trois points en
pause », c'est vrai OK, donc puisque nous mettons le jeu
en pause ici, cela signifie
que
tous les scripts configurés pour tous les scripts être actifs
uniquement lorsque le jeu n'est
pas en pause, ce qui
est le Donc, sur la droite
, sous
le processus des nœuds, nous devons changer de mode ici, je pense, toujours afin qu'il puisse toujours déclencher des éléments
dans le jeu, qu'il
soit suspendu ou non Parce que nous
voulons également pouvoir ouvrir le script lorsque le
jeu n'est pas suspendu donc important de pouvoir sera donc important de pouvoir
lancer la sélection pendant
une partie non interrompue Je pense donc que cela
a toujours du sens. Mais nous voulons absolument qu'il fonctionne pendant que le jeu est en pause. Plus tard, nous devrons venir
ici et générer une liste de récompenses que nous
allons montrer au joueur. Nous devrons d'abord configurer un peu l'
interface utilisateur pour cela. Et nous voulons également nous
assurer que cela est testé jusqu'à présent afin qu'
il apparaisse réellement Faisons un clic droit
sur la
sélection de niveau supérieur et ajoutons-y quelques composants d'
interface utilisateur. Je vais donc commencer par, disons, un conteneur de panneaux, qui nous permettra de le voir lorsqu'
il apparaîtra à l'écran Cliquez également sur l'interface utilisateur root. Ensuite, nous allons
changer, voyons voir, la mise en page en haut à gauche et capreset
ici. Donc juste là. Je veux aussi m'assurer
que la souris n'
empêche pas les clics
de passer, mais nous allons en fait l'
ignorer pour le moment. Il y aura des éléments sur
lesquels nous voudrons cliquer sur l'interface utilisateur, tels que des boutons
pour effectuer la sélection, mais nous ne voulons pas que la racine
de l'interface utilisateur bloque ces signaux de souris
et de port. Voyons donc si nous pouvons le
faire apparaître lors de la montée en niveau. Passons à la racine et j'ajouterai la sélection de
niveau supérieur. Donc, mettez le niveau de soulignement vers le haut, et nous le placerons
sous la couche de canevas Affichons temporairement l'interface utilisateur. OK. Et nous allons
vouloir que cela soit
réellement au
centre de l'écran. Prenez donc la sélection de niveau supérieur et passez à la mise
en page en haut à
droite, et nous allons la centrer ici. Donc, centre et si nous zoomons en arrière, cela devrait théoriquement être au centre de l'écran Passons donc au
niveau deux et au jeu, et nous verrons si cela
fonctionne réellement. Donc je vais aller ici. Le jeu s'est arrêté. Je
ne le vois pas apparaître, mais c'est un bon début. Nous savons donc au moins que
cela se déclenche chez Lavote. Je pense donc que ce qui pourrait
être à l'origine du problème c'est que l'
échelle de la couche Canvas est définie sur quatre. Faisons celui-ci comme ça. OK, puis je veux un
enfant pour la couche Canvas, que je vais
utiliser pour la mise à l'échelle. Faisons un clic droit
sur la couche Canvas et ajoutons un nœud de contrôle ici. Je vais donc prendre les autres nœuds, et je vais créer la racine. Ce nœud sera donc l'interface utilisateur. D'accord, nous allons également
devoir prendre le contrôle de l'interface utilisateur, le root que
je viens de créer. Et nous allons prendre
les ancres prédéfinies et
créer ce rectangle complet Maintenant que cela va s'étendre
à la taille du point de vue, nous voulons nous assurer
que la souris est configurée pour ignorer afin de
ne pas bloquer les signaux de l'interface utilisateur. OK, et puis si la sélection de niveau supérieur est réglée
ici au centre, nous pouvons voir que c'est le véritable centre
du point de vue. Voici donc le nœud de contrôle de l'
interface utilisateur racine, puis celui-ci se trouve au centre. Donc, si je clique sur Jouer maintenant et
que nous allons chercher un XP, il
apparaîtra au centre, même s'il affichait le bit par défaut. Donc je dois d'abord le cacher. Et maintenant, appuyons sur Play. Nous allons ici, et vous le voyez
apparaître en même temps que le jeu met le
jeu en pause OK, donc ce script fonctionne. Nous devons à nouveau redimensionner notre
HPUI. Je vais donc
cliquer sur l'interface utilisateur ici et augmenter directement
son échelle. Il est peut-être préférable de
redimensionner les
composants individuels plutôt que d'appliquer une
échelle globale à tout. Ensuite, nous pouvons simplement dimensionner notre sélection de jeu de
manière appropriée. Donc, un autre avantage d'avoir l'interface utilisateur ici est que si nous
voulons appliquer un thème à tout ce qui se trouve en dessous,
nous pouvons simplement aller sur
le thème en bas à droite, puis charger
rapidement le thème du jeu. Désormais, tout
utilisera cette police Pixar, même si nous ne l'attribuons pas directement à la sélection de
niveau supérieur Donc, parfois, vous avez besoin un contrôle précis sur
les thèmes individuels Si vous voulez un
thème personnalisé pour, par exemple, la sélection de niveau supérieur,
il vous suffit d'en créer un
nouveau ici. Et je pense qu'aux niveaux les
plus bas, il l'emporte sur tout ce qui
se trouve au-dessus Vous pouvez donc avoir
une hiérarchie de thèmes comme
celle-ci , car tout ne doit pas nécessairement remplacer
chaque propriété Vous pouvez avoir un thème principal, puis pour des éléments très personnalisés, comme l'apparence d'un slider,
vous pouvez le transformer en un sous-thème
43. P42 - Mise en page de l'interface utilisateur et du texte animé: Nous allons travailler à l'élaboration
de notre modèle d'interface utilisateur pour la sélection de
niveaux supérieurs. Nous avons donc déjà
un conteneur à panneaux. Je pense que nous devrions l'
étendre, alors je vais tirer sur le coin inférieur droit
et le déplacer un peu plus loin. Nous allons avoir besoin d'
une interface utilisateur beaucoup plus grande pour afficher réellement notre sélection. Nous allons maintenant avoir
besoin d'un en-tête. Peut-être que nous montrons un graphique.
Genre, félicitations. Tu as fait monter de niveau
quelque chose comme ça. Ensuite, nous avons besoin d'un affichage à trois
colonnes. Ce seront des conteneurs VBox, qui afficheront nos options Ce sera donc probablement
comme un texte de titre, une icône, une description, puis un bouton de sélection. Et une fois le
bouton de sélection enfoncé, la sélection de niveau supérieur
traitera la sélection, appliquera au joueur, fermera l'interface utilisateur et
reprendra le jeu. Faisons donc un clic droit sur
notre conteneur de panneaux, et je vais ajouter
un conteneur
de marge au niveau suivant,
ajouter un nœud enfant. Nous recherchons donc un conteneur à
marge. Ensuite, dans les
dérogations de thème sur la droite, je vais prendre
ces marges et
les régler chacune sur cinq
pixels pour le moment Cela va juste le rendre
un peu plus beau pour que tout ne soit pas aussi
agglutiné Faisons un clic droit sur le conteneur de
marge et ajoutons
maintenant un conteneur VBox Nous pouvons donc organiser
tout le reste verticalement. Vous pouvez déjà voir
le récipient à marge, étale
un peu les bords sur les côtés. Nous voulons y ajouter
probablement le texte de notre titre. Nous pouvons donc l'ajouter sous forme
d'étiquette de texte enrichi. Bien, cliquez sur Ajouter une étiquette de texte enrichi pour
enfants. faire du texte enrichi
au lieu d'une
étiquette normale, c'est parce que
vous pouvez utiliser des textes enrichis , comme du code BB, ce qui est utile si
vous souhaitez appliquer un effet arc-en-ciel ou agiter
le texte de haut en bas Il est donc tout simplement
plus puissant qu'une étiquette de texte ordinaire. Je suis sûr que cela entraîne
techniquement un coût
en ressources,
mais quelques textes animés à l' écran ne vous
retarderont pas Mettons-le donc ici au
niveau supérieur en tant que texte. Nous pouvons voir que ça n'
apparaît pas vraiment ici. Nous devons donc reprendre le contenu en
forme et vérifier qu'il est vrai. Maintenant, notre texte va
apparaître au centre. Nous voulons également
centrer ce texte Nous allons
donc modifier l'
alignement horizontal ici pour le centrer. OK, maintenant c'est centré.
Mettons une icône dessous pour afficher un
graphique de niveau supérieur de quatre heures. Je vais donc faire un clic droit sur le conteneur
VBox,
ajouter un nœud enfant Disons un support à texture. Ajoutez cela et nous pouvons
sélectionner une texture. Ainsi, tout graphique que nous voulons utiliser à
partir de notre projet fonctionnera. Voyons si nous pouvons charger quelque chose
rapidement. Donc, si je fais une recherche, disons 64 x 64 pour obtenir la texture la plus haute
résolution, prenons parmi ces icônes
celle que nous voulons utiliser, puis agrandissons-la encore plus. Je voulais donc en fait l'utiliser dans le cadre d'
une texture d'atlas. Donc, si vous l'avez sélectionné,
cliquez dessus avec le bouton droit de la souris, puis cliquez sur Copier. Et dans le menu déroulant ci-dessus, créez
la texture de l'atlas. Cliquez sur la texture de l'atlas, puis cliquez avec le bouton droit de la souris pour
coller la fin de l'atlas. Nous pouvons maintenant sélectionner l'icône que
nous voulons utiliser à partir de là. Donc, pour tout ce qui vous
semble beau, il existe de nombreuses options. Et voici la feuille de sprites de texture
64 x 64
du pack d'icônes C'était une évidence, donc l'un
des trois atouts artistiques dont nous
disposons pour le projet. Donc, quelque chose comme
ces épées jumelles ou l'épée brillante
pourrait très bien fonctionner Tout ce qui pourrait ressembler à
une silhouette humaine éclatante, impliquant en
quelque sorte
« Oh, je passe au niveau supérieur Je suis devenu super fort,
par exemple , spécifiquement
comme ça, ou dans le projet de base,
j'ai utilisé celui-ci, qui est plutôt un éclair,
mais il pouvait aussi fonctionner. OK, donc cette fois, je
vais choisir celui où cela ressemble à un faisceau de
lumière géant plutôt qu'à un éclair. Et je vais appuyer de près. Nous avons donc notre icône affichée dans
le rectangle de texture. L'étirement n'est pas
vraiment ce que nous voulons, nous voulons
donc changer
le mode d'étirement pour rester centré sur l'aspect Je pense que c'est la
meilleure option ici. Et cela fonctionnera très bien Je pense qu'en suivant
notre icône de montée en niveau, ajoutons un bloc de texte, lequel nous dirons au joueur que
nous voulons faire l'une
des quelques sélections. Faisons donc un clic droit
sur le conteneur de vBux, ajoutons-y une autre étiquette
de texte enrichi puis nous ferons
quelque chose Vérifiez l'adéquation au contenu. Ensuite, pour le
texte, nous dirons choisir l'une des options de montée
en niveau ci-dessous. Comme nous avons l'intention de faire apparaître la police
Pixar ici notre écran actuel
plutôt que d'être présentée
dans le monde entier à chaque fois, pour voir à quoi elle ressemblera
avec le thème du jeu, passons à la sélection du niveau supérieur du
nœud de l'interface utilisateur de base, et attribuons simplement le
thème ici également Donc, dans l'inspecteur, chargez
rapidement le thème, puis cela mettra
à jour notre texte. Maintenant, vous pouvez voir qu'
avec cette police différente, le texte
tient en fait sur une seule ligne. Cela fait une grande différence.
Cliquons sur le deuxième libellé de texte enrichi,
et centrons-le. Bien, ensuite,
prenons ce titre
et rendons-le un peu
plus intéressant en ajoutant un arc-en-ciel et un effet de
vague avec le code BB. Vérifiez donc que le code BB est activé ici et passez au début
du texte en haut à gauche. Nous allons mettre
entre crochets le code BB, arc-en-ciel puis l'espace FREQ
pour une fréquence égale à 0,5
espace SAT égal à un C'est la saturation.
La valeur de l'espace est égale à un, puis mettez fin aux
crochets, et vous obtiendrez un
effet arc-en-ciel ici sur la gauche. Maintenant, pour vous assurer
que cela se termine, vous allez à la fin du texte, puis vous placez des
crochets Rainbow. Et voilà
notre effet arc-en-ciel anime dans la fenêtre d'affichage Et nous pouvons également modifier
les paramètres ici. Donc, si vous
voulez qu'il soit moins vif, essayez de réduire la
saturation à 0,5, et vous aurez maintenant un
arc-en-ciel plus apprivoisé qui s'y affiche J'aime bien ça,
donc je vais le garder. Maintenant, ajoutons également
l'effet de vague. Alors, cliquez à nouveau sur Accueil pour accéder
au début de notre zone de texte, ou vous pouvez simplement cliquer dessus
en haut à gauche Ensuite, faites un autre
crochet, et nous allons
taper WA VE pour Wave Space AMP pour une
amplitude égale à 50. C'est la hauteur qu'il
atteint entre les vagues. Et puis la fréquence spatiale
ou FREQ est égale à deux. C'est la fréquence à laquelle il
va faire une vague, puis la terminer avec le
bon crochet. OK, et ensuite tu devrais
aller jusqu'au bout, après
l' arc-en-ciel là-haut, et
faire passer des crochets entre crochets. Cela signifie simplement que si vous
ajoutez du texte supplémentaire par la suite,
cela n'aura pas d'effet de
vague, car nous avons supprimé l'effet
dans notre bloc de texte. Donc, contrôlez Z, nous pouvons y voir notre texte s'animer.
C'est plutôt chouette. Nous voudrions peut-être que
l'amplitude diminue un peu, alors je vais la réduire à 30. Donc, si nous regardons notre animation, nous pouvons voir que
le texte s'anime à
peu près vers le bas ou
le haut de notre zone d'étiquette Je pense que si nous avons une
amplitude de 50, comme nous le faisions avant même qu'elle ne soit
coupée. Ce n'est donc pas l'idéal. Si c'est trop
à la hausse ou à la baisse, nous pouvons ajouter du rembourrage à cette étiquette spécifique en
accédant aux remplacements de thèmes Ensuite, nous voulons passer
aux styles normaux et créer une nouvelle zone de style vide
car il
n'y a pas d'arrière-plan. Développez cela, accédez aux marges
du contenu, puis nous pouvons décaler
le haut et le bas de
quelques pixels. Je vais donc essayer de
faire en sorte que le haut soit moins trois et le bas
moins trois. Ensuite, nous pouvons ajouter
une marge de contenu ici
en haut et en bas. Je vais donc le faire comme deux pixels en haut et deux en
bas. OK, et cela va
essentiellement étirer notre boîte pour qu'elle soit un peu
plus grande qu'elle ne l'aurait
été par défaut. C'est donc une autre solution si
vous ne vouliez pas simplement ajouter tout un tas de nouvelles
lignes dans la zone de texte. Je suppose que ce serait également
une autre option plus rapide. Mais aussi un peu moins
précis. Enfin, pour cela, si nous voulons que le
texte soit plus grand, nous pouvons accéder aux remplacements de thèmes et personnaliser les tailles de
police ici Je pense donc que nous voulons
une taille de police normale, et augmentons-la à 24. D'accord, celui-ci
semble un peu flou en fait. Essayons 32, non ? OK, donc je pense que pour
cette police spécifique parce que c'est Pixar, il y a numéros d'échelle
très spécifiques lesquels vous devez définir
la taille des pixels Donc, si je dis que c'est
quelque chose comme 22, je suppose que ce n'est pas un multiple de huit ou 16, donc ça
ne marchera pas. Faisons donc 32 à la place pour que cela soit là afin que
le rendu soit correct. Ces dérogations, d'
ailleurs, si vous le souhaitez,
vous pouvez également passer du temps à les
personnaliser, ainsi que les
thèmes en particulier Mais s'il s'agit d'un titre ponctuel comme celui-ci, il sera peut-être
plus rapide d'attribuer vos valeurs personnalisées à
cet en-tête en particulier. Ce n'est que si vous voulez avoir
beaucoup d'interface utilisateur dans le jeu et que vous souhaitez la personnaliser dans un endroit centralisé,
qu'il est logique de créer beaucoup de
thèmes Plutôt que de simplement
l'utiliser pour les polices, vous pouvez également personnaliser les tailles de police ou
ajouter un en-tête personnalisé
44. P43 Concevoir l'interface utilisateur de sélection de récompense et les ajustements finaux: Bien,
nous devons maintenant créer nos boîtes de sélection verticales Ce sera donc une sous-interface utilisateur. Je vais créer un
nouveau nœud ici. Ce sera, disons, une interface utilisateur,
mais je vais cliquer avec le bouton droit de la souris ici et changer son type
en conteneur de panneaux. Nous allons simplement faire de la racine
ici un conteneur de panneaux. Et ce sera une taille réelle par défaut, qui s'étendra
partout. Renommons-le en « Sélection
de récompenses ». Et je vais l'
enregistrer dans le dossier UI. OK, passons maintenant
à la sélection de Lavop, et je vais en mettre trois dans
la hiérarchie Recherchez donc une récompense dans le projet et
déposez-en une sur VBox. Je vais le dupliquer encore
quelques fois. Et vous verrez que le problème
immédiat est qu'il y en a trois, mais
qu'ils sont tous verticaux. Nous avons donc besoin d'un autre conteneur
HBox pour les rendre horizontaux Cliquez donc avec le bouton droit sur le conteneur VBox et ajoutez un conteneur
HBox à nœud enfant, et placez les trois sélections de
récompenses sous le conteneur HBox Maintenant, vous devriez voir si vous
cliquez sur le conteneur HBox c'est qu'ils ont chacun une
position décalée l'un par rapport à l'autre Mais pour le moment, ils ne
s'étendent pas sur l'écran. Nous devons donc passer à la sélection des
récompenses, et il va s'agir de la
disposition, de la taille des conteneurs Nous voulons étendre nos activités à l'horizontale. Et pendant que nous y sommes
,
étendons également la verticale. Contrôlez comme pour enregistrer, revenez à la sélection de
niveau supérieur. Et maintenant, nous pouvons voir qu'ils sont quelque sorte dans le sens d'une colonne. Ils occupent chacun un
espace uniforme de gauche à droite et s'adaptent à notre conteneur à
panneaux principaux C'est donc plutôt
ce que nous recherchons. sélectionner les récompenses,
cliquez avec le bouton droit sur le dessus et ajoutons un nœud. Ce
sera donc une étiquette de texte enrichi
dans l'étiquette de texte Rch,
mettons le texte Nous dirons le nom entre crochets, et je vérifierai le contenu de Fit. Nous pouvons zoomer ici pour le voir. Donc pour la sélection des récompenses, je vais cliquer sur Sélection des récompenses, et prenons le préréglage
d'ancrage prenons le
préréglage d'ancrage et faisons en haut à gauche, d'accord ? Et puis, en dessous, nous avons besoin d'
un conteneur de marge. OK. Donc, si nous regardons ici, y a aucun espace entre nos étiquettes et le
bord de ce panneau Ajoutons donc un conteneur de marge sous la sélection de récompenses. Cliquez avec le bouton droit sur Ajouter un conteneur de
marge enfant, puis faites de l'
étiquette de texte enrichi un conteneur dérivé de celui-ci. Le conteneur de marges fera en sorte que le
thème remplace les constantes, et disons peut-être trois
pixels pour les marges
gauche, supérieure, droite et inférieure ici à droite Passons maintenant à la sélection des récompenses
root, et je vais modifier
son préréglage d'ancrage en haut à gauche, par exemple. Mais prenons également
la sélection des récompenses et allongeons-la
un peu
afin de pouvoir au moins voir sur quoi
nous travaillons ici. Nous n'en avons pas besoin pour étirer la totalité de l'écran, car
cela est trompeur, mais nous voulons pouvoir
voir notre contenu vertical. Et nous pouvons passer à la sélection de
niveau supérieur pour voir à quoi cela
ressemblera à
tout moment après le redimensionnement
et ce conteneur d'interface utilisateur Jusqu'à présent, ça a l'air bien. Nous voulons cependant centrer
ce titre. Je vais donc cliquer
sur l'étiquette de texte enrichi, et nous allons faire l'
alignement horizontal au centre. De plus, pour le
dimensionnement vertical du conteneur ici et le contrôle, je veux faire Shrink begin Cela permettra donc de s'assurer qu'il ne s'
étende pas plus que nécessaire. Si nous passons à la sélection par niveau, nous devrions voir nos étiquettes
centrées ici. D'accord, nous avons maintenant besoin de notre espace réservé aux
icônes. Je vais donc cliquer avec
le bouton droit sur Margin Container, ajouter un rectangle de texture, puis nous pourrons sélectionner une
icône dans notre projet. Créons donc une nouvelle texture Atlas. Et ici, je vais charger rapidement une icône d'atlas
du pack 16 par 16 Modifions la région et
sélectionnons un espace réservé. Donc quelque chose pour monter de niveau, quelque chose comme ça
semble plutôt correct. Et je vais appuyer de près.
Nous devons maintenant nous assurer que tout est correctement
organisé Nous allons
donc
avoir besoin d'un conteneur VBox
sous le conteneur de marge Cliquez donc avec le bouton droit sur le conteneur de
marge, ajoutez un
conteneur VBox cloué pour enfant et faites du titre et de la texture un enfant OK, maintenant ça va s'
organiser correctement. Nous devons cependant nous assurer que
cela conserve son rapport hauteur/largeur, afin que cela
n'
ait pas l'air bizarre. Ainsi, dans l'inspecteur de texte, modifiez le
mode d'étirement pour conserver l'aspect Il faut également rester centré sur
l'aspect. OK. Là-bas. Cela
semble plus approprié. Nous pouvons également vouloir passer à la mise en page et définir une taille d'icône
minimale. Donc, ici, je vais prendre
la taille minimale personnalisée, et nous dirons quelque chose
comme 48 par 48. OK, ça va en quelque
sorte élargir les choses. 32 sur 32, c'est bien. Cela signifie simplement que si votre
icône est inférieure à 32 x 32, elle sera automatiquement
redimensionnée à cette taille. OK, ajoutons un texte de
description, afin que je puisse contrôler C
l'étiquette de texte enrichi puis cliquer sur le conteneur VBox,
contrôler V, le coller dedans Et nous allons mettre la description
entre crochets ici. De toute évidence, nous pouvons voir que c'est assez important pour cette zone, nous devrons
donc peut-être travailler
sur nos tailles de police ultérieurement. Enfin, nous voulons un
bouton pour sélectionner l'option. Je vais donc cliquer sur le
conteneur VBox, ajouter un bouton. Donc, ici, nous allons probablement
juste
vouloir un bouton normal. qui vous permet d'
avoir une icône, afin que nous puissions
charger rapidement une icône de test, même manière qu'auparavant, moins de texture, l'agrandir. Chargement rapide à partir de la feuille
de sprite 16 x 16. Modifiez la région et
choisissez une icône. Alors peut-être que quelque chose comme l'épée avec un symbole de
montée de niveau a du sens. OK. Nous pouvons maintenant voir
notre bouton sous forme d'icône. Ensuite, dans la zone de
texte, nous pourrions dire « choisir » pour indiquer ce que
nous faisons ici Maintenant, si nous passons à notre fenêtre de sélection de
niveau supérieur, nous pouvons voir nos trois parties
de l'interface utilisateur apparaître ici, nous avons trois boutons que nous allons connecter pour choisir plus tard. Nous avons notre titre animé. Et c'est plus ou moins à cela que ressemblera notre modèle
. Il s'agit simplement de fournir les options de sélection, de les
connecter à notre joueur,
puis d'améliorer notre joueur une fois qu'il a fait une sélection Il s'agira
simplement de remplir la liste
avec les options
disponibles, puis de les appliquer
au joueur une fois que celui-ci aura
fait sa sélection OK, vous
remarquerez peut-être qu'il y a un petit problème où
parfois le bord de nos icônes se chevauche avec
les icônes voisines. Pour résoudre ce problème, nous pouvons passer
à la sélection des récompenses et vérifier le clip du filtre.
Pour le bouton. Donc, lorsque vous faites cela, si vous allez ici et que vous
zoomez et dézoomez, cela devrait résoudre le
problème immédiatement afin que vous ne voyiez plus de pixels
qui se chevauchent De plus, en ce qui concerne le niveau de
sélection dans le monde, il se peut qu'il soit techniquement
centré ici. Mais vous pouvez voir qu'
il va vers le bas
et vers la droite à partir de
ce point central. Il ne va donc pas
apparaître centré sur l'écran. Pour modifier cela, je pense que ce
serait une bonne idée de prendre notre couche Canvas et de cliquer avec
le bouton droit de la souris pour l'
enregistrer en tant que nouvelle scène
dans notre projet d'interface utilisateur. Je vais donc dire gameplay UI Canvas comme nom,
puis nous l'ouvrirons. Bon, maintenant, si nous examinons Hue, nous pouvons
voir beaucoup plus clairement où nos objets sont positionnés sur l'écran et leur taille par rapport
au point de vue, plutôt que d'avoir une vision du monde
encombrée Nous pouvons donc voir, bien sûr, que
notre sélection de joueurs, notre interface utilisateur, nous devons cliquer dessus et
probablement doubler la taille. Donc, pour ce qui est de l'échelle, je vais juste prendre la balance et en
faire un deux. Il faudra peut-être même
aller jusqu'à trois. Oui, choisissons-en
trois par défaut. OK, donc pour gérer
ce problème où notre conteneur de panneaux va
essentiellement vers la droite et vers le bas au
lieu d'être centré ici. Nous voulons passer à la scène de la sélection
Love Up ,
puis passer au
conteneur à panneaux, je crois. Et sur la droite,
nous devons passer le mode de mise en page aux ancres,
puis le centrer ici Ouais. OK, voilà. Nous
avons maintenant ce que nous cherchons. Donc,
tout ce qui est un sous-objet est centré
sur ce point d'ancrage, où si nous allons maintenant
dans l'interface utilisateur de Canvas, il sera correctement
centré. OK, très rapidement, passons
au script de sélection de
Llevo. Et une fois prêt, nous voulons
masquer notre sélection de niveaux supérieurs. Je vais donc
taper et me cacher ici. Et cela garantira que
lorsque nous démarrerons le jeu, il sera masqué par défaut. Appuyons sur Play. Nous allons accéder
à LeveOp en récupérant de l'EXP. Et là, nous avons notre fenêtre
contextuelle de sélection LevelUp. Nous avons le choix entre
trois boutons . Ils ne
font encore rien. Nous déciderons peut-être plus tard de
ne pas mettre la musique en pause, comme ce
qui vient de se passer, mais
à part ça, tout fonctionne. Le jeu est complètement suspendu
et notre interface utilisateur s'affiche.
45. P44 Créer un système de niveau pour les mises à jour de jeu: Pour que notre système de montée de niveau fonctionne, nous avons en fait besoin de
quelques mises à niveau pour
remplir la liste de notre menu de montée de niveau Donc, en général, il s'agira
d'améliorations d'armes. Nous devons donc également mettre en place
un système de mise à niveau pour nos armes Donc, si nous examinons
la scène du joueur, nous avons l'arme de
lance par défaut, qui a une définition d'
arme La définition de l'arme
reste donc très simple
pour le moment, mais nous allons devoir
ajouter une amélioration de l'arme. Mais nous allons ajouter
ici un tableau ou dictionnaire d'
améliorations d'armes afin de
passer au niveau suivant
et de déterminer les dégâts que passer au niveau suivant et de déterminer les dégâts cette arme est censée infliger à un niveau donné. Ainsi,
lorsque nous lançons notre arme, elle utilise les paramètres
appropriés. Cela peut également
inclure des éléments tels le temps de recharge ou le nombre de
cibles qu'une arme peut toucher. Il existe de nombreuses propriétés
différentes que vous pouvez configurer pour
votre système d'armes. Donc, si nous passons au script des armes de
lance, nous pouvons passer
à la définition des armes Vous pouvez voir ici que j'ai déjà élaboré un modèle de méthode de recharge, qui reviendra en
fonction du niveau, du recharge de
l'arme Ici, si nous
définissons notre tableau, puis que nous indiquons le niveau
réel de l'arme, nous serons en mesure de récupérer le bon ensemble de statistiques pour notre arme au
niveau actuel. Ensuite, nous
devrons également générer une méthode get seen. Donc, pour le moment,
il s'agit simplement de charger directement
la scène de lance Mais lorsque nous
améliorerons notre arme, nous ajouterons peut-être la possibilité de faire scènes de
projectiles
complètement différentes apparaître des scènes de
projectiles
complètement différentes, mais nous ne voulons pas nécessairement le faire
à chaque niveau Nous pourrons
donc revenir par défaut au projectile d'arme d'origine et simplement améliorer
les statistiques Passons donc à cela en
créant quelque chose comme un niveau d'arme ou une définition de
niveau d'arme. Je vais donc passer
au système de fichiers, et nous allons passer aux armes. Cliquez avec le bouton droit de la souris et
créons un nouveau script ici. Ensuite, je vais l'appeler un
peu le niveau de l'arme, qui sera lui-même une ressource. Créons-le donc.
Ouvrez le script du niveau de l'arme. Nous allons aller en haut et créer un nom de
classe et un niveau d'arme. Cela définit donc les statistiques de l'arme à ce niveau
particulier. Ainsi, une arme peut avoir
autant de niveaux que vous le souhaitez, et sa
puissance augmentera au fur et à mesure qu'elle s'améliorera. Nous pouvons donc saisir
ici certaines statistiques auxquelles nous aimerions
pouvoir accéder pour un
niveau différent de l'arme. L'une des choses les plus évidentes
serait donc le refroidissement. Nous pouvons donc dire à export var, cool down, et ce
sera un float, et nous pouvons utiliser par défaut 1.0. OK, alors sauvegardons
ça très rapidement. Je vais fermer tous
mes autres scripts ici, alors cliquez avec le bouton droit de la souris et
fermez-les pour que nous puissions
voir ce que nous faisons. OK, puis ouvrez le niveau et la
définition de l'arme ici. OK, alors ce sont
les deux seuls avec lesquels nous
travaillons ici. Nous voulons donc, je dirais, un dictionnaire, si nous voulons être cohérents avec le niveau de
nos joueurs. Et à Export VR, des niveaux, qui seront un dictionnaire des nombres entiers et du niveau de l'arme. Donc, pour le temps de recharge de Git, nous voulons obtenir le
niveau, puis nous
retournerons le temps de recharge
à partir des statistiques du niveau Le niveau VR sera donc égal aux niveaux point Git et nous allons
obtenir le niveau P. Et renvoie null par défaut. Nous voulons maintenant supprimer
le trait de soulignement pour le niveau P car nous utilisons
enfin cette variable Maintenant, il ne peut pas en déduire
le type ici Nous devons
donc lui indiquer le type de niveau d'arme
concret, puis nous allons
rétablir le temps de recharge par points de niveau OK, alors cliquez avec le bouton droit sur le niveau de l'
arme et utilisez le symbole Loup. OK, assurez-vous que c'est
bien là. Donc, dans get cooldown, il va trouver
le niveau de l'arme S'il ne trouve pas
le niveau de l'arme, il va en fait
générer une erreur ici. J'ai pu constater que nous
réutilisions beaucoup cette ligne. Je vais donc également
mettre ici une fonction Git Weapon level. qui va prendre
un entier de niveau P, et cela va
renvoyer un niveau d'arme. Nous pouvons donc simplement le renvoyer. Et puis au lieu de cela, ce que
nous pouvons faire ici, c'
est obtenir le niveau d'arme. Passez un point de niveau p égal à un point inférieur. Maintenant, l'une des bonnes raisons pour lesquelles
nous ferions cela est que si nous voulons
ajouter du code ultérieurement, disons qu'il
n'y a pas de niveau d'arme et que nous voulons revenir par défaut au niveau précédent, ou que nous voulons partitionner l'erreur. Nous pouvons faire tout cela dans le cadre de cette fonction de
niveau d'arme G. Et puis dans tous
les autres endroits nous appelons Get Weapon Level, tout ce
code supplémentaire sera prégéré. Donc, cela le
configure simplement si nous devons exécuter la fonction get damaged, fonction g max hits, etc.,
cela réduira
notre code plus tard et
le centralisera cela réduira
notre code plus tard dans cette Mais pour le moment, surtout lorsque nous sommes en train de créer des prototypes, je dois absolument
savoir immédiatement si
j'ai oublié de définir
un niveau d'arme dans lequel nous nous
attendrions à ce qu'il y un niveau d'arme défini
sur la base de la définition de l'arme. Je suis donc totalement d'accord
avec le fait que cela
génère une erreur
dès que nous essayons de
réduire le point quo à un niveau d'arme nul. C'est pourquoi je vais
laisser les choses comme ça pour le moment. Bien, passons maintenant au niveau de l'
arme et nous allons configurer d'
autres propriétés
que nous voulons modifier par niveau. Une autre évidence serait les dégâts qu'une
arme peut infliger. Donc, à l'exportation, les dégâts varient, et nous pourrions même
infliger aux hommes dégâts
maximaux si nous voulons que ce
soit un peu plus intéressant. Donc, si nous disons à export
var men damage, et disons que c'est un float, nous pouvons le définir par défaut à 10.0, puis nous avons à
export var Max damage, qui sera un float Et
fixons-le simplement à 20 par défaut Quels que soient les chiffres que vous pensez un bon point de départ,
vous allez les ajuster. Presque toujours pour chaque ressource de niveau d'
arme. Comme je l'ai
mentionné, nous voulons probablement aussi un maximum de visites. Donc, à Export V, le nombre maximum de réponses est atteint, et ce sera un entier. Je vais le définir comme égal à 1,0. Oh, aussi, les
dégâts infligés par les hommes et les dégâts
maximaux, j'ai oublié
que nous avons affaire à des entiers dans le jeu, donc je vais les remplacer par des entiers Je vais donc changer
cela
en entier dans les deux cas pour être cohérent. Bien entendu, vous pouvez utiliser des nombres flottants en combinaison avec des nombres entiers Mais je pense que dans
ce cas, lorsque nous voulons
toujours que les dégâts
ne soient pas décimaux, il vaut mieux
être
cohérent dans tous nos scripts OK. Et puis, de
même, la valeur maximale indique que l'entier ne doit pas
avoir de virgule décimale Nous
allons probablement également vouloir une variable de vitesse ici quelque part. Exportez donc la vitesse de la
variable, et ce sera un flottant. Je vais le régler sur 100,0, soit environ
pixels par seconde. Ensuite, un petit commentaire
à ce sujet également. Nous avons donc maintenant un
tas de propriétés. Nous voulons définir
la ressource dans notre définition d'arme à lance OK, alors faisons un zoom arrière,
cliquez sur l'arme à lance. Ici, sur la droite, nous
avons nos niveaux d'armes, donc nous les avons configurés. Le niveau
ne correspond donc pas à la position du réseau, mais au niveau réel
de l'arme. Nous voulons donc commencer par un point ici. Ensuite, nous voulons créer
un nouveau niveau d'arme. OK, donc au niveau de notre arme, cela pourrait être notre ensemble de base. Pourquoi ne pas simplement ajouter
la paire clé-valeur, et ce sera la paire par défaut
pour notre lance de niveau 1 Ajoutons-en deux
, puis un nouveau niveau d'arme. Et nous voulons augmenter
les dégâts ici. Donc je dirais 15 à 25, et peut-être que la vitesse
est un peu plus rapide, donc 110 pour la vitesse. Avec le temps de recharge, nous pouvons lancer un peu plus vite, donc je dirais 0,9, et le nombre maximum de coups sera toujours
réglé à un ,
car ajouter un
coup maximum supplémentaire est un gros problème. Cela pourrait être comme doubler
vos dégâts de manière efficace. Ajoutons donc cela.
Passons ensuite au niveau 3, nouveau niveau d'arme. Nous allons dire 20 à 25
dégâts, la vitesse, peut-être 115, puis
le temps de recharge est de 0,9, mais nous augmentons le nombre
maximum de coups à deux. Vous pouvez donc en quelque sorte vous
faire une idée ici. Nous voulons presque toujours que certains
chiffres augmentent. J'ai l'impression que chaque niveau est une amélioration par rapport
au précédent. Nous n'avons pas nécessairement à
modifier les mises à niveau
en fonction d'un facteur linéaire. Ainsi, par exemple, un niveau peut augmenter considérablement les dégâts, mais la vitesse du
projectile reste la même Quoi qu'il en soit, ajoutez cela, et nous continuerons à jouer autant de
niveaux que vous le souhaitez. OK, donc pour
continuer, faisons-en quatre. Nous allons ajouter un nouveau niveau d'
arme ici, pourrait vous aider à étendre le niveau d'arme précédent afin que vous
sachiez ce dont vous avez besoin pour l'améliorer. Nous commençons donc par 20 hommes de dégâts. Passons à 25 de temps en temps, puis 30 pour les dégâts MX
et la vitesse, 120, le temps de refroidissement de 0,8. Le maximum est de deux. Ajoutez une paire
clé-valeur. Il suffit de continuer. OK, et je viens d'
en ajouter un cinquième pour m'amuser. Donc, celui-ci, vous pouvez voir les statistiques juste là
si vous voulez les copier. Une statistique clé que j'ai
oubliée le nombre de projectiles
générés Exportons donc des projectiles
var, et ce sera un
entier égal à un Le nombre de
projectiles à
lancer par lancer est donc une propriété très importante Donc, si nous voulions qu'un niveau
soit extrêmement fort, nous
pourrions dire,
peut-être le niveau 5. Nous avons deux
projectiles par lancer, ce qui fera que l'arme infligera
beaucoup plus de dégâts Maintenant, nous ne voulons pas que les
projectiles apparaissent exactement
au même
moment dans la plupart des Une solution serait de les
décaler pour que vous
puissiez voir où ils
vont apparaître Une autre option que vous
pourriez ajouter
serait de retarder la propagation de chaque
projectile après chaque
projectile Vous pourriez donc dire,
ajoutons les deux
en tant qu'option. On pourrait donc dire « Export
var offset » ou « span offset ». Ce sera un
char. Ça va être égal à zéro, zéro. Et puis, lors de l'export VR, délai d'apparition est un flottant, et nous dirons 0,05 seconde Donc ça va ressembler un peu
à ça. décalage d'apparition est
le décalage maximal pour la position de portée
instantanée du projectile Alors, à quelle distance du point central peut-il
se trouver lorsqu'il apparaît ? Ensuite, le délai
sera le temps et les
secondes nécessaires pour attendre entre deux
séries de projectiles supplémentaires, et je dois dire qu'après la première, c'est la valeur
clé OK, donc dans la vidéo suivante, nous travaillerons à prendre ces niveaux
d'armes et à
faire en sorte que nous puissions réellement choisir de
les augmenter dans notre interface utilisateur.
46. Armes P45 pour augmenter la puissance de leurs armes: OK, donc pour la
partie suivante, nous devons introduire la possibilité pour notre interface de sélection de niveau
d'obtenir l'objet pour l'amélioration de l'
arme
afin de pouvoir améliorer l'arme réellement
active dans le jeu. La première étape sera donc de créer une liste d'options ou une
ressource dans
notre sélection de niveau supérieur que nous utiliserons pour renseigner les options
ci-dessous sur la base d'
une sélection aléatoire
parmi les options
viables disponibles Je vois ici
en bas à gauche que les projectiles se trouvent dans
le dossier des niveaux Je vais en fait passer
à
des armes qui ont tout simplement plus de
sens. Donc, comme il n'y a rien
dans le dossier Niveaux, je vais le renommer en
paramètres, car ce que nous faisons en réalité, c'est établir une liste d'améliorations d' armes
ou d'autres améliorations lesquelles nous pouvons choisir
dans notre niveau de jeu Cela peut être
différent selon le personnage
ou
selon le niveau que nous chargeons dans notre jeu, mais nous voulons avoir la possibilité de le personnaliser dans les deux cas. Nous allons donc
créer un nouveau script, j'appellerai point gD pour les options
de mise à niveau Ce sera une ressource, nous pouvons
donc la modifier
dans le GidoEditor Ensuite, je vais
entrer ici. Et disons les options de nivellement des
noms de classes. Plus tôt dans le cours,
nous avons introduit les micros. Maintenant, ces micros n'existent actuellement que sous forme de scène
dans le monde du jeu, ils sont récupérés
et
l'EXP est immédiatement ajoutée aux Nous n'avons donc pas eu
besoin d'un objet particulier, car cette
EXP ne fait que modifier une statistique. Mais si nous voulons
quelque chose de plus complexe, comme un bonus de santé ou la
capacité d'augmenter le niveau d'une arme, nous avons besoin d'une classe d'
objets plus concrète dans notre jeu,
et presque
tous les jeux
de type RPG auront
un à un moment ou à Nous voulons donc exporter une liste
d' objets que nous pouvons immédiatement
utiliser avec notre joueur. Je vais donc faire de
l'exportation pour les articles, et ce sera un tableau d'articles,
disons, pour le moment. Nous n'avons pas encore
créé de classe d'objets. Créons donc un dossier en
bas à gauche pour les articles. Je vais cliquer avec le bouton droit de la souris
pour créer un nouveau dossier. Je vais appeler ça Items. Ensuite, à l'intérieur d'ici,
je vais cliquer avec le bouton droit pour créer un nouveau script. Et ce sera l'item point
gD issu de Resource. OK, donc à l'intérieur d'ici, nous allons créer un élément sur le nom de la classe. En particulier, dans le
cas d'un jeu de type survivant, il se peut que
nous n'ayons pas nécessairement d'
objets
dans un inventaire. Ils doivent donc tout de même faire
une demande immédiatement. Mais leur application
est plus complexe que le
simple fait que l'ExbPickup soit une mission
d'expérience immédiate Donc, pour
que nous puissions appliquer nos objets à un
joueur ou à une cible, je vais
au moins
créer une fonction. Nous allons dire la fonction try apply, qui va
prendre une cible P, pas deux D, et elle va
renvoyer un booléen Essayez donc apply car il
peut y avoir des circonstances dans
lesquelles cela échoue, et il peut être
utile avoir
un retour d'information
dans notre code pour savoir si cela a réussi ou nous pouvons
également vouloir une
fonction d'application afin de vérifier à l'
avance si elle est réellement
viable ou non. Je dirais donc que la fonction peut s'appliquer, et cela transmettra
la cible, pas deux D et renverra des booléens Donc, par défaut, je vais dire return false ici car il
s'agit d'un élément de base. Nous ne pouvons pas l'appliquer, et je vais simplement dire return
false ici également. Je vais donc
simplement ajouter un avertissement indiquant que nous ne
pouvons pas appliquer l'
objet de base à une cible, puis créer
notre arme car c'est ce qui nous préoccupe
le plus en premier. Je vais donc
cliquer avec le bouton droit sur les objets, créer un nouveau script, et ce sera l'objet de soulignement de l'
arme, il héritera de l'objet en
tant que classe de base,
donc nous allons Donc, ici, objet d'arme, nous allons aller en haut et attribuer nom de
classe à un objet d'arme
qui est un nœud deux D. Cela va
renvoyer un booléen Nous avons donc besoin d'un moyen d'accéder à l'arsenal d'armes du
personnage s'il en possède un Donc, une façon simple de le
dire serait que far loadout est égal à p target point find child, et nous allons
chercher un arsenal d'armes OK ? Et cela devrait permettre de récupérer
une sorte de cargaison d'armes. Transférons donc cela
dans sa propre fonction. Donc, la fonction get loadout va
renvoyer le chargement
des armes. Et puis nous allons simplement le rendre
à la place,
renvoyer le chargement d'armes ptarget point Fine
Child Nous devons donc transmettre
le Ptarget ici. Ensuite, nous pouvons en déduire le type. Je vais donc faire deux points égaux, obtenir le chargement sur pTarget puis nous verrons si
cela existe ou non pour Ensuite, nous voulons
vérifier si l'équipement correspond la définition des armes que nous essayons actuellement d'appliquer Nous pourrions donc
exporter la définition VR. Et il s'agit d'une définition
des armes, plutôt d'
une définition des armes. OK, après avoir récupéré l'équipement, nous voulons vérifier si l'arme existe à
côté du chargement Si c'est le cas, nous
verrons s'il
y a de la place pour le monter de niveau ou si nous avons déjà
atteint le niveau maximum. Donc, à l'intérieur de l'équipement, nous devons savoir quelles armes se trouvent réellement en dessous
de ce système fois prêts, nous pouvons récupérer tous les
équipements préexistants, puis nous ajouterons une méthode
afin d'en ajouter un nouveau qui
l'ajoutera
au tableau, en faisant référence à tous ses enfants
armés Supposons donc que Var Weapons soit
une gamme d'armes en deux D, et si la fonction
soulignée est prête, ce qui revient
à zéro, nous voulons obtenir tous les enfants
qui portent des armes. Donc, pour l'arme dans Find Children, et les guillemets vides pour la chaîne de caractères
ne correspondaient pas par nom Mais pour le type, nous
allons utiliser l'arme deux D, et le boîtier est important ici parce que c'est le type de nom de
classe. Cela ne ramènera donc
aux enfants que l'arme de type 2 D.
Et puis nous pouvons dire que armes parsèment l'arme Penn. Et maintenant, lorsque le script démarre, nous avons toutes les armes
préexistantes. Nous pourrions dire que nous avons une
fonction d'ajout d'arme, qui prendra une arme
P, une arme P, qui est un type d'arme deux D, plutôt Vitun void et nous
dirons armes Penn P. Et nous voulons nous assurer qu' il s'agit d'un enfant de cette arme. Nous le faisons donc dans le cadre d'une seule fonction. Nous allons dire « Ajouter une arme Child of P ». Ce sera une bonne chose pour le moment. Passons donc à l'article
sur les armes. Nous avons le chargement afin de
vérifier s'il l'a déjà. Donc, après avoir obtenu l'équipement, nous voulons obtenir l'arme associée à cette définition
d'arme Supposons donc que notre
arme soit
égale à l' arme LoadOug, selon une définition Nous allons donc
parler de définition ici. Passons maintenant à l'
équipement des armes et passons la fonction arme G, en
fonction de la définition Donc, définition P. C'est
une définition d'arme. Nous allons renvoyer
une arme à D. Et disons que pour une
arme dans une arme, si la définition de l'arme est
égale à la définition P, nous allons
renvoyer cette arme. Dans le cas contraire, nous renvoyons null. Comme nous n'avons besoin que de rechercher dans quelques armes, avoir une petite boucle comme celle-ci sera parfaitement
acceptable, ce n'est pas vraiment un problème. De plus, si vous
voulez limiter le nombre d'armes qu'un joueur peut posséder, d'armes qu'un joueur peut posséder,
vous pourriez dire
quelque chose comme si, lors l'exportation, les armes VR Max
étaient un entier de six en haut. Ensuite, nous pourrons également vérifier
s'il y a de la place. Nous pourrions donc dire que
la fonction a de l'espace, et ce sera un type de retour
booléen, et nous dirons simplement que
le point si
est inférieur au nombre maximum d'armes est inférieur au nombre maximum OK, donc c'est juste une simple petite force de fonction auxiliaire Maintenant, revenons à l'article d'arme, s'ils ont l'arme, alors nous voulons voir si
nous pouvons la faire monter de niveau. Il peut même être judicieux déclarer le type d'
arme deux D ici, bien que cela soit déjà
déduit de
l'appel de fonction de l'arme OK, donc tout d'abord, s'
il n'y a pas d'arme, donc si l'arme est nulle, alors nous retournerons le chargement avec de l'espace pour savoir si
nous pouvons postuler ou non. Parce que si l'arme n'
existe pas dans le système d'armes, suffit de voir s'il y a de la
place pour en ajouter une nouvelle. Sinon, s'il y a une arme, nous voulons voir si
nous pouvons la faire monter de niveau. Alors nous dirons rendre l'arme. Cela peut être quelque chose comme un
niveau C supérieur ou un niveau suivant. Je pense que Has Next Level
semble être un bon nom. Nous avons donc maintenant besoin de cette fonction dans notre script
Weapons to D. Donc, dans Weapons to D, nous voulons utiliser le niveau par rapport
à la définition et simplement vérifier
s'il y a un niveau suivant. Donc, en bas, créons notre fonction. La fonction passe donc au niveau suivant. Cela renverra une valeur booléenne. Supposons donc que la
fonction fonctionne au niveau suivant, et ce sera un niveau d'
arme égal à définition. Obtenez le niveau
d'arme de notre niveau actuel plus un, ce qui peut renvoyer zéro. Nous allons donc renvoyer que le
niveau suivant n'est pas égal à zéro. Parce que s'il
y a un niveau suivant, nous pouvons passer au
niveau suivant. Nous pouvons monter de niveau. Si ce n'est pas le cas, soit
nous avons atteint le niveau maximum, soit nous avons
oublié de définir un niveau. Nous avons peut-être
défini le niveau sept, mais avons-nous défini le niveau
six lorsque nous sommes au niveau cinq ? Parce que cinq peut aller à six, mais nous ne pouvons pas simplement passer à
sept, du moins normalement. Cela devrait donc répondre à nos
besoins pour vérifier
si nous pouvons postuler. Et puis, si nous
voulons appliquer, nous dirons fonction, appliquer. Et laissez-moi vérifier la classe
de base ici, juste pour être sûr, nous allons essayer de l'appliquer. Il pourrait en fait être
judicieux de le copier. OK. Ensuite, nous allons
remplacer cela ici en déclarant
à nouveau
la même fonction Donc, d'abord, nous devons obtenir l'arme si nous
voulons présenter une demande. L'arme Var est donc une arme en deux D, ce qui sera égal à arme
LoadOug selon
notre définition Donc, si l'arme n'est pas
là, nous échouons déjà. Donc, si l'arme est
nulle, nous renvoyons des chutes. Mais nous devons également
récupérer le matériel. Les chargements Var seront donc déduits du type
à partir de la cible
G loadout P. Nous sommes donc en train de préparer l'équipement sur la cible à laquelle nous
essayons de nous adresser Donc, une fois que nous aurons l'arme,
nous voulons la récupérer. Nous allons donc dire
Weapon Dot Tri level up, et cela reviendra, que
nous réussissions ou non. Nous allons donc renvoyer cette valeur. Nous devons maintenant définir le point
d'arme trois niveaux supérieurs et arme deux D.
Passons donc à la fonction, fonction tri niveau supérieur, et nous allons
renvoyer un booléen OK, donc nous cherchons en haut
du script en deux D de notre arme. Nous pouvons constater que nous avons le niveau et le niveau d'arme prévus dans
la définition de l'arme pour être un peu plus
efficaces et pour
pouvoir accéder à nos informations
actuelles. Une fois que nous aurons déjà atteint le niveau supérieur, nous pourrions également avoir une
variable locale On pourrait dire que notre
niveau d'arme est un niveau d'arme. Donc, à lire, disons que le niveau de l'
arme est égal au point de définition du
niveau d'arme Git à notre niveau actuel. Et puis chaque fois que nous
montons de niveau, nous allons également le configurer. Ainsi, si nous avons besoin de voir les statistiques du niveau
actuel de notre arme, il nous suffit d'accéder à
cette valeur ici. Nous trouvons donc la
valeur de notre définition une seule fois, et jusqu'à ce que nous montions de niveau, nous avons accès aux informations
de ce niveau d'arme. OK, maintenant avec Trevelu, nous voulons passer au niveau suivant Nos statistiques
de niveau suivant seront donc égales
à définition, au
niveau de l'arme à notre niveau plus un. Donc, si les
statistiques du niveau suivant sont nulles, nous renvoyons false. Sinon, nous allons dire que niveau de l'
arme est égal
aux statistiques du niveau suivant, et nous disons niveau plus un. niveau plus est égal à un, et nous revenons à la vérité. OK, il y a donc notre fonction de montée de
niveau. OK, la dernière chose que
nous allons faire dans cette vidéo pour l'
arme est de le créer. Donc, dans les objets, cliquez avec le bouton droit ,
créez une nouvelle ressource recherchez un objet d'arme, appuyez sur Entrée, nous allons le
mettre dans les objets. Nous allons donc dire objet en forme de lance. Et si vous
double-cliquez sur l'élément représentant une lance, vous verrez que nous avons une place
ici pour la définition Nous voulons que la définition soit exactement la même que celle de nos armes de lance Donc, si vous cliquez sur l'arme à lance, vous pouvez voir qu'elle contient la définition de l'
arme Cliquons ici avec le bouton droit de la souris et
sauvegardons-le dans les armes. Donc, à la racine,
nous passons aux armes, et nous avons une
définition de la lance. Nous voulons double-cliquer
et annuler cela. OK ? Voici donc notre véritable définition des armes de
lance, et il s'agit désormais d'une ressource
partagée Nous pouvons donc cliquer sur l'élément Lance et nous voulons charger rapidement
cette même définition de lance Maintenant, l'objet de lance va être
lié de cette façon
à l'arme de lance Pour que nous puissions réutiliser
l'arme à deux reprises. Sauvegardons cette
branche en tant que scène Cliquez avec le bouton droit sur Enregistrer la branche en tant que SN. Et mettons-le dans
le dossier des armes en tant que point TCN pour armes de
lance Bon, maintenant nous
pouvons le réutiliser sur les ennemis ou
partout où nous en avons besoin. L'essentiel est simplement
de nous assurer qu'ils utilisent la même définition de
lance, ce qui est très important, sinon l'objet de
lance ne
pourra jamais trouver l'
arme de lance dans l'équipement. OK, maintenant nous avons fait
tout le travail de base. Dans la prochaine vidéo, nous allons
configurer l'interface utilisateur et passer au niveau supérieur
pour améliorer nos armes
47. P46 Créer un système de sélection d'objets pondérés pour des récompenses de niveau supérieur: À ce stade, nous devons
ajouter une liste d'armes
à notre sélection de niveaux parmi lesquels nous pouvons choisir lorsque nous
remplissons la fenêtre C'est donc là qu'interviendra le script des options de
mise à niveau,
où, pour un
monde ou un niveau de jeu donné, nous n'aurons que cette
gamme d'objets que nous
pouvons attribuer dans la sélection de
niveau supérieur Donc, dans le script de
sélection de niveau supérieur, nous devons exporter
une réalité virtuelle pour les options, et ce sera
du type options de mise à niveau OK, nous enregistrons donc ce script, et maintenant, si nous examinons l'
inspecteur et deux vues en D, cliquez sur Sélection de niveau supérieur, puis sur
la droite, nous pouvons créer nos nouvelles options de mise à niveau Maintenant, c'est quelque chose qui est probablement très spécifique au niveau. Vous pouvez donc avoir un niveau 1 où vous avez de nombreuses options, puis un niveau deux, peut-être que
c'est un peu plus difficile, donc vous limitez la liste des objets, ou cela peut même être par classe de
personnage si vous décidez de suivre cette voie qui consiste à
restreindre les objets à des personnages
spécifiques Quoi qu'il en soit, il s'
agira d'une ressource sur laquelle vous souhaiterez cliquer avec
le bouton droit de la souris, puis
enregistrer dans le projet. Passons donc, disons,
au dossier des paramètres, puisque c'est pourquoi j'ai mis le script des
options de mise à niveau, puis nous allons insérer les options de mise à niveau de niveau
1,
puis enregistrer, donc ce sera un point Et maintenant, nous pouvons attribuer
un tableau d'éléments. Je vais donc
porter ce chiffre à un, et nous allons charger rapidement l'arme de
la lance. C'est maintenant l'une
des possibilités que nous
pouvons utiliser dans notre script de sélection de
niveau supérieur. Dans notre hiérarchie, nous voulons que la sélection de niveau supérieur
transmette les options, disons à
ce conteneur HBox, dont nous pourrions dire qu'il
ressemble davantage à la sélection de récompenses Donc, en termes de hiérarchie, nous avons défini l'option au
niveau de sélection supérieur. Lorsque nous ouvrirons le menu
pour améliorer le niveau de
notre personnage, nos sélections
de récompenses seront renseignées ici dans
cette boîte en H. Ainsi, chacune des récompenses que nous avons
été autorisés à choisir apparaîtra
sous forme d'option ici. Par défaut, ce serait trois. Mais en réalité, cela
dépend du nombre
d'articles disponibles. Nous pourrions donc renommer
ce conteneur HBox en un conteneur de boîtes de
récompenses,
puis cliquer avec le bouton droit de la souris
et lui donner un script Je vais donc joindre un script, et nous allons l'enregistrer dans UI
slash Rewards Box Container Si je fais cela, c'est parce que plus vous séparez les différentes fonctions de votre interface utilisateur globale en
scripts plus petits, plus chacun de
ces composants
sera réutilisable car vous
séparerez les responsabilités. Le contenant
de la boîte de récompenses sera donc uniquement chargé de
remplir les récompenses qui se trouveront en dessous Nous allons donc créer un conteneur de boîtes de récompenses contenant le
nom de la classe, puis nous allons exporter une scène complète
à partir de
laquelle chacune de ces sélections de
récompenses sera illustrée. Ils ne seront donc pas vraiment
là. Et l'interface utilisateur de base sera
supprimée et instanciée uniquement lorsque nous aurons une récompense à remplir Créons donc une
fonction remplie
et cela nécessitera
une liste d'options Et nous voulons également
savoir combien d'articles peuvent être sélectionnés
en même temps. Je pense donc que les options de nivellement
seraient un bon endroit pour placer cette propriété
plutôt que l'interface utilisateur elle-même. Faisons donc un clic droit sur les options de
mise à niveau, symbole de recherche Et je vais dire à l'export var MAX
Underscore Choices, qui sera un entier, et je vais le définir par défaut à trois Et pendant que nous sommes en
avance, je souhaite apporter un changement important à
cette gamme d'articles. Je vais en fait le
remplacer par un dictionnaire d' éléments afin que nous puissions appliquer
un poids à chacun d'eux. Ainsi, si nous voulons donner la
priorité à un élément comme option possible,
nous pouvons le faire
en augmentant
efficacement son taux de chute en lui donnant valeur flottante plus élevée ou
une valeur flottante plus faible
pour les objets plus rares Maintenant que j'ai changé le
type de cette variable, cela signifie
que je dois la réinitialiser dans la sélection du niveau. Donc, si nous passons à la sélection
des niveaux et que nous examinons notre
nouveau dictionnaire ici, nous devons donner l'élément. Chargez donc rapidement cet objet en forme de lance,
puis donnez-lui une valeur. Nous pourrions en dire un si nous le voulons. Maintenant, cette lance a une
chance de chuter de 1,0. Et tout comme dans les autres
cas où nous avons utilisé des poids de manière aléatoire, ce 1,0 est relatif au poids total de
tous les autres éléments de cette liste Donc, à l'heure actuelle, c'est
100 % parce qu'il n'y a un
seul poids de plus de 1,0,
donc c'est un poids sur un. Mais si nous ajoutons quatre articles supplémentaires, nous aurons 20 % de chances. Et, bien sûr,
comme nous proposons trois choix, le jeu sera lancé trois fois. Une fois que nous avons sélectionné un article
dans notre liste déroulante, il est également retiré du poids
global. Si nous avions cinq options, nous en
prendrions trois, trois choix uniques,
je dois dire. Passons donc au conteneur de la boîte de
récompenses. Nous avons maintenant le nombre de personnes parmi lesquelles nous
allons réellement choisir. Oh, et nous voulons
connaître le poids total. Liste des options, en
veillant à ce que chacune soit disponible pour être utilisée
avec la cible spécifique. Créons donc une autre
fonction pour cela. Je vais l'appeler fonction,
générer des choix. Pour ce faire, nous allons prendre
les options P comme options de
mise à niveau et la cible
P comme un nœud deux D. Bien,
nous voulons d'abord obtenir les choix
restants dans la liste des options Donc, si nos options restantes doivent être égales, disons, au poids de l'article de
Poptionst
ou au poids des articles, et que nous allons
dupliquer OK, nous le dupliquons
ici parce que nous voulons ce dictionnaire des
articles Pour être spécifique à cette
fonction, nous ne voulons pas modifier
le dictionnaire d'origine en supprimant des éléments de
ce dictionnaire. Toutes les
options de mise à niveau devraient rester dans les options de mise à niveau,
essentiellement pour
le reste du
jeu, car il s'agit d'
une définition de l'heure de l'éditeur,
et il s'agit de nos options le reste du
jeu, car il s'agit d'
une définition de l' heure de l'éditeur, d'exécution
restantes Nous dupliquons donc la liste, et nous allons la
supprimer après chaque sélection ou après avoir
invalidé une option potentielle Le doublon ici
est donc important pour
s'assurer que nous ne modifions pas
le dictionnaire d'origine. Effectivement. Nous avons maintenant
les options restantes. Nous voulons filtrer toutes les
options non valides. Donc, pour l'option dans les
options restantes, touches à points, pourquoi les touches ? Parce que les clés de
ce dictionnaire sont les éléments et les
valeurs sont les poids. Il peut donc être
utile de déclarer
le type ici, même s'il est
déduit du poids de l'article, il vaut mieux le
voir à l'écran Je vais donc dire
dictionnaire des articles, puis nous avons le poids. Oh, attendez, le poids flotte. Et là, nous pouvons voir très clairement que l'
objet, ce sont les clés. Et le float est la valeur. Pour chacun de ces éléments, nous voulons vérifier si
la cible peut l'appliquer ? En fait, il vaut peut-être mieux
appeler cet article ici. Pour un élément de type élément dans les options
restantes, nous pouvons dire que si le point d'élément peut s'appliquer et
parce que nous l'avons saisi ici, nous avons accès aux fonctions
du menu rempli
automatiquement Nous voulons donc voir si nous pouvons
appliquer cela à la cible P. Donc, si nous ne pouvons pas l'appliquer à la
pré-cible, inversons cela. Donc, si l'élément Doc ne peut pas
s'appliquer à la cible P, nous allons supprimer
la paire clé-valeur. Donc, lorsque nous utilisons les touches à points, cela nous donne un tableau. Ce tableau est donc séparé
du dictionnaire d'origine
, donc je pense que nous pouvons réellement modifier ce
dictionnaire sans problème car nous avons déjà le
tableau séparé de clés ici. Donc, cette boucle ici, si on modifie le dictionnaire, ça ne posera aucun problème. Normalement, il
faut faire attention à cela. exemple, vous ne devriez pas modifier un tableau pendant que vous le parcourez en
boucle, mais dans ce cas, ce tableau est distinct de
ce dictionnaire, donc tout devrait bien fonctionner Nous verrons avec certitude quand nous exécuterons
réellement le code. Donc, si nous ne pouvons pas appliquer l'élément, nous voulons le
supprimer de la liste
des options car
nous ne pouvons pas l'utiliser. Donc, les options restantes ne sont
pas supprimées ou Ease, oui. OK, ça s'appelle effacer ici. Et nous avons la clé juste là. La clé, c'est l'objet. Nous en
effaçons donc l'élément, et cela va le
supprimer en tant qu'option. Donc, après avoir
bouclé toutes les options, nous avons déjà filtré
toutes celles que nous ne pouvons pas appliquer Il ne nous reste plus qu'à faire une sélection en fonction
du poids total, et après avoir choisi chacune d'elles, nous les retirons des options
restantes. Notre poids total ici
sera donc un
flottant égal à 0,0, et nous devons passer une
fois de plus en revue les options
restantes. Nous pourrions donc dire quatre
poids à flot et les
options restantes valeurs de points, puis nous disons le poids total plus
égal à ce poids Je pense donc que c'est une façon assez
claire de l'écrire. Maintenant, nous avons totalisé le poids. Nous voulons faire une sélection
aléatoire entre zéro et
le poids total ,
puis voir
lequel nous avons choisi. Le
poids aléatoire VR sera donc déduit du type F
multiplié par
le poids total Nous l'avons donc fait à quelques
reprises au cours jusqu'à présent. Le poids total est
notre valeur maximale. 0,0 est notre valeur minimale. Et en prenant en gros 0,0 à une fois
le poids total, nous allons obtenir une valeur comprise entre zéro et
le poids total. OK, maintenant nous avons
notre poids aléatoire, et nous voulons choisir un article
parmi les options restantes. Et il va y
avoir une boucle
ici, d'ailleurs, mais nous pouvons d'abord l'écrire
pour un élément. D'accord, voici maintenant quatre
options parmi les options restantes. Nous allons donc dire que
si le poids actuel est supérieur ou égal
au poids aléatoire, nous choisissons cette option. Donc maintenant, nous avons également besoin d'un poids
actuel. Notre
poids actuel
sera donc un flottant égal à 0,0. Nous voulons donc d'abord ajouter
le poids de l'option. Donc, actuellement, ce
sera plus égal aux options
restantes pour cette option. Nous avons donc saisi la
clé du dictionnaire. Cela nous donne de la valeur, et c'est peut-être
un moyen plus sûr de le faire. Nous pourrions donc dire « optez pour l'option ». Et s'il n'y a pas d'option, la valeur par défaut est nulle. Nous indiquerions une erreur ici. Et peut-être que c'est
vraiment ce que nous voulons parce que nous nous attendons à ce
qu'il soit là. C'est un gros problème si nous
bloquons la paire clé-valeur, alors qu'elle n'existe tout simplement pas. Donc oui, nous allons simplement laisser
cela être exactement comme cela aurait été le cas en optant pour
l'option entre crochets. En fait, c'est la même chose
sauf que cette
fonction get vous permet d'
appliquer une sauvegarde par défaut avec une virgule puis une variante
par défaut C'est donc un peu plus
flexible, mais dans ce cas, nous voulons un échec brutal si
l'option n'existe tout simplement pas, car elle devrait certainement être OK. Nous avons donc ajouté
le poids actuel. Nous voulons vérifier si
le poids actuel est supérieur
au poids aléatoire. Donc, si le poids actuel est supérieur ou égal au poids aléatoire, nous allons l'ajouter à la liste des options sélectionnées. Nous pourrions simplement déclarer les options
sélectionnées
ici en haut. Donc var selected est un tableau d'éléments car c'est ce que nous
devons renvoyer à la fin. Nous allons donc ajouter
l' option au tableau
sélectionné donc sélectionné l'option d'
ajout, puis nous devons la
supprimer de la liste des options Et en fait, je pense que la
façon dont je vais procéder est de définir une variable
locale ici. Donc, si notre prochaine
sélection est égale à zéro, nous ferons la sélection suivante. Égal à cette option,
puis pause. Nous sortons donc
de la boucle des quatre. Nous n'avons plus
besoin des quatre boucles. Après cette boucle, la valeur suivante
sélectionnée n'est pas nulle. Ensuite, nous allons
sélectionner l'option d'ajout de points. Sinon, nous voulons sortir
de l'ensemble de nos quatre boucles. Nous avons donc besoin d'une boucle à quatre,
car nous allons le
faire plusieurs fois. Alors voyons voir. Donc je pense qu'
ici, 44 fois dans Range,
zéro, CP, options de
soulignement marquent Max
Choices avec incrémentation Cela signifie donc essentiellement que
nous passons de zéro
au maximum de choix, en augmentant d'un
à chaque fois. Lorsque nous atteignons le maximum de
choix, nous arrêtons la boucle. Donc, si le nombre maximum de choix est de trois, cela va être
exécuté trois fois. Ce sera zéro, un, deux, et quand il atteindra trois,
ce sera égal au nombre maximum
de choix. Je vais
arrêter la boucle à quatre. OK, donc en gros, il suffit de
prendre tout ça et de le survoler, et maintenant
tout ce code va tourner en boucle, non ? Ainsi, dans le cadre
de l'ajout de l'option, nous voulons également prendre
le poids total, et nous voulons que moins
soit égal au poids de l'option Nous dirons donc que les
options restantes n'obtiennent pas d'option. Je suis conscient que c'est
encore une fois ce nom, mais ce n'est pas
vraiment grave. Cela va donc obtenir la valeur
flottante du poids. Nous
le retirons du poids total, puis nous voulons
revenir ici. Il y a donc aussi l'
autre possibilité, qu'il n'y a
rien de sélectionné, ce qui signifie qu'il
n'y a plus rien à sélectionner. Nous pourrions donc simplement
sortir tôt de la boucle des quatre. Nous en parlons
donc pour Loop ici. Et ça me
semble probablement bon. Il suffit de
renvoyer le produit sélectionné. Donc, retour sélectionné. Donc,
à la fin, nous obtenons jusqu'à trois articles. Pour chacun de ces éléments, nous voulons remplir l'interface utilisateur Supposons que la réalité virtuelle soit ici, les
choix seront égaux pour générer des choix
sur les options P, et nous introduisons la cible
P afin de
pouvoir comparer chaque objet à
sa cible pour nous pouvoir comparer chaque objet assurer qu'il est valide. Nous avons donc le choix ici maintenant. Ensuite, nous voulons créer la scène de sélection du
barreau et lui attribuer le choix ici en bas Comme ce bit se trouve en fait en
dehors de ces quatre boucles, nous voulons ajouter le
suivant sélectionné car nous avons défini le suivant sélectionné ici égal à l'option afin de pouvoir l'
utiliser en dehors des quatre boucles Nous voulons donc dire «
suivant sélectionné » ici, et nous voulons également
passer au suivant sélectionné. Donc, une autre chose que j'ai
oublié de faire ici, c'est qu'après avoir
ajusté le poids total, j'ai également oublié de
supprimer la prochaine option sélectionnée
parmi les options restantes. Nous diminuons donc le poids total parce que nous
supprimons l'option, puis nous
la supprimons de la liste dans laquelle
nous effectuons notre sélection. Donc, lorsqu'il
reviendra ici pour
les quatre prochaines boucles pour
les options restantes, il n'y aura pas
cette option, et il l'
ignorera complètement parce qu'
elle ne figure plus dans ce dictionnaire, et c'est
ce que nous voulons. Pour les options restantes, nous voulons simplement parcourir
en boucle ce qui reste une sélection possible, en collant les sélections
déjà effectuées
48. P47 Codage de la sélection de récompense avec propagation du signal: À partir de notre fonction Générer des
choix, nous avons cette gamme de choix. Cela pourrait en fait nous
aider visuellement de déclarer le type ici
plutôt que de le déduire Donc, puisque nous avons un tableau, nous voulons le
parcourir en boucle. Donc, pour chaque choix, nous créons une instance de notre scène de sélection de
récompenses, puis nous allons appliquer
le choix à cette scène, gros définir le choix
sur la scène et le faire remplir sa sous-interface utilisateur avec
tout ce dont nous avons besoin Donc, pour le choix des choix, nous allons créer
une sélection de récompenses, qui est actuellement un contrôle, et cela sera égal au
point Instantiate de la scène de sélection de
récompenses Ensuite, nous devons l'ajouter en tant qu'
enfant à ce conteneur HBox. Ajoutez donc un enfant de la sélection
Reward. Ensuite, nous indiquerons le point de
sélection des récompenses SetHoce et nous y transmettrons le
Choice. Notre sélection de récompenses, que vous pouvez voir ici, ne
contient actuellement aucun script. Cette fonction n'existe pas, nous devons
donc créer une
fonction dans le script, et nous allons le faire
dans la scène compressée. Nous voulons donc cliquer sur
Ouvrir et éditer. Nous passons donc à la scène
originale compressée pour cet élément d'interface utilisateur en particulier. Donc, lors de la sélection des récompenses, nous voulons cliquer sur
joindre un nouveau script, et nous l'appellerons
Uilashrewardselection Créez ça. Et à côté d'ici. Nous lui donnerons le
nom de classe Rewards selection ce qui facilitera grandement remplissage automatique de ses fonctions. Et ce qui nous intéresse ici,
c'est le choix de l'ensemble de fonctions, et nous allons
transmettre un choix. Et ce choix est un objet. Je m'en souviens. Cela
sera donc annulé. Et à partir de là, nous devons
renseigner tous ces éléments. Je vais donc prendre
l'étiquette Rich Text et la renommer en étiquette
de nom Renommons le texte
direct en icon rect. Renommons la
deuxième étiquette de texte enrichi
en étiquette de description, et renommons le bouton en bouton
de sélection D'accord, cela expliquera beaucoup plus clairement ce qu'ils sont censés faire
réellement. Maintenant que nous avons
configuré ces paramètres, revenons
au script
de sélection des récompenses et obtenons une référence
à chacune d'elles. Maintenant, comme je l'ai
fait tout au long du cours, et je pense que même dans ce cas, je préfère toujours faire une variable at export et nous dirons
quelque chose comme name label. Est un type d'étiquette de texte enrichi, quel
qu'il soit. OK, et ensuite vous pouvez
simplement l'attribuer dans l'inspecteur. Nous savons
comment faire, non ? Mais cela signifie que chaque fois que vous configurez une copie du script, vous devez définir manuellement
les variables d'exportation. Donc, juste pour montrer une autre option, vous pouvez utiliser on ready var, disons, icon Rec et ce sera
une texture rect. Ensuite, vous lui donnez un signe
écologique et vous
lui donnez le chemin qui porte son nom. Donc, si je dis « Choisir le bouton », il sera automatiquement renseigné
ici. Nous pouvons le sélectionner. Et je pense que cela nécessite le signe de
1$ au début. Donc, signe dollar, marge, conteneur,
barre oblique, conteneur, barre
oblique, bouton Maintenant, cela signifie
qu'une fois prêt, il obtiendra automatiquement le chemin de
ce nœud et
l'attribuera directement au texte. Nous n'avons donc pas besoin de le
configurer manuellement dans l'inspecteur. Cependant, il y a
un défaut majeur ici, savoir que cela nécessite que le chemin d'accès à cet
élément soit le même Donc, si votre bouton de
sélection s'appelle
autre chose que le bouton de sélection, il
ne le trouvera pas. C'est donc l'une des raisons lesquelles je préférerais faire un at Export, car si vous réorganisez
vos nœuds ici, tant que vous
avez toujours l'ensemble de références, cela ne
cassera pas votre script OK, c'est pourquoi je
ne l'utilise généralement pas, et je vais revenir
à at Export var icon Rect, qui
sera une texture Rect. Et puis nous voulons Exporter l'étiquette de
description de la variable, qui est une étiquette en texte enrichi ici bouton
Exporter la variable, choisir. C'est un bouton. OK, et pour le choix du set, retournons simplement le pass pour
le moment afin que le script puisse être enregistré et cliquons
sur Sélection de récompenses. Allez en haut à droite et
assignez chacun d'entre eux. Donc, étiquette de nom à étiquette de nom, icône Rect à icône Rec, étiquette de
description à étiquette de
description. Et comme nous avons
deux étiquettes de texte enrichi, il
est
vraiment utile d'avoir noms
informatifs tels que
étiquette de nom et étiquette de description des noms
informatifs tels que
étiquette de nom et étiquette de description au lieu de
les appeler toutes deux texte
enrichi et étiquette de texte enrichi deux. Je tiens juste à le
souligner. Et enfin, choisissez le bouton que nous attribuons au bouton Choisir. Nous avons donc maintenant une référence
à tous ces éléments, et nous pouvons facilement
les remplir avec les informations
de notre article. OK, maintenant, pour
gérer le choix des ensembles, nous pouvons utiliser le texte à points de l'
étiquette du nom, et ce sera égal
au nom de l'élément. Donc, pour le moment, notre classe d'articles
n'a pas de nom. La sous-classe des objets d'armes
possède une définition, et cette définition a un nom, mais nous souhaiterions peut-être un nom spécifique à
l'objet, et je pense que ce serait l'approche la plus simple pour créer un nom d'objet
dans la classe d'objets Donc, si nous passons à
l'élément, nous pouvons le faire sur Exporter le nom d'affichage VR, qui
sera un nom de chaîne, et je le ferai par défaut
sur un élément sans nom Il s'agit donc en quelque sorte de faire la distinction
entre l'objet et la définition de
l'arme, car un objet n'est pas toujours
nécessairement une arme Nous pouvons
donc distinguer ceux qui ont deux propriétés distinctes, du
moins pour le moment Revenons maintenant
à la sélection des récompenses, et nous choisissons le nom d'affichage à
points pchoice Permettez-moi de jeter un œil à la définition de l'objet en forme de
lance, et nous pouvons en quelque sorte voir ici La définition ici
est donc plutôt conçue pour être une définition de l'arme,
de la façon dont elle augmente de niveau et de
ses dégâts. La description de l'objet
semble donc devoir être séparée, car vous pourriez vous procurer une copie de cet
objet sur la carte du monde, et elle indiquerait quelque chose comme
« Oh, c'est une lance Cela donne à votre joueur
la possibilité de posséder l'arme, mais ce n'est pas la définition
de l'arme elle-même. Nous voulons donc les
distinguer. Nous pouvons donc dire que le texte
du point de l'
étiquette de description sera égal à la description du point
pchoice Maintenant, nous avons besoin de l'article pour
avoir une description. Copions ce nom, cliquez avec le bouton
droit de la souris sur l'élément, le symbole Lou. Et nous allons le faire dans
Export var, eh bien, et dans export
var, nous allons coller la description, qui est une chaîne, et
qui sera vide par défaut. OK, maintenant, pour ce qui est de la
sélection des récompenses, c'est réglé. Ensuite, nous voulons
faire l'icône Rect. Nous pourrions donc dire que la texture
du
point droit de l'icône sera égale
à celle de l'icône du point pchoic Encore une fois, l'objet est distingué de la définition de l'
arme. Il doit avoir sa propre
icône qui peut être définie. Je vais donc
exporter la texture des icônes VR. OK, et nous avons
l'icône de texture, nous pouvons
donc revenir à la sélection des
récompenses. Maintenant, je veux faire attention
, car si vous essayez de
définir l'icône pchoict
alors qu'il n'
y a pas d'icône de point pchoic, vous obtiendrez
une référence nulle dès que
vous essaierez une référence nulle dès que
vous essaierez Vous pouvez donc soit
vérifier manuellement si l'icône
existe à chaque fois, soit la remplacer pchoic point Get icon et
intégrer cette sécurité. Mais ensuite, nous devons ajouter cette
fonction à la classe d'articles. Faisons donc un clic
droit sur le symbole, puis je vais créer notre icône de
fonction G ici, l'icône de la
fonction G, et cela renverra
une texture ou rien. Donc, s'il s'agit d'une icône, alors nous renvoyons une icône, sinon nous renvoyons une valeur nulle. OK ? Je pense que c'est assez simple. Cette méthode nous donne de
la sécurité au cas où elle serait nulle, alors nous renverrons simplement null au lieu d'avoir
une erreur immédiate. La dernière est donc un
peu plus délicate ici. Nous avons le bouton Choisir. Lorsque le
bouton de sélection est enfoncé, nous voulons faire la
sélection avec le choix. Nous voulons donc que le bouton
connaisse le choix. Ensuite, nous transmettons
le signal indiquant que le bouton est enfoncé
jusqu'à notre sélection de niveau supérieur
afin que nous puissions appliquer l'effet au joueur
et fermer le menu. Donc, au niveau de la
sélection des récompenses, nous voulons lier le signal
du bouton enfoncé au choix que nous transmettons
ici, le choix de l'objet, et nous l'émettrons sous forme de signal
lors de la sélection des récompenses, puis la
sélection de niveau supérieur se connectera à cela en remontant dans la chaîne
et nous pouvons essentiellement savoir au
plus haut et nous pouvons essentiellement savoir au niveau quand
l'un des on appuie sur nos boutons, puis on applique les effets à notre lecteur. Nous allons donc devoir utiliser,
disons, un bouton de choix. Nous allons donc devoir faire choosebton press point Connect, et nous allons
connecter cela à une nouvelle fonction Mais nous allons
le lier au choix P. Ainsi, lorsque nous
le lions, nous
passons essentiellement un paramètre supplémentaire
au rappel que cette fonction n'
aurait pas normalement Ainsi, la fonction soulignement la
récompense est pressée
obtient maintenant le choix P, qui est un objet, et il
sera annulé,
et maintenant nous pouvons continuer à transmettre
ce choix dans la hiérarchie Nous pouvons donc avoir un signal
AR en haut,
qui indiquera le signal sélectionné, qui sera transmis au
choix de l'article. Il ne nous reste plus
qu'à émettre ce signal, ainsi sélectionné. Point I MIT, et on
passe le choix P, et maintenant il peut
monter dans la hiérarchie. Donc oui, normalement, une pression sur un bouton n'
a aucun paramètre
lorsque vous le récupérez. Cela indique simplement que
le bouton a été enfoncé. Mais en appelant bind, nous ajoutons ce paramètre supplémentaire chaque fois que vous appuyez dessus. Maintenant, notre bouton peut
nous donner des informations très critiques sur le choix
réellement fait. Techniquement parlant,
nous pouvons également définir la variable de choix local
ici, puis appuyer sur, nous pouvons simplement transmettre le choix local pour le
choix des articles. Donc, si je le définissais lorsque je
définissais le choix, cela
fonctionnerait également. Deux façons de faire
la même chose, mais maintenant vous connaissez une méthode beaucoup
plus cool d'utiliser la liaison, vous pouvez
donc ajouter
des paramètres supplémentaires. De plus, cela n'oblige pas la sélection des récompenses à
maintenir ce choix,
bien que cela soit certainement possible, et cela ne poserait aucun
problème ici. OK, alors montons plus
haut dans la hiérarchie. Maintenant, dans notre
sélection Lavop, que nous allons voir. Nous avons le conteneur Rewards
Box. C'est donc à partir de là que nous créons les
sélections de récompenses. Ici, je dois à nouveau propager
le signal vers le haut. Supposons donc que le signal soit sélectionné, qui sera transmis à l'élément de
choix comme ça. Ainsi, chaque fois que nous remplissons
notre menu de sélection de récompenses, et maintenant que nous
avons un nom de classe, nous pouvons et devons le remplacer
par une sélection de récompenses Et nous allons associer
cela aux récompenses sélectionnées. Donc, en bas de page, nous allons créer cette
fonction de rappel pour souligner
les récompenses sélectionnées Nous obtenons le P Choice, qui est l'article
que nous retournons annulé, et nous allons simplement le
propager vers le haut Donc, point EMT sélectionné. Nous allons émettre
avec le choix P. Cela remonte donc plus
haut dans la hiérarchie maintenant. C'est donc au niveau de notre conteneur de
boîtes de récompenses. Maintenant, pour ce qui est de la sélection de niveau supérieur, il ne
nous reste plus qu'à nous connecter à
notre boîte de récompenses. Exportons donc
notre conteneur de récompenses, qui est un conteneur de
boîtes de récompenses. Et une fois prêt, nous voulons nous
connecter à son signal. Le conteneur de récompenses est
sélectionné par point et se connecte à la récompense sélectionnée. Fonction soulignée
sur Reward, sélectionnée. Permettez-moi de zoomer
un peu. Et nous allons avoir notre choix P, qui est l'article, et
nous le retournerons nul. Nous allons donc passer à autre chose pour le moment, et nous allons devoir appliquer l'effet au joueur
et fermer le menu. Nous y reviendrons dans une seconde. Nous avons donc eu notre méthode
de sélection de départ. Ce que nous voulons faire, c'est simplement réinitialiser le conteneur de la boîte de récompenses. Nous voulons qu'il soit renseigné,
mais nous voulons également qu'il
efface tous les éléments existants Donc, dans le conteneur de la boîte de récompenses, je vais remplir le formulaire souligner
et générer des choix Je
soulignerai également le caractère privé afin que nous ne l'
appelions pas accidentellement depuis notre interface utilisateur principale Ici, nous devons
souligner, car
nous faisons en sorte que le soulignement
génère des choix Créons maintenant la fonction que
nous allons réellement appeler. Donc, choix de configuration des fonctions. Ouais. OK, c'
est logique. Et nous allons
transmettre nos options P, qui sont des options de nivellement, et nous allons
transmettre la cible P, qui est notre nœud
deux D. Bien sûr, nous allons renseigner ces options et notre Mais avant cela, je tiens également
à effacer ce menu. Donc, pour toutes les cases pour enfants, je dois soit
les supprimer avant de les remplir, soit m'assurer
que mon fichier réutilise l'interface utilisateur existante,
puis les met à jour
avec les nouveaux choix Donc, comme nous n'aurons
que quelques choix ici,
il serait un peu
exagéré de trop s'inquiéter réutilisation de tous les
composants
possibles de la sous-interface utilisateur Donc, l'option la plus simple
à court terme serait certainement de simplement l'effacer, ce qui sera
pour les enfants et les enfants. Nous allons juste
appeler child point Q gratuitement. Alors maintenant, ici en haut, nous pouvons effacer avant de remplir. Oh, et nous devons terminer un type de retour pour
les choix de configuration. Nous retournerons donc nuls. OK. Ouaip. Maintenant, configurez Choices, c'est ce que nous pouvons appeler dans notre script de sélection de niveau. Alors commencez la sélection,
nous allons faire conteneur
de
récompenses Start Selection, et cela va passer aux options et à
la cible, qui est le joueur contextuel. Et ce n'est pas le bon
nom pour la méthode. C'était en fait Setup Choices. OK, nous commençons donc la sélection.
Nous définissons les choix. Nous attendons que le joueur
choisisse un choix, puis nous allons
recevoir notre rappel À ce stade, nous
voulons fermer le menu. Nous pourrions donc dire «
container de récompenses » point CE ici. Et j'en ai fait
une méthode privée. Donc, dans le contenant de la boîte de récompenses, je vais simplement supprimer le
soulignement ici et ici D'accord, maintenant il est
appelé en interne, mais aussi à partir d'autres scripts. Donc, si vous devez rendre une méthode
publique, vous pouvez le faire. Techniquement, encore une fois,
GD Script ne vous
empêche pas d'appeler une méthode marquée d'un trait de
soulignement Il s'agit simplement de la meilleure pratique
pour indiquer l'intention. Pour en revenir au niveau de sélection
des récompenses sélectionnées, nous voulons appliquer l'
effet de l'objet au joueur. Nous allons dire p choice point
Essayez d'appliquer au joueur. Ce sera donc le lecteur
de points contextuels. Ensuite, nous nettoyons le conteneur
et nous fermons le menu. OK, alors voyons voir. Nous allons
juste nous cacher ici. Et c'est peut-être à
peu près tout ce dont nous avons besoin. Donc, un peu de nettoyage ici. Passons au contenant de la boîte de
récompenses, et bien, laissez-moi vous montrer la vue en
deux D, en fait. Ici, vous pouvez voir que nous
avons ces trois cases ici. Les avoir dans la
vue ici est acceptable tant que nous les
libérons avant de commencer à utiliser quoi que ce soit. Donc, si nous passons au conteneur Rewards
Box prêt, je vais appeler Clear. Donc, le soulignement de la fonction est prêt. Discutons clairement de
ces éléments de l'interface utilisateur. Cela signifie qu'ils seront
supprimés et qu'ils seront recréés chaque fois que le conteneur Rewards
Box apparaîtra. Nous voulons que ce soit aussi
optimal que possible. Il est
préférable de
réutiliser chaque composant de l'interface utilisateur plutôt que de devoir le
recréer à partir d'une instance Mais pour quelque chose de
simple comme celui-ci, vous n'allez montrer qu'une seule
fois, je ne sais pas, 30 secondes de jeu, cela ne devrait avoir pratiquement aucun impact, et ce n'est pas vraiment grave. OK, nous avons donc toujours
la sélection des lances ici. Donc, si nous
essayons réellement de monter de niveau, nous devrions voir une sélection. Il est certainement temps d'aller de l'
avant, de le tester et de voir si nous le faisons réellement apparaître et fonctionner. Alors, appuyons sur Play. Et
nous verrons comment cela fonctionne. OK, il
semblerait que j'ai oublié de placer le conteneur de récompenses ici
lors de la sélection de niveau supérieur. Passons donc à la
sélection de niveau supérieur. Cliquez dessus. Et dans la hiérarchie, nous devons attribuer le conteneur de récompenses. C'est donc vraiment la faiblesse des propriétés exportatrices, n'est-ce pas ? Si vous oubliez de le définir,
il n'y a vraiment
aucune indication, que vous allez rencontrer des erreurs à un
moment donné dans le code. Nous n'avons donc pas besoin d'un assertion
car la connexion au signal va
déjà
générer une erreur
dès qu'elle échoue. Fermons, et
nous recommencerons. OK, alors allons
chercher notre article. Boom, nous n'avons qu'une seule
option parmi laquelle choisir. Nous avons donc nommé l'article ici. Je pense que je n'ai tout simplement pas défini
d'icône ou de description, mais vous pouvez voir que
la méthode Get icon, étant donné que nous avons traité
les cas nuls, ne nous
donnera pas d'erreur. Alors que si nous
référençons directement la propriété point icon
parce qu'elle est nulle, cela générerait une erreur ici. Si nous appuyons sur Choisir, cela
s'appliquera-t-il au joueur ? Découvrons-le donc. Cela devrait fermer le menu. Oui, mais j'ai oublié
de reprendre le jeu. Nous devons donc revenir ici
et
nous assurer qu'après avoir masqué le menu ou peut-être
même avant de le masquer,
nous dirons que Geth point paused
est égal à false Sauvegardons cela et
exécutons une fois de plus. Nous venons donc ici, nous
faisons notre sélection, choisissons l'article.
Boom, c'est déjà là. Cela semblait fonctionner, mais le vrai test
serait que si nous avions un écran indiquant les niveaux
de nos
armes ici, nous y
travaillerons dans un moment. Pour l'instant, la meilleure chose à faire serait de toucher de près, et passons à notre lance. Je vais atteindre le niveau deux, et nous allons changer
le temps de recharge à 0,1, car ce sera très évident si nous passons à ce niveau Alors appuyons à nouveau sur Play.
Je vais chercher notre objet, je vais appuyer sur Choisir, et nous verrons que le temps de recharge
ne se met pas à jour Il y a donc quelque chose qui cloche un
peu dans le code. Je pense donc que le
problème
réside en fait dans l'
arme elle-même. Je vais vérifier ici pour m'
assurer que nous attribuons réellement le niveau supérieur
, donc point d'arrêt Et laissez-moi voir si tout est prêt, nous obtenons la
définition du temps de refroidissement du chronomètre. Mais vous pouvez voir ici que nous
réglons l'heure
du chronomètre ici. Mais je parie qu'en fait, nous ne remettons pas
le chronomètre à une nouvelle valeur. Donc, oui, c'est un problème
très clair. Nous devons dire le point du chronomètre. Disons simplement
que start sera la nouvelle valeur. Nous devons donc faire le temps de recharge
G. Nous devons obtenir le point de
définition Obtenir le temps de recharge d'un niveau actuel Donc définition, point Obtenir le
temps de recharge de notre niveau. Cela signifie que chaque fois que
nous réinitialisons le chronomètre, nous obtenons le temps de
recharge actuel de notre niveau Donc, disons à
mi-chemin du tir d'un projectile, nous modifierons notre temps de recharge en fonction de l'
augmentation de notre niveau. Cela signifie que la prochaine fois que le projectile sera lancé
après son lancement, nous allons réinitialiser le
chronomètre avec notre nouvelle valeur À présent, il utilisera la propriété
de niveau 2. Et je pense que je n'ai même pas besoin
de ce point d'arrêt. Je suis presque sûr
que c'est le problème. Allons-y et appuyons sur Play. Je vais aller chercher
notre arme, appuyer sur Choisir, et voilà. Nous avons essentiellement une lance de
mitrailleuse parce que notre lance atteint le niveau 2, et ça va
complètement bouleverser la partie Je recommande donc qu'à la fin, nous ramenions le temps de
refroidissement de notre projectile à 0,9 maintenant que nous savons qu'il fonctionne, et ce sera la fin de
cette vidéo
49. P48 Application de statistiques sur le niveau d'arme à la création et aux instances de projectile: Cela montre que nous pouvons améliorer
nos armes grâce à la sélection de récompenses
au niveau supérieur, mais nous devons nous
assurer que lorsque nous augmentons le niveau de nos armes,
nous utilisons toutes les
statistiques correctes pour l'arme, pas seulement la réduction du temps de
recharge. Passons donc au
script du projectile. Et nous allons voir à
l'intérieur que nous n'
utilisons pas encore les statistiques
du niveau de l'arme. Nous utilisons une vitesse intégrée, et les dégâts finaux
ne sont pas causés par un
simple calcul. Il passe simplement 100
comme variable locale. Donc, si vous avez remarqué la définition du niveau de l'arme n'utilise pas
encore ces statistiques, eh bien, voici Donc, lorsque nous créons
le projectile, nous devons également passer au niveau de l'
arme Nous pourrions avoir une fonction totalement
distincte pour le faire, mais je pense qu'il serait peut-être
plus pratique de simplement intégrer statistiques
du niveau de l'arme
dans la fonction de lancement. La fonction de lancement
vise donc non seulement à définir
la direction, mais également à configurer les statistiques
spécifiques au projectile, mais le lancement vise
également à configurer les statistiques spécifiques au lancement ce projectile en fonction du niveau
actuel de l'arme Comme périmètre supplémentaire,
nous allons donc vouloir passer
au niveau P, qui est un niveau d'arme. Ce seront donc toutes les statistiques
que nous devons apporter ici. Et au lieu d'avoir une vitesse au
sommet, je vais supprimer et
nous allons plutôt
dire variable du niveau du
type d'arme, et c'est de là que nous allons
extraire toutes les statistiques. Donc, lorsque nous effectuons le processus
physique et que nous devons multiplier par la
vitesse, nous allons créer un niveau. Vitesse des points. OK.
Nous allons l'ajouter. Et maintenant, au lancement, nous devons définir le niveau
égal au niveau P. OK, c'est ainsi que
nous extrayons les statistiques, puis il nous suffit de
mettre à jour nos appels pour les lancer. Mais il y a d'autres informations pertinentes
ici. Donc, tout d'abord, lorsque la
zone de frappe touche une case RT, nous devons déduire
les dégâts des statistiques du niveau. Nous avons donc besoin d'un calcul aléatoire
des dégâts entre les dégâts infligés par
nos hommes à l'
arme et nos dégâts maximaux. Je vais donc supprimer cette ligne, et nous dirons que var damage
sera un entier, égal
à une plage entière aléatoire comprise entre les dégâts minimaux
et les dégâts maximaux. Donc, point de niveau, dégâts minimaux, puis point de niveau, dégâts maximaux qui gèrent le
caractère aléatoire ici. Nous avons donc
nos derniers dégâts. Je dirais simplement que c'est égal
aux dégâts actuels, puis nous répercutons nos derniers
dégâts sur la boîte Hurt. Maintenant, nous avons également
des dégâts aléatoires basés sur le niveau et
la vitesse définis par le niveau. Donc, si nous examinons un script d'
arme en deux D maintenant, nous allons recevoir une erreur lors lancement de points de
projectile, car nous devons passer au
niveau actuel de l'arme deux D, qui est facilement configuré ici sur l'arme deux D.
Donc disons simplement coma, niveau de l'
arme ici, et cela le fait simplement passer du niveau
de l'arme à l'instance du projectile Nous pouvons donc tester ces modifications
en lançant le jeu dès maintenant. Nous allons donc rechercher notre ennemi ou celui de notre ennemi partout où
il aura envie de se reproduire. OK, il y en a un. Et
vous verrez que les dégâts infligés par nos
hommes à MAX sont aléatoires. Actuellement, vous pouvez
voir qu'il
passe toujours par l'ennemi,
voici notre niveau supérieur. Donc, en théorie, cela
devrait aller un peu plus vite en termes de
refroidissement et de dégâts. Vous pouvez voir les
dégâts là-haut. Donc, dans l'ensemble,
cela semble fonctionner. Mais il reste encore quelques
points à ajuster,
comme le nombre de coups qu' il peut effectuer avant de supprimer réellement
le projectile Donc, pour Hipbox Hit, nous voulons augmenter le
nombre de coups que nous avons effectués, et si les coups sont égaux ou supérieurs
à notre nombre maximum de coups, nous voulons libérer
notre Donc, ici en haut,
nous aurons un var hits, et ce sera un entier. Ça va commencer à zéro. Et à chaque fois que nous atteignons le succès. Je vais aller au début
et dire que var hit est égal à P hurt Box
point Tri Damage. Ensuite, nous dirons : je frappe, puis je frappe plus égal à un. Et puis nous pouvons aussi
dire que si le nombre de coups est supérieur ou égal au niveau maximum de coups, alors nous allons
libérer notre projectile Maintenant, cela peut être libéré si le temps imparti pour sa persistance
dans la scène de jeu est expiré, ce que nous devons
d'ailleurs remplacer par la variable ici également Ou si le nombre
de coups atteint son maximum, il sera également libéré
immédiatement. Donc, ici, nous voulons également dire que lorsque nous
créerons le chronomètre, nous allons récupérer
les propriétés du niveau. Nous disons donc niveau, et je ne pense pas que nous
l'ayons encore défini. Nous avons donc besoin d'une durée. Créons une
statistique de durée pour notre arme. OK, donc nivelez la durée des points. Cela signifie que nous devons
passer au niveau de l'arme. Recherchez le symbole, et créons une durée
ici en bas. Nous dirons qu'à l'exportation,
la durée de la variable sera un flottant égal à 5 secondes par défaut. C'est donc le temps
maximum pendant lequel projectile peut persister dans
le monde du jeu avant d'être retiré, supposant qu'il ne soit pas
retiré par quelque chose d'autre, par exemple en touchant ou en dépassant
le nombre maximum de coups OK, alors allons-y et
appuyons à
nouveau sur Play . Je vais donc appuyer sur Play. Voilà notre projectile de lance, nous allons attendre que
des ennemis apparaissent nous allons attendre que
des ennemis apparaissent.
D'accord ? Nous l'avons donc. Et vous pouvez voir, chose
très importante, que dès qu'un homme est touché, la lance se retire d'elle-même. C'est donc un énorme changement. Et si nous atteignons le niveau deux, cela devrait toujours être le même,
mais nos dégâts augmentent. Essayons de regarder
ce projectile, et il disparaîtra au
bout de 5 secondes. Donc 45. OK, là, vous pouvez
voir les projectiles disparaître du monde
du jeu C'est très important
car sinon, ils risquent de ne jamais être supprimés et ils occuperaient simplement les ressources
du système sans raison. Nous voulons donc qu'ils soient
automatiquement supprimés à terme. OK, maintenant, il y a
aussi quelques autres propriétés liées au niveau de
notre arme,
au délai d'apparition, au
décalage d'envergure et aux projectiles Nous devons donc nous assurer
que dans notre arme en D, nous générons réellement les
projectiles supplémentaires, que
nous les faisons apparaître par rapport au
décalage et que tous les projectiles
supplémentaires sont retardés après le lancement du
premier Et puis, avec le délai de propagation, tous les projectiles situés
après le premier ont un délai avant d'
apparaître. OK, passons aux armes
à D. Donc, chaque fois que nous lançons, nous avons besoin que les
projectiles apparaissent Nous avons donc besoin d'une
boucle à quatre, disons, quatre indices entre
zéro et le niveau de l'arme. Pointez les projectiles, puis
nous les incrémenterons d'un point. Nous faisons donc une boucle
à quelques reprises. Après le lancement de chaque projectile, nous allons attendre que
Kit Tree Create Timer, et nous avons besoin de ce point de
niveau d'arme Span Delay OK. Ensuite, nous allons
attendre la fin du temps imparti. Après la première boucle, nous attendons la fin du court délai
avant de créer
notre deuxième instance de projectile par lancer,
et nous créons des projectiles en fonction du
nombre de
projectiles autorisés par le niveau de l'
arme Plus tard, si nous le voulions, nous
pourrions également mélanger cela avec, par exemple, un bonus du joueur. Donc, si le joueur possède plus un projectile pour toutes les armes, nous avons une fonction qui lui permet d'additionner ces deux nombres
pour obtenir le nombre total de
projectiles Enfin, nous
devons générer un décalage aléatoire basé sur la distance
de décalage du niveau de notre arme. Donc, pour notre décalage, il sera égal
à un vecteur deux, puis nous allons
faire une plage
F aléatoire pour le X et le Y. Donc une plage F aléatoire, 1,0
à 1,0, puis une plage F aléatoire, de moins 1,0 à 1,0 Et on multiplie ce chiffre par le niveau de l'
arme. Décalage de points. Cela va donc nous
donner une valeur aléatoire entre la
distance maximale négative sur le décalage d'envergure, puis le
décalage maximum positif ici pour le X, et pareil pour le Y
et le Y positif. Cela donnera
donc techniquement une forme carrée car le X et le Y ne s'
affectent pas, donc il peut être négatif 1,0 sur X
et Y ou positif
1,0. Je pense que c'est bon. Nous essayons juste d'
avoir une compensation simple. Peu importe qu'il s'agisse d'
un carré ou d' un cercle, sauf si
vous voulez que cela compte. Je vais donc passer
au projectile et nous
allons ajouter le décalage OK. Cela fera en sorte que chaque fois que nous
lancerons le projectile, il sera légèrement décalé si nous
avons cet ensemble sur l'arme Donc, si je regarde l'article sur la
lance, eh bien, nous pouvons voir qu'ici nous
n'avons aucun décalage d'envergure se peut donc que nous voulions
en définir un. Voyons voir. Quel serait le décalage maximal en
pixels que je souhaiterais faire ? Peut-être cinq. Ensuite, nous n'en ferons que
cinq pour chacun d'entre eux. Ouvrez donc chaque
niveau d'arme, et nous en ferons cinq. Cela peut donc être
positif ou moins cinq ou n'importe quoi entre les deux
pour X et Y. Ensuite, je vais courir, et nous verrons comment cela se passe Alors, attention à l'endroit où
les lances apparaissent. Et vous pouvez voir qu'
ils sont un
peu décalés l'un par rapport à l'
autre, non ? Il n'est donc pas exactement dans la
même position à chaque fois. Et puis cela le rend aussi un peu plus intéressant
pour une certaine variance. OK, maintenant, ce que je veux faire c'est tester l'arme de
niveau 1, et nous allons passer à trois projectiles,
et je vais
faire en sorte que ce bondlay soit
0,05 seconde, ce 0,05 seconde, Alors jouons et lançons-le, et nous devrions obtenir une
chaîne de trois projectiles Un, deux, trois, un, deux,
trois, un, deux, trois. Vous pouvez donc en voir ici
un, deux, trois. Oh, maintenant, un petit problème, vous pouvez voir que si je fais une rotation après le lancement du premier
projectile, je fais
également pivoter
les autres projectiles lorsqu'
ils sont OK, donc pour cette rotation de Rads, je veux le calculer
en dehors des quatre boucles Je ne veux le faire qu'une seule fois. Une fois le premier
projectile lancé, tous les autres devraient être
bloqués dans cette direction Allons-y et appuyons sur Play. Et maintenant, si je me
déplace, mais que je fais une rotation, vous devriez voir que
les trois vont toujours
dans la même direction, qui est généralement ce que
vous voulez, je pense. Supprimons donc les
projectiles supplémentaires pour première fois, nous pouvons conserver ce décalage d'apparition personnalisé
pour tous ces Si vous le souhaitez, nous pouvons même définir un décalage d'envergure pour une arme
par défaut, mais c'est à
vous de décider si vous souhaitez revenir arrière et personnaliser les niveaux
d'arme par défaut Laisse-moi regarder le script du niveau des
armes une fois de plus et voir si
nous avons tout géré. Donc, dégâts minimaux, dégâts
maximaux, vitesse, refroidissement des projectiles,
maximum de coups, décalage, délai et Oui, nous utilisons toutes
les variables du niveau de
notre arme, ce qui nous permet de personnaliser considérablement toutes les armes que
nous voulons créer.
50. P49 - Fabrication d'une arme en forme de cyste: À ce stade, étant donné que nous disposons
d'un système de mise à niveau fonctionnel, nous voulons l'utiliser et y
ajouter des options supplémentaires. C'est donc le moment idéal pour ajouter une deuxième
arme à notre jeu. Ce sera donc similaire
au premier. Nous ajouterons une faux, pourra
tourner autour de l'écran plutôt que d'
avancer directement comme le fait la lance Donc, si nous ouvrons le Spear
Dot TSC et les armes, vous verrez qu'il contient
déjà
la plupart des composants dont nous aurons besoin
pour notre Je vais donc simplement
dupliquer à partir de cette scène en bas à droite en cliquant avec
le bouton droit de la souris
sur la scène et
en
copiant . Mettons donc
Syth ici point TSCN. OK, maintenant je peux rechercher Syth dans le projet
et l'ouvrir. Zoomons sur le centre. Certaines des choses évidentes que
nous voulons d'abord changer le nom du projectile, nous l'appellerons
donc Syth Ensuite, le sprite doit être
sélectionné dans la
texture de l'atlas pour le sprite de faux Je vais donc cliquer
ici, agrandir l'image, et nous utiliserons les
mêmes sprites en bois Donc, si je me souviens bien, il y a un
bon Syth ici que nous pouvons utiliser. Nous allons donc le sélectionner
et appuyer sur Fermer. Vous pouvez maintenant voir que
la case de frappe n'a plus sens car elle
contient cette courbe ici. Nous voulons donc cliquer sur
notre forme de collision, et je vais l'arrêter ici puis l'étendre vers la
droite, quelque chose comme ça, ou cela pourrait même la faire
ressembler davantage à un carré rectangulaire, si je veux couvrir
tout le bord de la lame. Alors faisons-le. Maintenant, si nous
prenons l'exemple de ce projectile,
il fonctionnera toujours
presque exactement comme la lance, là où il
va simplement avancer Donc, ce que nous voulions vraiment faire c'était faire une rotation autour
du point central. Cela signifie donc que
nous avons besoin d'un décalage, et
que nous devons faire pivoter ce décalage en cercle pour obtenir
notre animation rotative. Faisons donc un clic droit sur le site. J'ajouterai un nouveau nœud deux D, puis ce nœud deux D sera le parent du
Sprite et de la boîte de frappe Alors, déplaçons-les ici. Ensuite, je vais le renommer
Rotator two D, cliquer avec le bouton droit de la souris et
y joindre un script Donc, le Rotator
Two D est parfait pour les armes. Créons cela, donnons-lui le nom de classe rotator deux D, puis nous voulons mettre
quelques propriétés ici Donnons-lui donc une vitesse
pour ce nœud rotateur. N'oubliez donc pas que ce rotateur est
un enfant de l'objet de base. Ainsi, l'objet
de base aura son propre mouvement, puis ce sous-objet contrôlera spécifiquement
la rotation. Ils bougent
donc tous les deux en même temps, mais ils sont indépendants
l'un de l'autre. Donc, à l'exportation, var velocity,
qui est un vecteur deux, et je vais avoir cette
valeur par défaut à dix pixels vers la droite et à
zéro sur l'axe Y. Cela va donc affecter
le mouvement à l'écran. Mais nous voulons également que le nœud tourne
physiquement, il semble
donc que notre
site tourne. Donc, à l'export en degrés de vitesse de
rotation variables, ce sera un flux, je le mettrai
par défaut à 360, ce qui signifierait une rotation
par seconde dans ce cas. Ensuite, il
suffit de le mettre à jour en fonction du processus ou du processus physique. Je vais suivre un processus physique pour être cohérent avec les autres
mouvements du jeu. Disons donc si notre quantité sera égale aux
degrés de radiance. Nous allons donc convertir
cette vitesse de rotation en degrés de radiance. Nous avons donc besoin des degrés de
vitesse de rotation multipliés par le delta pour obtenir le niveau de rotation depuis la
dernière mise à jour de l'image, puis nous allons effectuer une rotation cette valeur en radiance Nous pouvons donc même appeler cette quantité
RDs si nous voulons être clairs fait qu'il s'agit
d'une quantité de rayonnement. Je vais également en
faire un flottant, juste pour que cela soit le plus
clair possible OK, alors nous devons déplacer
physiquement le nœud, et cela sera basé
sur notre vitesse ici. Je vais donc dire que notre
mouvement sera égal
à la vitesse multipliée par Delta. Ensuite, nous appelons translate
on the move amount, et c'est essentiellement
notre script de rotation Donc, si vous devez
personnaliser des valeurs, l'inspecteur est
là pour les attribuer. Maintenant, nous voulons
créer une arme à deux D qui puisse servir de
modèle à notre viseur. Cherchons donc
l'arme à lance si nous l'avons enregistrée dans
le projet Alors maintenant, cherchons
l'arme à lance. Nous allons l'ouvrir. Nous allons jeter un petit coup d'œil ici. Il s'agit donc du nœud à deux D doté d'un lecteur AudioStream qui émet le son slash lorsque
nous utilisons une arme Je veux donc dupliquer
cela, puis créer une définition Syth
pour notre arme Dupliquons donc la scène de l'
arme de lance en tant qu'arme Syth. Cherchons donc à nouveau Syth. Double-cliquez sur Open Syth, renommez l'arme de lance en arme Ensuite, sur la droite, nous devons créer une nouvelle définition. Je vais donc zoomer ici, nouvelle définition de l'arme, et
ce sera Syth. Notre icône, nous pouvons simplement la copier à partir du projectile Syth réel Je vais donc passer à la
scène Syth , puis nous allons cliquer sur
le sprite, cliquer avec le bouton droit sur la texture, la
copier, passer à l'arme
à faux,
puis la coller dans l'
icône en
cliquant avec le bouton droit sur avec le bouton droit OK, maintenant nous devons définir
certains niveaux d'armes ici. Créons donc notre ensemble. Nous allons commencer par le
niveau 1 de l'arme, le nouveau niveau d'arme. Alors, comment voulons-nous que
notre faux fonctionne ? Peut-être que la faux se déplace
plus lentement qu'un projectile normal. Peut-être que le temps de refroidissement est plus long, alors on pourrait dire 1,5. Avant que Max ne touche,
je vais le mettre à cinq, afin que la faux puisse toucher
de nombreuses cibles avant qu'elle ne perde. Pour les dégâts,
augmentons-le également à 20 à 30. Et un projectile. OK, ajoutons donc
cette paire clé-valeur, puis nous passerons au niveau deux
avec un nouveau niveau d'arme. Élargissez le niveau
1 de l'arme pour que je puisse comparer. Ensuite, je vais infliger,
disons, 30 à 40 dégâts vitesse de 55, un temps de recharge de 1,4. Le nombre maximum de résultats est de six, et j'
ajouterai cette paire clé-valeur. Passons au niveau trois,
ainsi de suite, comme vous voulez
faire les chiffres. OK, donc voici les chiffres que j'
ai utilisés au niveau 3 de mon arme. Vous pouvez faire une pause si
vous souhaitez copier. Ici, nous avons une arme de niveau
quatre, une arme de niveau cinq. Et arme de niveau 6. Et je pense que cela devrait être
suffisant pour le moment. OK, donc si je me souviens bien, je n'ai pas encore défini dans la définition de l'arme
la possibilité la définition de l'arme
la possibilité
de choisir une scène pleine à craquer. Donc, dans la définition de l'arme, je souhaite ajouter un G en options. Donc, pour l'instant, nous allons
utiliser par défaut une variable d'exportation. Je dirais donc d'exporter une scène VR, et ce sera une scène pleine à craquer. OK, et puis au lieu que
Getsn charge la lance, nous voulons retourner à la scène Donc, comme nous utilisons
une méthode get seen, nous avons la possibilité d'intervenir ultérieurement et de
modifier s'il y a des scènes supplémentaires que nous voulons envisager de transmettre
plutôt que la méthode par défaut de base. Mais ça devrait être une bonne chose pour le moment, mais nous n'avons pas vraiment besoin d'une
deuxième scène pour le moment. OK, maintenant nous devons
juste nous
assurer que dans la définition de la
faux, nous chargeons rapidement la faux Et puis dans la définition de la
lance, recherchez
donc la définition de la lance.
Vous double-cliquez dessus. Ensuite, nous devons
charger rapidement la scène de la lance. OK, et ça devrait
être une bonne chose. Je pense que la dernière
chose dont nous avons besoin pour notre Syth est l'objet Syth. Nous voulons maintenant trouver un
élément Spear dans notre projet, dupliquer et créer
un point d'article Syth TRS Recherchez donc l'article Syth. Et à cet élément Syth,
nous allons bien sûr attribuer la définition de la
faux Maintenant, pour que nos sites soient ajoutés
en tant qu'arme à notre joueur, nous allons avoir besoin d'une
référence à l'arme deux D. Que nous pouvons ajouter à l'
équipement de notre joueur car n'existe pas déjà sur le joueur, elle
doit donc être ajoutée OK, donc pour ajouter notre référence
à la scène des armes, nous ne pouvons pas réellement utiliser la scène du pacte, car
si nous le faisons,
il y aura une référence
cyclique
car le TD de l'arme fait
déjà référence à car le TD de l'arme cette ressource de définition
d'arme Dans ce cas, pour
contourner ce problème,
nous devons créer un fichier d'exportation,
qui nous devons créer un fichier d'exportation, sera entre
guillemets, point étoile TSCn, ce qui signifie que nous pouvons le
filtrer par tout ce qui porte l'extension point
TSCN à Et nous dirons var
weapon two D path, et ce sera une chaîne. C'est le chemin qui mène à
la scène des armes où pouvez ajouter deux
chargements d'armes, comme le ferait le joueur OK, donc maintenant, si nous
regardons notre définition de lance, nous pouvons attribuer à l'
arme deux trajectoires en D, ce qui sera dans les armes, et puis nous avons
une arme de lance ici, C'est donc ce dont nous avons besoin. Ensuite, nous devons faire la même
chose avec Scythe Alors, cherchez Scythe. Et on dirait que je l'ai
appelée arme à faux, mais c'était censé être la définition
du site ici bas Le TRES en est la définition. La scène est l'arme du site. OK, alors double-cliquez
sur la définition du site ,
puis attribuez-lui le chemin. Vous pouvez donc
simplement glisser-déposer d'
ici à là, et
cela l'attribuera. Donc, pour ce qui est de l'article d'arme, si l'arme
n'est pas déjà présente dans l'équipement, nous devons ajouter la nouvelle arme de
niveau 1 à l'équipement. Plutôt que de renvoyer la
valeur false ici et de tri-apply, nous allons
créer la nouvelle arme. Nous pouvons donc dire que l'arme sera égale à. Regardons la trajectoire en deux D de notre
arme de définition, nous voulons l'instancier. Nous allons donc dire
charger sur le chemin, puis instancier Et ce sera
notre arme. Nous devons donc ajouter
cela au chargement. Donc, chargez Ajoutez une arme et
nous allons ajouter l'arme. Si cela fonctionne, nous
voulons que cela soit vrai. Donc, si nous avons notre objet,
nous pouvons désormais l'ajouter à la liste des objets que
notre interface utilisateur de récompenses pourrait générer. Donc, si je clique sur la scène de sélection de niveau supérieur
et que nous passons au premier
nœud sur la droite, nous avons nos options de
mise à niveau 1, et nous avons déjà ajouté l'
objet Spira Ajoutons donc l'élément du site. Alors, chargez rapidement l'élément de notre site, donnez-lui un poids d'un, ajoutez-le. OK. Ensuite, appuyons sur Play et voyons ce qui se passe
lorsque nous allons ici. Vous pouvez donc voir qu'il est
écrit un objet anonyme, et nous ne
voyons pas vraiment de détails Si je clique sur Choisir, cela ne lance pas réellement
le nouveau projectile Nous avons donc encore du
travail à faire pour cela, personnalisant les articles et en nous assurant qu'ils se chargent
correctement, et nous nous occuperons de cela
dans la partie suivante
51. P50 Création d'une interface utilisateur d'affichage d'armes pour l'inventaire de jeux: Le projet a vraiment besoin maintenant de pouvoir voir
quelles armes nous
avons équipées en haut à
gauche avec l'indicateur d'interface utilisateur. Et lorsque nous passons au niveau supérieur pour améliorer la première arme
ou choisir une nouvelle arme, je connais également ces noms et
descriptions ici. Cela apparaîtra également
ici afin que nous puissions associer ce que nous devrions voir et ce que nous voyons
réellement. Cela nous
aidera donc dans le débogage, mais c'est également très utile
pour le joueur Allons-y et
créons une nouvelle scène d'interface utilisateur Je vais
donc cliquer sur Plus ici. Je voudrais donc donner à ce nœud de
contrôle le nom, disons, affichage
des armes. Je vais également cliquer avec
le bouton droit de la souris et changer son
type en conteneur de panneaux. D'accord, cela nous donnera un
arrière-plan par défaut. Donc, à l'intérieur d'ici,
je vais avoir besoin d'un conteneur de marge,
puis d'un conteneur HBox
pour l'organisation Cliquez donc avec le bouton droit sur Ajouter
un conteneur de marge, puis cliquez avec le bouton droit sur
Ajouter un conteneur HBox OK, puis ici, nous
allons présenter
une icône avec un indicateur de niveau pour chacune de nos
armes, de gauche à droite. Prenons l'exposition des
armes et
réduisons-la pour qu'elle ressemble beaucoup
plus à celle-ci. Ensuite, je vais l'enregistrer notre projet dans le dossier de l'interface utilisateur, donc sur l'écran des
armes du dossier d'interface utilisateur. Mettons-en une copie dans notre interface utilisateur Canvas afin de voir à quoi cela
ressemblera approximativement. Donc, recherchez une arme,
puis nous allons saisir l' écran
des armes et le
positionner sous l'interface utilisateur. Et nous pouvons voir que c'est
assez grand là-bas. Vous pouvez donc cliquer ici et accéder
à l'écran des armes, et
réduisons-le au
milieu de l'écran. Notez la case bleue indiquant la taille complète de
notre interface utilisateur. Il va donc falloir que ce soit un peu plus petit, vraiment. Et je voudrais probablement aussi faire un décalage par rapport
au centre. Faisons également le centre de mise en page
par défaut. Nous pouvons maintenant revenir sur le canevas
de l'interface utilisateur du gameplay. Nous pouvons y voir nos armes
exposées. Ça ne
se passe pas vraiment comme on s'y attendait. Donc, dans l'affichage des armes, je vais prendre le préréglage
des ancres, et opter
plutôt pour le centre
par défaut ou le haut au centre . Donc, au centre. Et nous pouvons en quelque sorte comprendre pourquoi il s'est réduit à néant. Je vais donc prendre la taille minimale personnalisée
ici et définir une taille par défaut. Je vais dire 200 pour le
X, puis 50 pour le Y. C'est juste pour que
nous puissions le voir
et l' ajuster sur
notre interface de jeu Je vais donc passer à
l'interface utilisateur de jeu Canvas, et maintenant nous pouvons le positionner
là où nous en avons besoin. Je vais donc le
positionner, disons, ici à droite de notre barre de santé
principale et de notre barre EXB, et je vais le faire glisser comme ceci OK. Ensuite, nous
pouvons afficher quelques icônes indiquant le niveau de nos armes. Pour le savoir,
nous allons utiliser contexte du joueur afin pouvoir montrer quelles armes possède
le joueur. Donc, dans l'affichage des armes, ajoutons un script islas weapons
display point GD Ensuite, nous allons
vouloir exporter var le contexte, qui est le
contexte du joueur ici, et nous pouvons l'attribuer
dans l'inspecteur. Chargez donc rapidement le contexte
du joueur. Et puis, une fois prêts, nous
allons vouloir nous en servir pour faire référence à
notre arsenal d'armes. Donc, la fonction underscore est prête, elle renverra void, puis nous dirons
context point player point Avons-nous une référence
au chargement ? Nous ne le faisons pas. Donc, si nous
ne voulons pas en faire
une autre propriété intégrée
du joueur et
qu' elle soit directement référencée dans le script du joueur, nous pourrions dire « find children », et le schéma sera composé
de guillemets vides. Le type
sera un arsenal d'armes. Cela va donc nous
donner un tableau. Nous allons prendre le premier résultat en plaçant des crochets entre crochets dans un zéro,
ce qui signifie
que l'
indice du tableau est égal à zéro. Et nous allons l'affecter
à un chargement. Notre équipement de
soulignement sera donc
un arsenal d'armes. Et nous allons dire que le chargement du
soulignement est égal
au résultat de cela et nous voulons affirmer
que ce n'est pas nul Ainsi, assert underscore loadout n'est
pas égal à null. doit avoir un équipement à Le joueur doit avoir un équipement à afficher
pour afficher les armes, nom du
pourcentage à la fin que nous
puissions obtenir le
nom de ce nœud Ensuite, nous voulons que le nom de
classe
des armes apparaisse ici en haut. Cela affichera les armes et les niveaux du personnage
contextuel. Faisons-en donc une autre
sur Export var. Ce sera pour l'UIC. Nous allons créer une
instance pour chacune
des armes de notre arsenal. Alors faites un à Export var. Disons un affichage d'armes, qui sera du
type affichage d'armes, mais nous ne l'avons pas encore créé. Et pour indiquer
que cet écran ne se contente pas
d'afficher les données, il connecte également tout. En fait, je vais le
renommer pour le voir. Cela permettra également
de se différencier de l'affichage des armes, le conteneur de sous-interface utilisateur. Ensuite, je renommerai
les deux écrans d'armes. Ensuite, je renommerai le point d'affichage
des armes GD et le Ce sera donc désormais
Weapons View et ici,
Weapons View point TSCN OK. Accédez également à la scène de vue et renommez également
le nœud racine C'est très important.
Donc, regardez les armes ici. Nous devons maintenant créer notre écran d'armes
individuel afin qu'il puisse entrer dans
la vue des armes. Ajoutons donc une nouvelle
interface utilisateur à notre jeu. Il s'agira d'une
interface utilisateur au départ. Et je pense
que la racine ici, nous voudrions peut-être aussi que ce
soit un conteneur de panneaux. Vous pouvez toujours vider
un panneau, mais la possibilité d'avoir l'arrière-plan
est très utile. Nous allons donc le remplacer
par un conteneur de panneaux. Je vais renommer la racine
en affichage des armes. Faisons un clic droit dessus, ajoutons un conteneur de marge du nœud enfant, juste au cas où nous en aurions besoin,
puis cliquons avec le bouton droit sur Ajouter une texture
pour afficher notre icône Nous allons cliquer avec le bouton droit de la souris pour ajouter une étiquette. Et je
pense en fait que je n'ai pas besoin d'un conteneur VBox ou HBox pour cela, car je voudrais peut-être
que l'étiquette écrive par-dessus la texture Pour de nombreux jeux
qui auraient une texture et du
texte en même temps,
le texte était écrit par-dessus l'icône de texture. C'est ce que l'on constate souvent
dans les systèmes d'inventaire en concerne le nombre d'articles
contenus dans l'inventaire. Sauf que dans ce cas,
nous parlons du niveau de l'arme
dont dispose le joueur. Donc, en tant que texte de test, nous pourrions dire le niveau X ici. Bien entendu, nous pouvons voir que l'affichage
occupe maintenant le plein écran. Donc, réduisons le nombre. Je vais passer à l'écran des armes de
base, et nous allons passer à la disposition du préréglage
Anchors en haut à gauche OK, ça devrait le réduire
de façon spectaculaire. Maintenant, nous pouvons voir qu'il
ne fait qu'afficher le texte. Définissons une texture
sur ce rectangle de texture. Je vais donc créer une nouvelle texture d'
atlas, puis nous allons charger
rapidement un atlas. Cherchons
peut-être le 16 par 16. Feuille de sprite dans notre
jeu pour toutes les icônes, puis nous voulons modifier
la région et en sélectionner une Donc quelque chose qui
ressemble à une arme. Ici, nous avons une épée qui
fonctionne bien, et nous pouvons la fermer. D'accord, nous pouvons voir que
l'icône en forme d'épée est là, mais elle ne respecte pas
le rapport hauteur/largeur Nous voulons
donc passer
en mode stretch et le modifier pour rester
centré sur l'aspect, je pense. OK,
voilà. Et maintenant, nous voulons prendre notre principal contenant
d'exposition d'armes, et nous voulons qu'il soit également d'une taille
spécifique. Je vais donc dire taille
minimale personnalisée 48 x 48. Cela nous donnera un carré ici. Et je vais
prendre le texte de l'étiquette, et nous voulons qu'il soit
centré en bas. Donc, l'alignement vertical
vers le bas
ici sur le, vous
verrez que
cela ne change rien,
car nous devons augmenter la taille de l'
étiquette pour que le texte soit centré en bas. Passons donc à la mise en page maintenant, et nous allons
vouloir que la taille des conteneurs
soit suffisante, je crois Oui. OK, voilà.
Alors maintenant, le niveau X va s'
afficher en bas à droite. Et maintenant, il
semble que nous voulions un petit tampon entre notre texture
rect et notre étiquette. Pour l'instant,
enregistrons ceci dans
notre dossier d' interface utilisateur, notre écran d'
armes. Et je pense que ce que nous voulons, c'est
un deuxième conteneur de marge. Je vais donc cliquer sur
le premier conteneur de marge, ajouter un autre conteneur de marge, et celui-ci sera
le parent du texturect Positionnons-le donc à nouveau
en haut pour que
le texte apparaisse. Maintenant, avec ce conteneur de marges, passez aux remplacements de thème, et nous voulons que la marge inférieure soit
d'environ dix pixels De cette façon, le texte n'
affichera pas, vous savez
, les
parties importantes de notre icône. Peut-être en avons-nous même plus besoin
que cela. Essayons donc 12. Peut-être en avons-nous même besoin
plus que cela, vraiment. Pour mieux voir à quoi cela
ressemblera, appliquons notre thème de jeu
à l'affichage des armes. Cliquez donc sur l'affichage des armes, trouvez le thème, puis
chargez rapidement notre thème actuel. OK, maintenant c'est beaucoup plus petit et c'est dans le coin
inférieur gauche. Je pense que je
le veux en bas à droite. Cliquez donc sur l'étiquette, et prenons l'
alignement horizontal vers la droite. OK ? Ça a l'air
bien, mais c'est un peu trop
près du bord. Je veux donc prendre le conteneur de marge
parent. C'est celui qui se trouve juste
en dessous de l'écran des armes, et je voudrais définir des marges. Passons donc aux remplacements de thèmes et peut-être à deux pixels
sur chacun d'entre eux OK, ça a l'air correct. Sauf peut-être la marge inférieure.
Peut-être que nous n'en avons pas besoin. Oui. OK. Je préfère ça. Bien, maintenant, notre
écran d'armes va avoir besoin d' une référence au nœud à deux D de l'
arme Ensuite, chaque fois que les
deux nœuds D de l'arme augmentent de niveau, nous changeons le texte ici
pour indiquer le nouveau niveau. Ajoutons donc un script
à l'affichage des armes. Cela sera simplement affiché sur
Uilashwapon display point GD. OK. Et ce sera l'affichage du nom
de classe de l'arme. Et nous avons besoin d'une référence à l'arme 2 D. Je pourrais
juste l'exporter pour le moment. Ce sera donc une arme variable de type arme deux D.
Je dirais valeur fixe, et ce sera
une arme égale valeur. Chaque fois que nous configurerons l'arme, je pense que je vais simplement appeler
une fonction d'actualisation, et nous la définirons ici. Donc, rafraîchissement des fonctions. Donc, pour définir le texte sur
l'étiquette et sur l'icône, nous devons obtenir une
référence d'exportation pour chacune d'entre elles. Donc, à Export var texture, texte direct de type texture Rc. Et puis nous avons besoin
d'Export var label, qui est de type label. Et lorsque nous actualisons,
nous voulons dire que texture du point
texrec sera égale à
celle icône du point
de définition
du point de l'arme. Ouais, ça marche Ensuite, nous dirons que
le texte du point de l'étiquette est égal au point de l'arme, si nous avons un nom
ici, le nom de l'arme. Non, nous voulons le
nom de la définition car le nom l'arme est
en fait le nom du nœud qui ne comportera pas d'
espaces ou quoi que ce soit Il est
donc préférable d'obtenir
le nom de la ressource car il s'agit d'une
propriété personnalisée que nous avons définie. Ensuite, nous voulons
dire que plus est égal à l'espace plus une chaîne indiquant le niveau du point de l'
arme. OK ? Cela indiquera donc essentiellement le nom de l'arme, puis son
niveau actuel. Et juste au cas où la définition de l'arme
ne comporterait pas d'icône, créons une méthode get icon. fonctionnera comme nous l'avons fait avec l'
un des autres scripts précédents, qui renverra simplement null si cette propriété
n'est pas définie. Faisons donc un clic droit
sur la définition. Nous y reviendrons en cliquant avec le bouton droit définition de
l'arme.
Nous y reviendrons. Créons ensuite
notre fonction G icon, qui renverra une texture de deux D. Donc, si icon n'est
pas égal à null, alors nous retournerons icon. Sinon, nous renvoyons null, ce qui devrait
vous éviter de recevoir des erreurs si
l'icône est nulle ici. D'accord, et nous voulons probablement
aussi essayer d' actualiser sur R pour que
la fonction de soulignement soit prête, je vais essayer de faire une actualisation Cela nous aidera également à confirmer que s'il n'y a pas de set à deux
armes en D, il fonctionnera correctement
et sera simplement affiché en blanc. L'idée ici est
que chaque fois que nous
configurons la vue des armes, elle est remplie d'
écrans d'armes Nous avons configuré l'arme, et elle sera actualisée immédiatement. Passons donc à Weapons View. Et à l'intérieur, vous voyez que j'
exportais une exposition d'armes, mais en fait, ce que je veux
faire, c'est exporter la scène. Ce sera donc une
scène pleine à craquer que nous pouvons citer. Ensuite, nous
chargeons rapidement sur la droite notre écran pour l'
arme, donc l'affichage de l'arme. Donc, une fois que
nous aurons obtenu l'équipement, je voudrais y ajouter
tous les affichages d'armes de chacune
des armes qui se trouvent réellement dans notre arsenal d'armes J'ai donc fait quelque chose de
similaire avec le niveau de sélection : je l'
efface et je le réinitialise à
chaque fois, générant de nouvelles scènes pour en
générant de nouvelles scènes pour chacune des sous-interfaces à créer. Mais ici, je vais
essayer de le réutiliser pour que vous
puissiez
voir les deux approches. Techniquement, ce
serait la meilleure utilisation de vos nœuds en n'ayant pas à les
supprimer et à
les recréer à chaque fois Je pense donc qu'il sera utile
de le savoir après le cours. L'un des moyens d'accéder
facilement à tous
nos écrans
d'armes actifs sera donc nos écrans
d'armes actifs d'en avoir
un éventail. Je vais donc dire que var
underscore s'affiche,
et il s'agit d'un tableau Je vais zoomer sur l'écran des armes. Créons également notre fonction d'
actualisation. Notre fonction refresh
va donc renvoyer la valeur void. Et pour chacune des armes
de notre arsenal, nous allons créer un présentoir s'il le
faut Sinon, s'il existe déjà dans cette gamme d'armes, je vais le
réutiliser en actualisant simplement ses propriétés
avec la nouvelle arme en réglant l'arme de l'arme
sur. OK, donc pour notre fonction d'
actualisation, nous voulons parcourir
toutes les armes en boucle,
et nous le ferons
en utilisant les
positions des index afin de faire correspondre les indices de chargement des armes à
nos index d'affichage des armes Donc, pour IN Range Zero, cela souligne la
taille des points de chargement des armes, incrémentée d'un point Ensuite, nous allons d'
abord récupérer l'arme. Notre arme sera donc une arme de type 2. Cela revient à souligner
les armes de chargement à cette position d'index, et nous devons obtenir ou
créer l'affichage Je vais donc dire que l'
affichage de la variable est un affichage d'armes, et nous allons le définir
comme égal pour obtenir ou créer un affichage à une position d'
index de I. Et puis sur notre écran,
une fois que nous l'avons acquis, je dirais que l'arme d'affichage sera égale à l'
arme elle-même. Et comme l'
actualisation fait partie
du setter et de ce script, elle sera immédiatement
actualisée automatiquement Maintenant, j'ai parlé un
peu effets
secondaires et si vous
procédez ainsi, il n'est pas nécessairement certain à 100 % que le réglage de l'
arme actualisera automatiquement l'interface utilisateur Mais comme cela fait partie intégrante
de l'exposition des armes, je pense que vous pouvez simplement dire
ici : «
Oh, nous avons installé l'arme ». Bien entendu, l'
arme montrera l'arme
actuelle. Mais comme l'affichage des armes
est littéralement ce qu'il fait, régler l'arme et
laisser entendre que cela actualiserait l'arme qu'
elle va afficher dans l'interface utilisateur Je ne pense pas que cela pose
trop de problèmes en tant
qu'effet secondaire. Mais c'est certainement
discutable. Il ne
nous reste plus qu'à obtenir ou
créer l'affichage. Donc, utilisez, obtenez ou créez un
affichage avec un paramètre d'index, et ce sera un entier, et nous allons
renvoyer un affichage d'arme. Supposons donc que l'
affichage de la variable du type
d'affichage de l'arme soit égal
à l'affichage du point Get at index. OK, donc c'est peut-être nul. Donc, si l'affichage n'
est pas égal à null, nous renvoyons simplement l'affichage. Sinon, nous devons en créer
un ici et l'ajouter à
l'écran afin qu'il soit égal
à
l' instanciation de la
scène d'affichage de l'arme Et j'ai mal saisi ce nom. Donc, ici, Control C, Control V. Ensuite, nous
voulons l'ajouter en tant qu'enfant à cette interface utilisateur ou plutôt placer dans le
conteneur HBox. Alors, attends. J'ai besoin d'une référence
au conteneur. Exportez donc un conteneur d'affichage en V, et ce sera n'importe quel
type de conteneur. Il suffit de l'exporter
sur l'interface utilisateur. Ensuite, nous allons prendre le conteneur
d'affichage et ajouter l'écran
en tant qu'enfant de celui-ci. Nous disons que les points s'
ouvrent via un nouvel affichage. Enfin, nous voulons
retourner l'affichage,
tourner l'affichage. Il devrait donc être créé ici s'il n'existait pas déjà
ici. Cela gérera donc
la création des nouveaux écrans. Et si on retirait une arme ? Ensuite, une fois que nous avons parcouru les armes et que
tous les écrans sont configurés, nous voulons vérifier si le
tableau d'armes est réellement
plus petit que le nôtre, puis supprimer les écrans supplémentaires. Supposons donc que nous retirions une
arme du jeu et que nous voulions que notre affichage
soit actualisé. Eh bien, ce sera une référence nulle sur
l'écran maintenant. Nous pouvons donc dire que pour
l'affichage et l' affichage, si l'arme à points est nulle, alors nous pouvons simplement
libérer l'affichage. Alors, affichez le point Q gratuitement,
et attendez ici. J'ai besoin de ce soulignement parce
que c'est une variable privée Nous avons donc notre
display point Q gratuit. Nous avons donc notre point
d'affichage sans Q, et nous voulons le redimensionner
en fonction de notre SI de chargement. Voyons donc cela en
tant que variable locale de la taille de
nos armes. Maintenant, nous pouvons également réutiliser la taille des armes
ici et ici. OK, donc pour réexaminer
cette fonction, elle se met à jour et crée affichages selon les besoins
pour afficher toutes les armes, supprime tous les écrans
contenant des armes nulles et redimensionne le tableau d'écrans Nous obtenons donc le nombre d'armes. Pour chacune de ces armes, nous affectons l'arme à position
d'affichage correspondante. cela fait, nous
examinons Une fois cela fait, nous
examinons à
nouveau tous les affichages, et techniquement, nous pourrions passer en boucle du
champ de tir à la fin,
mais un
peu trop d'optimisation pour ne pas gagner beaucoup, car nous
ne montrons que
six objets ici. Mais si l'
arme affichée est nulle, mais ici si l'
arme affichée est nulle, ce qui peut être le cas si
nous retirons une arme, alors nous allons
faire la queue librement sur l'écran et redimensionner l'ensemble des écrans pour que cette taille
corresponde à celle des armes Dans notre affichage G ou create, si l'affichage existe
au même index, il le renverra simplement et
nous l'utiliserons. Sinon, cela créera
une nouvelle copie de la scène, puis nous l'appliquerons
sous le conteneur HBox OK, maintenant dans l'inspecteur, nous devons attribuer
ce conteneur HBox Nous pourrions le renommer
Displays Container
si cela peut aider Affiche donc le conteneur, en gardant
la même dénomination. Et nous avons déjà l'exposition des
armes ici. Cela fonctionnera donc sur Okay, alors exécutons-le et voyons s'
il fonctionne sur run en ce moment. Nous avons donc couru et nous
n'avons pas trouvé le stock
d'armes parce que je pense que cela pourrait
être appelé arsenal d'armes. Vous pouvez donc voir que Fine Children est un peu fragile comme ça. Nous avons donc un arsenal
d'armes là-bas. Essayons donc de trouver un
arsenal d'armes avec le S, puis nous le relancerons. OK, nous arrivons donc là où la texture des points de texture est égale à l'icône des points de définition des points d'
arme OK, alors nous avons rencontré
un autre problème. Je n'ai pas configuré le textrect dans l'étiquette sur l'écran de l'
arme Passons donc à l'
exposition des armes et corrigeons cela. En haut à droite, lorsque vous déplacez
l'arme, attribuez la texture
Wrectt, double-cliquez, puis attribuez l'étiquette OK, et nous allons le
refaire une fois de plus. Vérifiez si cela résout les problèmes. OK, donc ici, quand
il n'y a pas d'arme, ça va poser problème. Peut-être
voulons-nous vraiment qu'il installe une arme avant de l'actualiser. Donc, comme l'actualisation a lieu
ici lorsque nous configurons l'arme, je vais supprimer l'actualisation prête. Ce n'est pas vraiment nécessaire, et cela
cause simplement plus de maux de que
ce dont nous avons besoin.
Je vais donc appuyer sur Play. Et voilà, on y est. Nous avons Spear One en haut
à gauche Je vais aller ici et
nous allons sélectionner le nouvel article. Maintenant, cela ne va pas
fonctionner parce que nous n'avons pas configuré de signaux. OK, donc une erreur que j'ai commise, lorsque vous appelez Git sur un index qui n'
existe pas dans un tableau, cela vous donne des erreurs
hors limites. Donc, ce que nous
devrions faire, c'est assurer que l'index
se trouve dans le tableau. Nous allons donc dire que si les affichages disons que la taille est
supérieure à l'index, alors nous allons
renvoyer ce bit ici,
display point Git Index. Bien sûr. Ensuite, nous pouvons supprimer la variable de déclaration var display weapon display ici jusqu'au moment où nous instancions la scène
d'affichage, et nous supprimerons cette
ligne en haut
52. P51 Connexion des signaux et configuration de l'interface utilisateur Weapons pour un affichage dynamique: OK, nous avons donc
encore quelques signaux à connecter sur vue des armes et sur l'
écran des armes afin que,
lorsque nous serons en jeu, l'écran affiche correctement
la bonne configuration des armes
après avoir actualisé l'interface utilisateur. Une question très importante sera donc celle
où notre équipement
ajoutera une arme en appelant la
méthode d'ajout d'arme que nous
allons connecter à ses
armes de signal de changement de signal, ce que je ne crois
pas avoir encore créé Passons donc aux
armes à plein régime. Je vais cliquer
ici avec le bouton droit de la souris, ouvrir le symbole. Nous en sommes maintenant au script GD du point
de chargement des armes. Nous avons donc la méthode de l'ajout d'
armes, et nous voulons admettre ici
un signal afin que notre point de vue puisse
y répondre. Donc, en haut de la page, créons
notre changement d'arme de signalisation. Si nous le voulons, nous pouvons transmettre la panoplie d'armes
au signal. Donc, les armes, qui sont
une gamme d'armes à deux D. Et maintenant, il
suffit de l'admettre ici en bas
lorsque nous appelons Ajouter une arme. Les armes ont changé, elles émettent des points, et nous leur transmettons les armes. OK ? Maintenant, revenons à
notre script de visualisation, nous nous abonnons à so on ready, fois que nous aurons obtenu le chargement, nous voulons souligner le chargement des armes
modifiées par Et nous allons parler
des armes modifiées. Nous allons créer cette méthode
ici en bas. La fonction des armes a donc changé. Le paramètre est celui des armes P, qui sont un ensemble d' armes à deux D, que nous
allons annuler. Maintenant, nous allons
appeler refresh ici. C'est tout ce que nous avons à
faire, car Refresh déjà de vérifier le parc d'armes,
les armes
dont nous disposons et leur taille Nous n'
allons donc pas
utiliser directement ces armes P ici, donc je vais le souligner pour ne pas recevoir d'avertissement Et maintenant, avant de lancer le jeu, je veux m'assurer
que nos objets sont correctement définis. Donc, dans le système de fichiers en bas à
droite, je vais rechercher
un élément. Nous avons l'article Syth Voyons donc si nous allons
en haut maintenant, agit d'un élément
anonyme sans description, et il a également besoin d'une icône De plus, il semble que je
me trompe également, il semble que j'ai la
mauvaise définition de l'article. La raison pour laquelle
l'arme à faux n'est pas apparue est maintenant tout à fait logique arme à faux n'est pas apparue Chargons donc rapidement ici
la définition de la faux. OK, donc c'est correctement configuré, mais nous devons définir
notre nom d'affichage. Faux. Donc pour la description, je vais mettre un
projectile qui tourne autour de l'écran et qui
peut toucher de nombreux ennemis C'est essentiellement sa principale
différence par rapport à la lance. Et pour l'icône, eh bien, passons à la définition de la
faux Je vais cliquer avec le bouton droit sur
l'icône ici, la copier
, puis la fermer et la
coller dans l'icône ici. OK, maintenant nous devons
faire quelque chose
de similaire pour la lance. Alors
double-cliquez sur Spear. Ensuite, nous irons en haut à droite. Le nom d'affichage sera Spear. La description peut donc être
un projectile de base qui part de la
direction que regarde le personnage, je suppose, je dois dire Et puis l'icône, nous la copions
simplement de la définition vers l'icône de l'
élément. Juste comme ça. Et cela devrait essentiellement gérer une grande partie de
cela. Alors jouons. Je pense que la seule
chose maintenant, c'est que nous
ne sommes pas connectés à
un signal de montée de niveau, mais d'accord, nous pouvons voir Spear
One en haut à gauche Allons chercher notre faux. Donc, un projectile à faux est maintenant là-haut, et notre projectile à faux
est également lancé Nous pouvons voir qu'il tourne. Peut-être que sa vitesse de déplacement n'est pas vraiment suffisante parce que
nous voulons
qu'elle tourne en
cercle autour du joueur. Mais assurons-nous qu'il puisse frapper. Oui OK, donc ça a l'air
de toucher des ennemis. Très rapidement, dans les choix
générés, il y a une mention concernant l'ombrage
sélectionné et le signal déjà déclaré Ce n'est donc pas génial.
Je vais prendre le tableau sélectionné
et générer des choix. Cela se trouve dans le script
Weapons View. Cela se trouve sur le conteneur de la
boîte de récompenses ici. Je vais prendre ceci et contrôler R. Je vais le
renommer en fonction des éléments sélectionnés Je vais appuyer sur Remplacer non sur Tout remplacer,
car n'oubliez pas que
nous ne voulons pas
modifier les noms des signaux ici. Remplacez donc uniquement l'intérieur de
cette fonction, et nous voulons aller jusqu'ici. Je devrais également faire correspondre les majuscules
et les mots entiers ce qui aidera à réduire le nombre de choses
supplémentaires sélectionnées. données sélectionné
est donc maintenant le stylo de données
des éléments sélectionnés , puis nous
renvoyons OK. Cela devrait donc
gérer cet avertissement. OK, donc la scène de notre site ne
tournait pas exactement comme
nous l'aurions prévu. Donc, l'un des problèmes avec les scripts de
projectiles, c'est que si j'essaie de dire, lancez cette scène sans lancez cette scène sans la lancer d'abord avec une
arme en deux D, nous allons
avoir un problème
où elle atteindra
cet assertion une fois prêt Donc, ce que nous pourrions faire à
la place de cela à des fins de test, principalement, c'est d'avoir une direction
par défaut. Je vais donc dire
que la direction sera égale au
vecteur à deux points à droite. Il suffit donc d'y avoir cette valeur par défaut. Nous allons supprimer l'assertion. Je vais donc également
exporter le niveau de la variable afin que nous ayons la possibilité de définir un niveau d'arme dans l'inspecteur. Cela ne devrait pas être
exigé pour nous, car nous allons
principalement nous lancer par la méthode de
lancement, n'est-ce pas ? C'est ainsi que nous avons
configuré le projectile. Mais juste au cas où nous
voudrions le tester dans l'éditeur, je pourrais configurer un niveau de test ici et à droite
afin que nous puissions définir une vitesse d'arme par défaut. Alors, appuyons sur Play. OK,
maintenant avec cette configuration, je devrais être capable d'
exécuter ce script, et nous pourrons voir comment il
va se déplacer par défaut, ce qui est très utile pour
nous tout en haut. Je pourrais même créer une scène de
test où nous avons une caméra placée
au centre de notre scène, ce qui nous aiderait à améliorer notre capacité de
débogage visuel. Nous n'avons
donc pas besoin de lancer
le jeu complet et de monter de niveau
à chaque fois que nous
voulons tester l'objet Nous n'avons
donc pas besoin de lancer
le jeu complet et de faux Créons donc notre scène de test. Ce
sera donc une nouvelle scène en deux D, et je vais l'enregistrer à la racine. Disons donc que c'est le point d'
armes d'essai TSCn. Gardez ça, et je vais lancer
l'arme à faux. Donc Scythe Weapon Dot TSN. Nous avons simplement mis cela
à la racine. Je vais renommer le nœud racine. Testez donc des armes, puis
cliquez avec le bouton droit de la souris pour ajouter une caméra à D. Cela aura donc un zoom de trois.
Je pense que c'est bien. Et essayons de
lancer la scène
en cliquant sur le bouton Lire la scène en
cours. OK, donc si nous
ne voyons rien ici, c'est parce
que nous ne sommes pas censés mettre l'arme à
faux ici Nous sommes censés placer le
projectile Syth. Donc c'est mon erreur. Cherchons donc le point
Tscn et déposons-le à la racine. Maintenant, si nous
zoomons, nous devrions
pouvoir le voir. OK, c'est bon. Et appuyons sur le bouton Exécuter la scène
actuelle. Nous pouvons maintenant voir à quoi cela ressemblera lorsque notre faux tournera vers la droite, ce qui nous permettra
de
déboguer cette faux beaucoup plus facilement et plus rapidement Maintenant, grâce à la configuration de notre scène de
test, nous pouvons voir comment nos armes tournent et
se déplacent à l'écran, mais ce n'est pas exactement
ce que nous recherchons. Donc, ce que nous
devons changer ici,
c'est revenir à la
scène de la faux, à ce nœud rotateur Si nous voulons que l'
arme ou le sprite tourne autour d'un point central, nous devons déplacer
ce rotateur vers la droite
tout en ce rotateur vers la droite maintenant notre sprite
et notre boîte de frappe Je vais donc les
déplacer temporairement hors
du rotateur deux D pour qu'ils ne bougent pas
avec lui, puis je vais
déplacer le rotateur deux D vers la
droite comme ceci OK, cela nous
donnera un décalage afin que tout ce qui l'
entoure puisse réellement pivoter autour de ce point plutôt que de simplement tourner
ici en cercle. Ramenons-le directement dans la case de frappe, dans
le rotateur 2 D. Bien, c'est bien. Et nous devrions peut-être augmenter la vitesse X à 25. Passons en revue la scène et voyons si cela nous donne
ce que nous recherchons. Donc oui, mais c'est un
peu trop rapide, en fait. Alors peut-être que nous le
réduisons à la valeur par défaut
de dix et que nous le réexécutons. C'est donc la rotation qui
fait cela. Nous avons donc soit besoin d'une rotation
plus lente, soit nous avons
peut-être besoin que cela soit
plus à droite. Je ne sais pas laquelle.
C'est un peu une vérification des
suppositions pour moi. Donc, si vous déplacez le rotateur avec ce sprite
et cette boîte à hanches en dessous, assurez-vous
de les remettre
au point central 00 Ensuite, exécutons la scène de
test et voyons voir. Je pense que 360 degrés
c'est bien trop rapide. OK, je vais donc
revenir à la scène sth et nous allons baisser les degrés de
rotation. Réduisons-le de
moitié, peut-être 180. Ensuite, exécutons
notre scène de test. OK, cela ressemble probablement beaucoup
plus à ce que nous voulons, mais j'ai aussi trop éloigné le rotateur maintenant OK, donc je vais déplacer le sprite
deux D
vers l'extérieur et la zone des hanches vers l'extérieur, et
reculons le rotateur Replacez le sprite et la
zone des hanches sous le rotateur. Et testons-le sur
la scène des armes d'essai. OK, alors allons-y. Euh, presque. Mais peut-être que la vitesse du
projectile est encore trop rapide. Je ne sais pas Nous
devons le tester dans le jeu. Alors, appuyons sur Play, et cela lancera le jeu principal car c'est la scène principale. Alors attrapons la lance, le projectile
à faux. Et voici à quoi ressemble notre
arme à faux en ce moment Je ne suis pas sûr d'
être très content du patron, mais au moins il correspond
au concept général. Il s'agit surtout de modifier
les variables maintenant Laisse-moi essayer de
faire en sorte que le joueur soit touché et détruit. OK, il
se retire toujours de la scène, mais il va falloir
créer le jeu à l'écran. Dans le cadre du peaufinage
du cours. Je vais donc le
lancer une
fois de plus pour récupérer notre projectile à
faux C'est un peu comme
monter vers la droite. Je préfèrerais
que ça soit plutôt centré sur la droite. Je vais voir si je peux l'ajuster. C'est peut-être le résultat
de la vitesse X. Je vais essayer de le désactiver, et relançons la scène. Bon, maintenant c'est
un peu comme ça. Cela va revenir au point
de départ ici. Parce que le rotateur n'
a pas de vitesse supplémentaire. Et la direction dans laquelle il se lance varie selon que vous êtes
orienté vers la gauche ou vers la droite. Donc, au moins, c'est une application
égale des deux côtés. Ça
pourrait te plaire. Il se peut que tu ne le sois pas Il s'agit
principalement de modifier les variables pour obtenir
le modèle que vous souhaitez
pour le mouvement Donc, au moins pour le moment, je dirais que c'est plutôt acceptable. Améliorons l'arme à
lance ici. Cela va augmenter le
niveau de l'arme, mais aucun signal de montée de niveau
n'est connecté ici. OK, donc là où nous le faisons, c'
est sur l'exposition des armes. Passons à l'exposition des armes. Lorsque nous installons l'arme ici, nous devons connecter les signaux. Mais à ce moment-là, je dirais que c'est
en fait investir trop de choses dans un
setter pour l'arme Cela cache en quelque sorte ce qu'il est censé faire. La
remise à niveau s'est bien passée. Mais je pense que si nous
connectons des signaux et actualisons l'interface utilisateur,
c'est tout simplement trop. Créons donc une arme
dotée de fonctions. Ce qui fera passer une
arme deux D. D'accord, donc si l'arme n'est pas égale à zéro et que nous disons que le
niveau du point d'arme modifié est lié, puis nous aurons
un rappel ici, un soulignement indiquant que le
niveau de l'arme Bien entendu, cela va nous
donner une erreur car le niveau modifié n'
existe pas encore sur l'arme. Passons donc à l'
arme, cherchons le symbole. Nous allons créer un signal ici, niveau
du signal étant modifié, que vous transmettrez au
niveau, qui est un entier. Si c'est tout ce que je veux
faire avec ce niveau, et je pense que c'est le cas, alors
nous dirons valeur définie. Nous dirons que si le niveau est égal à
la valeur, nous revenons en termes de sens, niveau est égal à la valeur, et nous
pouvons changer de niveau par point un MIT. Sur les niveaux. Nous sommes donc quelque sorte en train de rendre cette
propriété observable, et c'est tout ce que je
vais changer ici La raison de cette protection est
que si nous réglons le niveau au niveau, nous ne voulons pas émettre de signaux d'interface utilisateur
inutiles ,
car le niveau n'a en
fait pas changé. Nous n'avons donc besoin
de faire cette mise à jour si nous
lui attribuons une nouvelle valeur. Maintenant, j'ai oublié deux
points en haut, pour me
débarrasser de cette erreur. Maintenant, dans notre écran d'armes,
le niveau a changé. Nous devons créer une
fonction de rappel
modifiée au niveau de l'arme fonction de rappel
modifiée Donc, fonctionnez, copiez-collez lorsque
le niveau de l'arme a changé, puis nous avons le
niveau P, qui est un entier. Nous allons renvoyer la valeur void, et nous voulons
actualiser l'interface utilisateur ici. Euh, mais ce que nous sommes en train de
faire ici, c'est que nous nous déconnectons de l'ancien signal de l'
arme s'il existe On vérifie donc si l'ancienne arme existe ici en vérifiant
si elle n'est pas nulle. Donc, si le signal est connecté,
nous devons le déconnecter. niveau du point de l'arme a changé déconnexion du
point a changé selon le niveau de l'
arme. Pas de parenthèses. Et cette
partie consiste simplement à vérifier que le signal est réellement
connecté avant déconnecter un signal
qui n'est pas connecté. Donc, juste des agents de sécurité. OK, nous avons donc préparé l'ancienne arme pour qu'elle soit
totalement déconnectée, afin que nous puissions changer d'arme maintenant. Nous allons donc dire que l'arme
est égale à l'arme P, puis nous voulons nous connecter aux signaux de
changement de niveau de
cette arme. Mais nous pouvons également faire
vérifier s' il est déjà
connecté pour une raison quelconque. C'est un peu
trop sûr, mais nous pourrions simplement dire que si le point de changement de niveau de l'arme est déjà
connecté à cette fonction
ici, nous voulons
faire l'inverse. Nous disons donc que s'il n'est pas connecté, nous
devons le connecter. niveau du point de l'arme a donc
changé, le point Connect, le trait soulignement du
niveau de l'arme a changé Et nous voulons également actualiser, sûr. Rafraîchissons donc cela. Ainsi, lorsque nous configurons l'
arme, nous l'actualisons, et chaque fois que le niveau
change, nous l'actualisons. Alors maintenant, nous voulons prendre
cette propriété, la
souligner et la
rendre privée Cela
ressemblera donc davantage à une variable privée. Et nous ne voulons pas le modifier
directement. Nous
encourageons vivement tous ceux qui utilisent ce script à utiliser plutôt la méthode des
armes définies. Je vais donc sélectionner ici, et nous allons contrôler et essentiellement trouver et remplacer. Assurez-vous donc de faire correspondre les
majuscules et les mots entiers, puis changeons cela
pour souligner l'arme Je pense que nous pouvons nous en tirer
avec le remplacement en masse ici. Ainsi, les 11 instances remplacent
simplement toutes. C'est Control R pour
afficher ce menu. Bien entendu, si
nous lançons le jeu, recevrons
une erreur parce que nous essayons de définir l'arme, non de souligner l'arme
du point de vue des armes Donc, si nous passons à la vue des armes, dans notre actualisation, nous voulons appeler Afficher l'arme à
points deux D sur l'arme et deux D l'arme
deux D et supprimer cette option. Donc, si nous avons transféré le code de
réglage réactif de l'arme dans cette
méthode de réglage d'arme explicite, c'est uniquement pour que nous sachions qu'il ne s' pas simplement de définir
la valeur de l'arme. Au fait, débarrassez-vous
de cette actualisation. Et nous pouvons même le supprimer, mais ici, à ce stade, il ne s'agit essentiellement que
d'une variable normale. Mais nous ne voulons pas
cacher le fait qu'il connecte et
déconnecte des signaux
et actualise l'interface utilisateur Je peux être un peu plus explicite. Tout ce code
aurait donc tout aussi bien
pu se trouver sous le paramètre de
variable de l'arme, mais le fait d'avoir
écrit cette fonction de
gros bloc permet de
mieux comprendre notre intention Et je sais
que cela me
contredit un peu alors qu'
avant je me disais : «
OK, tu peux juste régler les armes
et utiliser le rafraîchissement Mais comme nous émettons
également des signaux, je pense qu'il y a
trop de choses qui se passent, et nous ne
voulons pas le cacher ceux qui
essaient de configurer l'affichage. Nous voulons qu'ils
sachent, d'accord, qu'il
existe une fonction d'arme complète. Et c'est gérer
toutes ces choses supplémentaires. Oh, c'est vrai. Allons-y
, lançons le jeu, et je vais augmenter le niveau de
la lance jusqu'au niveau deux Ah, d'accord, donc vous
pouvez voir qu'il y avait une autre référence à la
variable armes , mais nous l'avons
rendue privée. Nous voulons donc avoir un getter pour obtenir l'arme plutôt que d'
accéder à la variable privée qui s'y trouve Permettez-moi de jeter un
œil à cette fonction et de voir si nous en avons même
besoin. OK, comme la vue
des armes libérer
les anciens écrans, nous avons besoin de remplacer l'arme à points
d'affichage par une arme Git
à points
d'affichage Allons donc créer cette
fonction dans l'écran des armes. Donc, fonctionnez ici, une
arme Git qui va renvoyer une arme à D.
Nous allons juste dire que
si vous soulignez une arme, nous
renvoyons une arme de soulignement, sinon nous renvoyons null Alors pourquoi s'embêter à utiliser
cette fonction d'arme Git alors que vous pouvez simplement accéder directement à la variable d'arme ? Eh bien, nous avons rendu cette arme privée parce que nous
voulons nous assurer que nous encourageons tous les développeurs à utiliser explicitement la
fonction Set Weapon. Et comme il s'agit
d'une variable privée, nous ne devrions pas y accéder
depuis l'extérieur du script. Nous avons donc besoin d'une fonction publique Get Weapon
pour y accéder. Il s'agit donc essentiellement d'
encapsulation et
d'empêcher d'autres personnes de
faire des choses avec le script alors qu'elles ne sont pas censées le faire
avec le script Encore une fois, le soulignement
est simplement une pratique qui indique qu'il est
censé être privé
de manière efficace, mais GD Script
n'a pas vraiment de mots clés privés ou publics Vous ne pouvez donc pas empêcher
quiconque d'y accéder. Vous ne pouvez indiquer votre
intention qu'avec le trait de soulignement. OK, donc fermons ça
et relançons la scène une fois de plus. Je vais augmenter le niveau de notre lance. Et améliorons la lance. Vous pouvez donc voir que
Spear est passé au niveau deux juste là
et en haut à gauche Bien sûr, cette interface utilisateur est trop petite, je dois l'agrandir. Passons donc au canevas de l'interface utilisateur de
jeu, et je vais cliquer ici. En fait, je vais changer la
mise en page et nous allons la centrer. Anchors va donc être
au centre, puis je voudrais le
décaler en W à partir de là, peu ici Passez également à la scène
d'exposition des armes. Donc, si je passe à la transformation ici, je ressemble plus à
un 400 pixels sur 75. Je veux m'assurer que l'
ancre est toujours centrée, afin de pouvoir la personnaliser ici,
puis revenir au centre
en haut pour la recentrer Regardons l'interface utilisateur de
jeu Canvas. OK, c'est toujours bon. Je vais à nouveau passer à l'
exposition d'armes à partir d'ici. Et je pense que l'essentiel
est que nous devons simplement nous
assurer que chacun de
ces écrans individuels, l'icône est réglée sur
une taille minimale. Donc, si je regarde l'exposition
des armes ici, prenons la
taille minimale et faisons-la. On pourrait même dire 96, 96. Agrandissons-le,
puis réduisons-le si nécessaire. Donc, l'étiquette de texte ici, ai-je besoin qu'elle soit également plus grande ?
Peut-être que je le sais. Nous allons simplement remplacer
la taille de police ici. Et je vais faire en sorte
que ce soit, disons, 16 ans. OK, c'est ce qu'
il en est actuellement de 32. OK, donc nous allons en essayer 32. Effectuez un zoom arrière. Appuyons sur Play. À quoi cela ressemble-t-il dans
l'interface utilisateur en ce moment ? OK, c'est beaucoup mieux. Je vais donc aller chercher l'autre arme. Nous avons notre faux.
Alors lancez, faussez-en une. Je pense que la seule
autre chose est qu' un petit
conteneur de marge pourrait aider. Fermez donc le jeu, et
dans la vue des armes, notre conteneur de marges, passons
à un thème différent. Je pense à des constantes
de deux de tous les côtés. Nous allons appuyer sur Play. Exécute-le. Et ça n'a pas beaucoup aidé. Faisons quatre pixels de tous les
côtés, je suppose, et appuyons sur Play. OK, c'est au moins plus
visible. Je vais en faire six. Donc six de tous les côtés,
ça devrait suffire. OK, nous passons donc en mode jeu. OK, maintenant nous avons une petite
barrière entre notre conteneur individuel
et la vue d'ensemble des armes. Et ça a l'air
bien plus solide. Il montre donc
le type d'arme nous possédons et le
niveau de l'arme, et c'est probablement la majeure partie de ce dont nous avons réellement
besoin. Je pense donc que c'est
bon d'y aller. Laisse-moi monter de niveau pour le fun. Passons au niveau 2 de Syth. Oui, Syth monte de niveau
correctement également. Cela permet donc de configurer
la vue des armes et de
la visualiser complète, d'avoir tous les
signaux connectés, corriger les
objets, de s'assurer qu'ils ont une
description et une icône, et d'avoir simplement cette interface utilisateur claire, où nous pouvons voir ce qui se passe
réellement
avec notre joueur
53. P52 Créer des éléments pour les mises à jour de joueurs: Notre
système de mise à niveau offrant
la possibilité de choisir
un objet d'arme et d'
améliorer notre arsenal d'armes avec
une nouvelle arme ou un
niveau d'arme amélioré,
ce serait donc la possibilité de choisir
un objet d'arme et d'
améliorer notre arsenal d'armes avec une nouvelle arme ou un
niveau d'arme amélioré, le
moment idéal pour ajouter
la possibilité de choisir une amélioration non liée à l'
arme Par exemple, un objet qui augmente le nombre de
pas, qui
augmentera définitivement nos PV au fur et à mesure que vous montez de niveau. Et nous pourrions même en faire un objet qui a de rares chances de faire tomber des
ennemis si nous le voulons. Dans notre dossier d'articles,
en bas à gauche, je vais le développer et créer un autre
type d'article. Je vais cliquer ici avec le bouton droit de la souris
et créer un nouveau script. Et nous pourrions appeler cela un élément
Stat Boost DotGD. Cela s'étendra à partir des ressources. C'est donc une sorte de type de
définition. Ensuite, dans notre
objet Stat Boost, je vais l'ouvrir, lui donner le
nom de classe Stat Boost item. Oh, et cela
va en fait s'étendre à partir de la
classe d'éléments de base, et non de la ressource. Donc, si nous examinons l'article, nous avons le Trapply
et le Can apply Allons-y et
prenons-les, car nous devons les implémenter
dans notre Stat Boote. Donc je vais juste les
coller ici. Donc, pour appliquer, nous
voulons vérifier si la cible possède, A, un bloc de statistiques et B. bloc de statistiques contient-il les
statistiques que nous essayons d'améliorer ? Nous pourrions créer un tas de classes
différentes pour, par exemple, un objet d'augmentation des
PV, un objet de réduction du temps de
recharge. Mais au lieu de cela, nous allons
simplifier cela en ayant un nom de stat de variable d'exportation, qui est un nom de chaîne. Et nous allons le définir comme égal
à zéro par défaut. Et puis changeons la valeur de la variable
d'exportation, qui est un flottant. Et fixons-le à 0,0. Donc, tout
d'abord, je veux retirer le Spblock du
lecteur s'il existe Je vais donc dire que var
Stats est un contrôleur de statistiques, et nous allons l'extraire
de ptarget point get, et nous allons obtenir ce nom de
statistique en tant que propriété Cela peut donc finir par être nul. Donc, si les statistiques sont nulles, nous allons
renvoyer false ici. Une autre chose que nous voulons vérifier est le changement de valeur
réellement défini. Donc, si le changement de valeur
est égal à 0,0, je vais envoyer un avertissement. Impossible d'augmenter les statistiques
si le changement de valeur est défini sur 0,0 ou disons que le pourcentage est un peu plus flexible, puis le changement de valeur en pourcentage. Et nous allons renvoyer faux ici. Donc, la raison en est que si
nous n'avons pas configuré l'élément, il ne fera vraiment rien.
Nous allons
donc simplement ignorer son application et nous publierons un
avertissement afin de savoir que c'est un problème
que nous devons résoudre simplement en remplaçant
la propriété
de changement de valeur par autre chose. Il n'existe pas de fonction prête à vérifier ces éléments
comme cas avec un nœud, car
les ressources ne sont jamais prêtes. Donc, cela semble être un
bon endroit pour le mettre. Nous allons simplement le vérifier
avant de postuler. Sinon, je pense que
nous pouvons revenir à la vérité. Je pense que ce sont les deux principaux constituants que
nous surveillons. Donc, l'autre chose dont je
voulais m'assurer, en fait, c'était cette partie. Nous voyons donc si les
statistiques portent le nom de la statistique, donc je l'ai mal configurée. Nous voulions dire si ptarget n'obtient
pas de statistiques ici. Donc, d'abord, nous allons obtenir
le contrôleur de statistiques, puis nous voulons vérifier
si les statistiques pointent par un point G Nom de la statistique. N'est pas égal à zéro. Si
c'est égal à null, nous renverrons false. Donc, d'abord, nous nous assurons
qu'il possède un bloc de statistiques, puis nous nous assurons
qu'il contient les statistiques, puis nous
nous assurons que nous avons correctement configuré cet objet
pour en modifier la valeur. OK, donc une fois que
nous aurons passé tout
cela, nous pourrons l'appliquer. Donc, ici en bas, je veux récupérer le
contrôleur de statistiques une fois de plus, donc je vais juste le copier-coller
d'ici en bas Nous obtenons le contrôleur Sats, puis nous voulons obtenir la valeur actuelle, puis
ajouter la modification à cette valeur Notre valeur actuelle
sera donc égale à stats
point GET stat name, puis nous allons la
prendre et l'incrémenter Disons que notre nouvelle valeur sera égale à la valeur
actuelle plus
le changement de valeur. Ensuite, nous avons défini cette
valeur sur les Sts. Donc, les statistiques ne mettent pas le
nom de la statistique à la nouvelle valeur, et j'y ajoute une petite faute de frappe, alors assurez-vous que ces
noms sont corrects Ensuite, nous voulons redevenir vrais. Nous pouvons donc également vérifier
ici, encore une fois, juste pour nous assurer que les statistiques
sont toujours bien trouvées. Donc, si les statistiques sont nulles,
nous renverrons false. Et il se peut que nous voulions
une erreur ici, car nous sommes censés vérifier si nous pouvons postuler juste
avant de l'appliquer. statistiques du
contrôleur Push and Error Stats n'ont donc pas pu être trouvées sur la cible en
pourcentage S, en pourcentage P. Cela va donc récupérer le nœud et le remplacer
là. C'est bon. Oui, donc pour les statistiques
qui portent un nom, nous allons essentiellement les
remplacer par un flottant pour le moment. La nouvelle valeur est un float, et nous l'avons rétablie
sur la valeur de la statistique. Maintenant, certaines de nos statistiques,
comme les HP, sont des nombres entiers. Donc, lorsque nous le
remettons sur le contrôleur de statistiques, il
le réduit à un entier, et il
perd sa valeur flottante. L'idée ici
est donc que si vous voulez augmenter un entier, assurez-vous simplement d'utiliser valeurs
non décimales dans l'élément d'augmentation des statistiques
lui-même Cela perd donc un
peu de clarté dans la mesure où
nous ne faisons que regrouper des nombres entiers et des flottants dans
le changement de valeur, mais cela nous donne
la flexibilité de et des flottants dans
le changement de valeur,
mais cela nous donne
la flexibilité de
gérer
la grande majorité de
nos statistiques dans une seule classe
plutôt que d' nos statistiques dans une seule classe en créer
une pour le changement de PV, une pour l'
augmentation du pourcentage de dégâts, Juste beaucoup moins de scripts dans lesquels
les choses pourraient mal tourner. Créons donc
notre article HP Boost. Et dans le
dossier des éléments, en bas à gauche, je vais créer
une nouvelle ressource, qui sera
un élément SAT Boost. Cela ira donc dans
le même dossier. Je vais l'appeler HP Boost, souligner les points sur les objets, l'enregistrer Maintenant, sur la droite, nous
avons notre appareil SAT Boost. Le SAT que nous voulons changer sera
donc Max HP, et nous voudrions qu'il augmente de 50. Maintenant, je vois un défaut ici, à savoir que si nous augmentons
les HP du MX, cela n'augmentera pas non plus
les PV de base Nous devons donc prendre une décision quant à la manière dont nous
voulons gérer cela. L'une des solutions serait que chaque fois que
nous augmentons le HP MAX, nous l'ajustons
automatiquement dans notre
script de contrôleur de pile en fonction de cette valeur. C'est donc une option.
Laissez-moi vérifier le contrôleur SC si
cela a du sens. Donc, recherchez Stack Controller
point GD et project, ouvrez-le, et nous pouvons voir que
nous avons le truc MAX HP Nous pouvons donc voir le changement
en faisant le MAXHP moins le et nous pourrions simplement dire ici que
si le changement est positif, nous affectons le HP Cependant, j'ai l'impression que cela commence
vraiment à
embrouiller ce paramètre,
et il se peut qu'il y certains éléments que nous voudrions
modifier les PV maximum,
mais pas les PV de base Je pense donc qu'une meilleure façon de le faire serait d'utiliser
notre élément d'amélioration des statistiques Nous avons en fait un dictionnaire des statistiques que nous voulons modifier, puis nous les parcourons en boucle. De cette façon, nous pouvons faire MaxHP
et HP en même temps. Nous pourrions même avoir
un objet qui augmente, exemple, le maximum de PV, et d'attaque en une seule fois, et cela nécessitera juste un peu de quatre boucles Alors changeons
cela, faisons-en un export var Stat changes. Et ce sera un dictionnaire de noms de chaînes avec
les valeurs flottantes. OK ? Nous allons donc nous en
débarrasser maintenant, et cela nous donnera
des erreurs immédiates. Nous voulons donc nous assurer que
chacun de ces noms de chaînes existe dans le contrôleur de statistiques. Nous pourrions donc dire que quatre touches
dans les statistiques changent de points. Nous allons juste vérifier si la clé se trouve réellement dans cette manette. Donc, si la clé Git des statistiques est nulle, elle ne contient pas les statistiques, nous ne
pouvons pas la modifier,
c'est un problème. Ensuite, nous pouvons
simplement le faire ici. Pour la valeur en stat, les valeurs
des points sont modifiées. Ensuite, nous vérifierons si la
valeur est égale à zéro, puis nous allons
avoir ce problème, alors
remplacez-les simplement par une valeur. OK, donc techniquement, ici, nous faisons deux boucles, et ce n'est pas optimal. Une meilleure façon de le
faire serait donc de simplement obtenir la valeur de la clé. Je dirais donc que la valeur de var est égale
à la touche G du point de modification des statistiques, puis nous pouvons vérifier la valeur sans
les quatre boucles supplémentaires. Je vais donc le couper
et le coller ici, retirant les quatre autres boucles. Cela devrait le rendre beaucoup plus
efficace et plus facile à lire car maintenant nous n'avons
affaire qu'à ce 14. D'accord,
maintenant, en bas, nous devons faire quelque chose de
similaire pour les changements de touche dans les statistiques, les touches à points. Nous devons obtenir la valeur de chacun
d'entre eux. Passons donc à la case départ, pour que
cela fasse partie de la boucle à quatre. Et nous dirons que les statistiques indiquent le point « Get key ». Cela va nous donner
la valeur actuelle. Nous prenons la valeur actuelle
plus le changement de valeur. Cela nous donne la nouvelle valeur. Alors, d'où vient
le changement de valeur ? Eh bien, nous devons dire que le changement de
valeur de la variable est égal
à celui des changements de statistiques point
Get key. Euh, hein. Et puis nous avons la
nouvelle valeur lorsque nous
les additionnons , les statistiques sont définies. Sur la nouvelle valeur, maintenez la touche. Le nom du set n'est pas déclaré dans le scope car le nom du
set est la clé. Nous voulons donc définir la clé avec la nouvelle valeur
sur le contrôleur de statistiques. OK. Maintenant, cherchons
un élément dans le projet. Je vais ouvrir l'objet HP Boost. Nous avons désormais la
possibilité de gérer plusieurs changements de statistiques en une seule fois. Donc je vais juste faire MaxHP
et ça fera 50. Je veux faire du MXHP
avant du HP parce que je veux augmenter le MX HP
avant d'essayer d'augmenter le HP Le HP sera donc également de 50 ici. Nous augmentons donc le MX HP, puis le HP augmentera de 50. Si vous êtes chez FHP, cela devrait
être chez FHP une deuxième fois. Et puis appelons le nom
d'affichage ici, HP Boost. La description
augmentera le maximum de PV de 50. Ensuite, pour l'icône,
créons une nouvelle texture d'atlas. Je vais développer cela. Chargons
rapidement à partir de notre projet, et je vais obtenir la feuille
de sprites 16 x 16 Modifions donc la région
et choisissons-en une. Alors zoomez, avons-nous
quelque chose comme une potion de santé, quelque chose qui ait du
sens pour nous Il y a une goutte de sang
qui pourrait être viable. Ou voici un cœur. C'est
une autre bonne option. OK, j'aime bien cette farine. Allons donc chercher cette farine rouge sang
cramoisi, et nous la choisirons pour
qu'elle devienne l'icône de notre article Et testons cela
en l'ajoutant en option dans notre scène de montée en
niveau des joueurs. Donc, dans la scène de sélection de niveau supérieur, je vais cliquer sur
notre sélection LevelUp Et nous avons notre choix d'
articles ici. Je vais
charger rapidement un nouvel article. Ce sera donc notre article HP Boost. Nous allons
lui donner une chance d'en obtenir
une et appuyer sur Ajouter une paire clé-valeur. OK, maintenant nous pouvons appuyer sur
Play, et nous allons entrer ici. Je vais
monter de niveau, et nous allons sélectionner notre bonus de PV. Choisissez cela, et
vous verrez, oh, tout d'un coup, que nous avons 160
CV, et c'est ainsi que nous montons de niveau. Vous pouvez donc voir à partir de là
qu'il serait très facile d'
augmenter d'autres statistiques,
telles que les dégâts d'attaque
, la réduction du temps de recharge, etc. Vitesse de déplacement, etc., pour votre personnage, car vous
devez apporter des améliorations
54. P53 Mise en œuvre de HP Boost Pickups et des corrections d'interfaces utilisateur de niveau: Terminez avec notre système de mise à niveau en créant un pick-up
qui
nous permettra de récupérer et d'appliquer
immédiatement l'un de ces objets, comme
notre article HP Boost. Nous allons donc vouloir rechercher les micros dans
notre projet Nous avons donc nos capteurs d'objets. Créons un micro HP Boost. Commencez par dupliquer la scène
XP Pickup Two D. Je vais donc cliquer avec le bouton
droit de la souris et le dupliquer puis ce sera le micro
HP Boost, souligner deux D, bien sûr, et double-cliquer dessus OK, donc la première chose que
je veux faire ici est de changer le sprite pour il soit le même que sur mon article Je vais donc cliquer sur
Animated Sprite TwoD. Passons à l'animation ici
et créons une nouvelle ressource Sprite frames afin de
pouvoir définir une icône différente Je vais ajouter des cadres à partir d'
une feuille de sprites. Passons à l'art. Pas de fanta cramoisi,
voir les icônes du corbeau, feuille de sprites
complète, 16 x
16, zoom avant Assurez-vous que sur la droite,
vous avez défini la taille sur 16
par 16 ici afin que la
feuille de sprites
puisse être divisée de manière appropriée Et oui, nous trouverons la fleur
que j'utilisais. Alors cliquez dessus, ajoutez le cadre. Et boum, voici notre article. Je peux regarder le pick-up XP, mais il ne s'agit en fait
que d'un micro qui
ajoute immédiatement de l'expérience. Ce script ignore donc toute
la nécessité
d'avoir l'objet Ce que nous
recherchons, c'est plutôt
un ramassage d' objets deux D. Renommons notre
nœud de base, le ramassage d'objets D, et nous allons cliquer dessus avec le bouton
droit, détacher le script,
cliquer avec le bouton droit sur attacher un nouveau script, et ce sera un
élément souligné,
deux D, cela s'
étendra du ramassage à D.
Nous le créons, lui donnons le nom de classe et
le ramassage d'objets
deux D. Donc cela va Nous le créons, lui donnons le nom de classe et
le ramassage d'objets s'appliquer de l'article à ramasser à l'
objet qui l'a ramassé. Ainsi, dans l'
interface utilisateur du niveau, nous avons immédiatement appliqué l'objet à notre joueur. Voici juste un peu différent. Nous devons d'abord récupérer l'objet
sur la carte du jeu, comme si nous prenions l'EXB,
puis l'effet de l'objet sera appliqué
directement au joueur Si nous ajoutons des objets à un inventaire, cette méthode d'application
reviendrait plutôt à ajouter l'un des objets à l'inventaire
et à partir de là, mais notre jeu n'a pas
besoin d'inventaires, donc nous sautons simplement les objets. Mais notre jeu n'a pas vraiment besoin d' inventaires, à part
notre arsenal d'armes, qui fonctionne un peu différemment Nous n'avons donc pas vraiment besoin d'
entrer dans le vif du sujet pour ce projet. Donc, notre article Pickup
two D, bien sûr, nous voulons exporter var un
article de type article. OK ? Alors sauvegardez cela, puis nous pouvons cliquer ici et
assignons si nous le voulons, nous pouvons attribuer l'élément par défaut. Mais je vais peut-être laisser
ce champ vide. Permettez-moi de jeter un coup d'œil
au script de base en deux D,
cliquez dessus avec le bouton droit de la souris. Nous devons donc implémenter
la fonction take. Copions-le donc dans le
menu de ramassage des objets D.
Je vais le coller dedans. Nous allons l'implémenter dans une seconde. Je vais également faire la fonction underscore ready, returns void Et nous allons affirmer
que cet élément n'est pas nul. Chaque article à récupérer doit être associé à
un article. En fait, je pense que assert est
un peu trop fort ici. J'opterais probablement pour
plus d'erreur push. Nous pouvons donc voir ce qui ne
va pas sur la console, mais cela n'interrompra pas le déroulement du jeu, car lorsque
nous prenons l'exemple de la collecte d'objets, cela
se fait probablement par un drop,
et nous ne
voulons pas nécessairement que cela interrompe complètement le déroulement de
nos tests de jeu. Je pense donc que l'erreur push est un
peu plus appropriée ici. Nous allons donc
supprimer le trait de soulignement
de la cible P. Donc, d'abord, je vais dire que point d'objet peut s'appliquer à la cible P, puis je vais
l'appliquer à la cible P. Donc, l'article n'essaie pas de
s'appliquer à pTarget. Et si c'est le cas, je le retirerai du quartier
des lieux. Maintenant, il serait peut-être
préférable que la fonction T
ait également un booléen pour renvoyer false Donc, ici, la nature
du changement en booléen signifie qu'il
faudrait
revenir à la classe de base
et la modifier Et puis toute classe qui
remplace également la fonction
T devra la modifier C'est donc l'un des
défauts du fait de
trop dépendre de l'héritage
pour vos classes, plutôt que d'utiliser une approche de
composition, comme vous le voyez actuellement dans l'
inspecteur La composition
ressemblerait davantage à un tas de petits scripts
différents ayant chacun leur propre
objectif, au lieu d'avoir
un script de base étende un tas d'autres scripts. Ainsi, par exemple, le joueur peut
avoir un personnage étendu, puis il
peut y avoir une autre classe au-dessus du joueur, comme
Spearman ou Dragoon, qui ajoute encore plus de choses Mais si vous obtenez
un grand nombre de scripts dépendent
directement les uns des autres,
un petit changement, comme le simple fait
de le remplacer par un booléen, peut vous
obliger à le mettre à jour à
plusieurs endroits . Donc, juste
une question à laquelle réfléchir. Ce n'est pas vraiment
problématique ici. OK, donc ce que nous
allons faire avec ce ramassage d'objets, c'est le mettre
sur la carte du jeu maintenant. Donc HP Boost Pickup. ce que nous avons. Nous l'avons enregistré
dans le projet. Oh, vraiment, ce que je pense que
je veux faire c'est en faire une
scène de base. Je vais
donc renommer Item Pickup Two D. Maintenant,
cherchons des pickups ici. Je vais donc faire un
clic droit ici et je
vais créer une nouvelle scène
héritée. Ensuite, dans cette
scène héritée, je peux attribuer l'objet. Je vais donc charger rapidement
notre article HP Boost, puis le
réenregistrer lors du retrait de l'article en tant que
retrait HP Boost. Deux D. Et puis c'est la scène que nous avons
intégrée au monde du jeu. D'une certaine manière, créer
une scène héritée comme celle-ci revient à étendre un script
et à intégrer toute
la base dans votre nouvel objet. Mais dans certaines
circonstances comme celle-ci, où nous changeons simplement le type d'objet
dans
lequel la configuration de scène possède
le bonus de PV, l'objet d'augmentation de PV, mais sinon, il s'agit simplement d'un
objet normal qui ramasse deux D. Je
pense que dans de tels cas, cela
a vraiment du sens. Nous voulons donc intégrer notre objet
dans le monde du jeu dès maintenant. Je vais
chercher World Dot TCN. OK, je vais zoomer ici. Nous avons un joueur, donc
je vais chercher le micro HP Boost et
essayer de
l'intégrer au monde du jeu. Je pourrais juste le mettre dedans, mais mettons-le d'
abord sous les micros pour qu'il ait le
bon parent W pour le déplacer Mettons-le
là-bas et peut-être un deuxième ici juste pour sûrs de pouvoir le faire deux fois. Appuyons sur Play,
puis nous
irons chercher notre pick-up. Je vais donc me promener
ici, et boum, nous avons 150 CV. Ici, nous pouvons choisir si nous
voulons une lance ou une faux. Intéressant, il n'offre pas l'option pour le troisième ramassage. Peut-être que j'ai besoin d'être ajouté. Ensuite, je vais aller ici
et obtenir notre prochain bonus de PV. Il y a donc notre objet permanent qui augmente le
Sp, qui fonctionne un peu
différemment de notre EXP, qui
modifie directement le Nous allons donc vérifier la sélection de
niveau supérieur, et je vais juste m'assurer que
l'objet est toujours là. D'une manière ou d'une autre, cela a commencé, donc je vais
charger rapidement la valeur de
l'objet HP Boost d'un, ajoutée. Alors maintenant, nous allons appuyer une fois de plus sur
Play. Je vais juste m'assurer que
ça fonctionne à nouveau. Obtenez le bonus de HP à partir du
niveau supérieur, sélectionnez-le. PV augmentent, nous les sélectionnons
ici et ici, donc nous obtenons trois bonus de PV. Cela fonctionne bien. La dernière chose
que je voudrais ajuster, et celle-ci est rapide, c'est que pour nos sélections de boîtes de récompenses, elles ne sont pas réduites
à la même taille. Lorsque l'un d'entre eux a
une description plus longue. Je voudrais donc passer à la scène de la sélection des
récompenses. Cliquez sur la racine, et laissez-moi voir ici. L'un d'entre eux doit
s'étendre complètement. Donc, en fait, le moyen le plus rapide de déboguer serait d'appuyer sur Play Et pendant que le jeu tourne, je vais aller ici
et nous allons tester, changer la taille ici. Ensuite, je vais revenir en arrière
et voir s'il est mis à jour. OK, donc notre zone d'augmentation des HP,
laissez-moi vérifier la racine. Ceci est configuré pour remplir et étendre. Peut-être que c'est la description
qui doit être développée et développée. Nous pouvons donc voir que la racine ici est déjà définie pour étendre et remplir. Je vais donc vérifier
le conteneur de marge et m'assurer qu'il est
également comme ça. Nous allons donc
dimensionner les conteneurs de mise en page. Remplir. OK, donc autre
chose, je pourrais regarder la vue à
distance pour voir les notes qui
s'exécutent actuellement dans le jeu. Et étendons la couche World
Canvas à l'interface utilisateur. Nous avons le niveau de sélection. Nous avons notre
contenant à panneaux en dessous, le contenant à marge,
le contenant à boîte en V et le contenant à boîtes Rewards
et nos trois sélections. Alors pourquoi sont-ils de
tailles différentes ? Nous pouvons donc voir, si nous regardons
sur la droite ,
que les tailles du
Y sont toutes égales. C'est ce à quoi on peut
s'attendre en regardant cela. Ils sont
tous étirés jusqu'en bas. Trouvons donc le niveau
où ils ne sont pas. Le plus petit
est le troisième. Permettez-moi donc de développer cela. Cliquez sur Margin Container. Nous pouvons voir le conteneur de marge. Est-ce que les 20 pixels sont en
taille réelle, donc ce n'est pas ça. Passons au conteneur VBox. Le conteneur VBox est 214. C'est également ce à quoi nous pouvons nous
attendre, car le conteneur à marge
a une marge. Je suppose donc que c'est en fait
cette boîte de description. Vous pouvez cliquer sur les
nœuds et voir une boîte s'afficher lorsqu'ils sont sélectionnés
ici. C'est plutôt cool. Je pense que c'
est peut-être nouveau. Nous voulons donc simplement que la description fasse
tout ressortir complètement vers le bas. D'accord, nous savons donc ce que
nous essayons de développer. Donc, dans la vue locale, en haut à gauche, cliquez sur la description.
Ah, et nous y voilà. Nous y voilà. Donc, ici,
en ce qui concerne le dimensionnement des conteneurs, il est prêt à commencer à rétrécir Je veux que cela
soit réellement comblé et étendu. Maintenant, si je vais
revenir au jeu, il va
tout en bas. OK, donc tu peux
le voir, non ? Ces trois-là sont en train de baisser. J'aimerais également que les
tailles des icônes soient égales. Peut-être devons-nous définir une
taille absolue spécifique pour les icônes. Je pense que l'icône de la lance a peut-être
été définie en utilisant une icône plus grande, mais je veux m'assurer qu' elles sont toutes à la bonne taille Donc, si nous cliquons sur l'icône Rec ici, essayons de changer la
taille de conservation pour ignorer la taille. Et je pense que cela les
rend égaux maintenant. Oui, d'accord. Il
semble être aligné. Si vous rencontrez d'autres problèmes, ce serait une sorte
de
processus de débogage que vous pouvez utiliser pour réparer votre interface utilisateur pendant que le jeu
est en cours d'exécution C'est donc très utile,
car vous pouvez réellement voir comment il
va se mettre à
jour immédiatement . Vous pouvez changer de contrôle dans
Gado et dans votre scène locale, et il sera mis à jour immédiatement
dans la vue à distance C'est donc en fait l'une
des choses vraiment cool à propos de Gudo OK, donc avec ça, je pense que
nos micros de mise à niveau, tout ce dont nous avons besoin,
à cet égard fonctionne vraiment bien maintenant C'est donc vraiment l'essentiel du cours jusqu'à présent. Nous allons juste avoir
quelques points à peaufiner,
comme sauvegarder et charger
un système de score,
comme le nombre d'ennemis que nous avons
tués entre les sessions de jeu, le fait de passer comme sauvegarder et charger
un système de score, comme le nombre d'ennemis que nous avons
tués entre les sessions de jeu, une partie à l'écran
pour savoir quand nous perdons réellement Nous pouvons donc aller dans
notre menu principal et redémarrer le jeu,
ce genre de choses. Mais le gameplay de base est à
peu près là maintenant. Ce sera donc tout pour cette vidéo, puis nous
passerons à l'
étape de conclusion et de
peaufinage du cours.
55. P54 : Créer un pick-up de potion de santé pour les chutes ennemies: Je voudrais ajouter une autre vidéo
sur le fait de récupérer
vos objets de jeu dans J'ai donc créé le pick-up
pour l'objet d'augmentation des PV, mais je veux créer un objet qui serait lâché
par les ennemis. Ce ne sera qu'une
simple potion de santé. Je vais donc rechercher notre élément
HP Boost dans le projet, et dupliquons
le pick-up HP Boost. Alors cliquez avec le bouton droit de la souris et descendez pour dupliquer et nous allons
l'appeler Potion de santé TCN à deux points D. Nous voulons maintenant
ouvrir cette scène, Health potion tod dot Notre objet s'
appellera donc Health Potion two D,
juste pour indiquer qu'il se trouve s'
appellera donc Health Potion two D, dans le monde
du jeu en deux D. Pour l'
article HP Broca sur la droite
, cliquez sur le menu déroulant
pour le rendre unique s'agit donc essentiellement de prendre Il s'agit donc essentiellement de prendre
la base et d'en créer
une copie unique. Maintenant, je vais cliquer avec le bouton droit de la souris ici et l'enregistrer en
tant que potion de santé Cliquez donc avec le bouton droit sur Enregistrer sous, puis placez-le dans le
projet et les objets, et je vais créer une potion de santé Soulignez l'élément TRS. Modifions les modifications des statistiques pour n'augmenter les PV que de 25, et supprimons le
PV maximal de ce boost. Maintenant, pour notre nom d'affichage, je vais dire Potion de santé Et pour la description, je dirais qu'il restaure 25 PV, point final. Ensuite, pour l'
icône, sélectionnons une autre icône de notre région
et trouvons une potion de santé Je suis sûr qu'il y en a
quelques-uns ici. Donc oui, plus près du sommet, nous en avons plus que quelques-uns. Faites vraiment votre choix ici. Je vais choisir celle qui a l'air
typique. Et sélectionnons-le. Ensuite, nous devons également
récupérer cette même icône pour le Sprite
two D. Cliquez ici,
passez à l'animation, créez
une nouvelle image Sprite,
puis sélectionnez sélectionner parmi
les images puis sélectionnez sélectionner parmi Icônes artistiques,
feuille de sprites complète 16 x 16, zoomez sur la
taille maximale définie à 16 x 16 Ensuite, contrôlez le rouleau
central de la souris,
zoomez sur le dessus et récupérez
la même potion de santé, qui se trouve ici Il ne doit y en avoir qu'un seul sélectionné. Appuyez sur Ajouter. OK, et voici
notre potion de santé Cela devrait donc déjà
fonctionner. Permettez-moi de l'intégrer au monde du
jeu en tant que copie. Nous avons donc notre
potion de santé deux D. Je vais juste la mettre ici
pour le moment, puis nous pourrons simplement
utiliser la potion de santé Donc, en fait, la
santé de base commence à 50. Donc, si je vais ici,
vous pouvez voir que 50 passent à 75 sur 100.
Donc ça marche. OK, alors nous devons
passer à la scène du squelette, et nous devrions modifier
notre composant drops, mais nous n'avons jamais configuré de drop pour le squelette.
Allons donc à Oc. Je vais juste
le sélectionner ici et contrôler C, le
copier dans le squelette. Ensuite, en haut à droite, nous avons nos définitions de drop, qui vont déjà
entraîner une baisse de l'EXP d'un poids de 1,0 Nous voulons donc ajouter la
possibilité de faire parfois tomber une potion de PV au lieu de l'EXP Je vais ajouter un élément, et je vais cliquer sur
une nouvelle définition de dépôt. Ensuite, juste à des fins de test, je vais lui donner un poids de cinq gouttes, ce qui signifie que 86 %
du temps, il produira une
potion de santé, et
non une EXP, juste pour que vous
puissiez le voir fonctionner Ensuite, chargeons rapidement notre potion de
santé deux D. D'accord, donc pour
que nos gouttes fonctionnent réellement, nous devons également l'ajouter sous forme d'animation d'
appel à notre mort Cliquons donc sur le lecteur
d'animation, passons à Death, et nous
ferons un appel sur les drops ici. Donc, au début, ajoutons
une méthode d'appel sur les drops. Et nous allons cliquer avec
le bouton droit de la souris pour insérer une seule fois une touche. C'est très bien. J'ai commis
une autre erreur
lors du retrait de l'article. Lorsque nous appuyons, l'erreur
car l'élément n'est pas nul. Cela devrait être un
problème s'il est nul, car nous
essayons de vérifier que nous avons bien pensé à
définir un article d'exportation lors
du retrait de l'article. Il s'agissait là d'un simple renversement de
logique. OK, maintenant allons-y, appuyons Play et nous essaierons de
vaincre un squelette. Je vais juste collecter quelques objets
en XP ici, acheter le site. Et nous attendrons juste qu'
un squelette apparaisse. En attendant, nous pouvons constater que les orbes ne font que
perdre leur XP C'est toujours la
seule chute possible, et là, nous avons un squelette. Donc, si nous le battons, 86 % du temps environ,
il devrait laisser tomber une potion de santé est donc pas le cas cette fois-là. Il va
falloir en vaincre deux autres. Et voyons voir. Avons-nous réussi à faire apparaître
la potion de santé Ouais, on y est. Potion de santé Nous avons donc effectivement vu que les
deux peuvent apparaître. Une autre potion de santé est sortie de ce squelette, une autre potion
de santé Vous pouvez donc constater que
la pondération fonctionne certainement
la plupart
du temps, nous recevons la potion de
santé au lieu de l' Maintenant que nous
savons que cela fonctionne, nous pouvons simplement passer au squelette. Nous allons passer aux gouttes. Prenons la définition de
la goutte sur la
potion et donnons-lui une valeur de 0,1 Cela signifie que 10
fois sur 11 , l'EXP va chuter, et une fois sur 11,
la potion de santé va chuter,
et
c'est en quelque sorte ainsi que fonctionne
la pondération Vous ajoutez toutes les possibilités
ainsi que leur poids, et vos chances sont de diviser
votre poids pour cette option par le poids total de
toutes les options réunies. OK, et c'est à
peu près comme ça que vous ajoutez une potion de santé
dans le jeu Vous pouvez donc voir qu'une fois que
nous avons notre élément de statistique, nos micros qui nous
donnent un élément de statistique, nous pouvons simplement les appliquer
au joueur et que nous pouvons simplement définir sous forme de chaîne les statistiques
que nous affectons, il devient très facile de modifier de nombreuses
choses sur notre personnage
56. P55 Mise en œuvre des secousses de caméra pour les effets de frappe et de mort du joueur: Nous passons maintenant à la partie
soignée du cours, qui va terminer le cours en ajoutant un peu
de moitié. Pour rendre le jeu un peu plus intense, nous allons
commencer par un tremblement de caméra au
toucher pour
que notre joueur au
toucher pour
que notre joueur soit un
peu plus intense. Et nous ferons également
des choses comme ajouter
un jeu à l'écran et la
possibilité de suivre les meilleurs scores. Commençons donc par le tremblement
de l'appareil photo. Allons dans le monde entier. Et pour ce qui est du monde, nous avons ici
un appareil photo en deux D. Nous pourrions donc simplement
joindre un script directement sur la caméra deux D.
Je vais donc cliquer ici, joindre un script,
et disons secouer caméra deux D. Souligner
deux D, devrais-je dire Et nous allons créer et
mettre cela dans,
je suppose, le dossier de l'interface utilisateur. Alors ouvrez-le et créez. Je vais lui donner le nom de
classe shake Camera two D. Et
travaillons à sa configuration. Donc, tout d'abord, nous avons besoin d'une
référence à notre joueur, comme nombreux autres scripts, afin que
lorsque le joueur subit des dégâts, nous puissions déclencher l'
effet shake. Faisons donc Exporter le
contexte de la variable du contexte du joueur. Ainsi, comme avant
avec les autres éléments de l'interface utilisateur, nous avons accès aux statistiques
par le biais du contexte. Ajoutons ensuite
quelques variables pour contrôler la force de nos secousses. Donc, tout d'abord, exportez var Max Shake Strength,
qui est un float, et je vais le définir
sur 10,0 par défaut Nous pouvons également avoir
une durée de shake. Exportez donc var shake duration, qui est un float,
et nous la réglerons à 0,3 seconde par défaut. Ensuite, je veux un ensemble de
variables
distinct pour
le moment où le personnage meurt. Ce devrait donc être une secousse
très forte pour donner l'impression que
« Oh, tu as perdu ton joueur,
tu as perdu la partie ». Faisons donc Export Var
Death Shake Strength, et ce sera une valeur
flottante par défaut de 20,0 Et puis nous avons à l'exportation la durée du death shake
Var
, que je vais régler sur un flottant
de 0,6 seconde par défaut. Donc, lorsque notre script démarre, je veux obtenir les
statistiques du joueur. Je vais donc dire que
var underscore stats sera un
contrôleur de statistiques ici,
puis nous devons être prêts à utiliser la fonction
underscore Nous allons donc parler de statistiques contextuelles
du joueur à points, et nous allons définir des statistiques de
soulignement équivalentes à cela Disons
que ce n'est pas nul. G stats n'est pas égal à zéro. Vous devez avoir une référence
aux statistiques du joueur pour
faire trembler la caméra. OK, donc lorsque notre caméra
tremble de partout, nous voulons nous souvenir de sa position
d'origine afin de pouvoir revenir à cette position une fois
que
nous aurons terminé . Passons à une autre
variable ici. Ce
sera un vecteur deux D, soulignement du décalage original, qui
sera un vecteur 20 OK, souvenez-vous du signe
égal. Nous en déduisons donc qu'il s'agit d'un vecteur à partir du vecteur deux points zéro, ce qui en fait également un
vecteur 20 OK, donc notre
décalage initial sur Ready sera égal à
notre décalage actuel. Il s'agit donc du décalage
de la caméra, car notre script étend directement
cette caméra. Ensuite, nous devons nous connecter au contrôleur
de statistiques
HP Changed Signal. Soulignez donc les stats HP
changed point Connect. Et nous allons le connecter
à quoi nous allons le connecter sur HP Changed. Créons donc cette
fonction ici, soulignons que HP a été modifié, et nous
aurons les données statistiques Donc, les données P et ceci sont des données modifiées par les
statistiques. Cette fois, lorsque nous avons
notre fonction de rappel, je vais
utiliser
directement les données P , car elles sont
très utiles ici pour déterminer si nous
faisons un shake normal ou un death shake Donc, si la variation des PV lors l'événement est supérieure
ou égale à zéro, nous voulons simplement revenir
parce que nous ne tremblons pas pendant un soin ou si les
PV ne changent pas. Nous voulons maintenant vérifier si la valeur du point u de l'événement
est supérieure à Zarel Alors, le personnage est-il toujours
vivant, en fait ? Donc, si c'est le
cas, nous allons utiliser les valeurs de secousse normales. Sinon, nous allons
utiliser la valeur Death Shake. La
force de secousse du soulignement sera donc égale à notre force de secousse
maximale, puis le temps de secousse du
soulignement sera égal
à notre maintien Durée de notre shake. OK, nous avons donc besoin de ces variables
locales ici. Donc var souligne que la force de
secousse est un float et Var souligne que le temps de
secousse est également un Il y a bien sûr le passage
à zéro par défaut. Oh, et quand j'ai mis un événement ici, je voulais vraiment dire Pdta Donc pata point change
et pdata point neu. OK, donc sinon, il y a
un autre cas ici, savoir
que la
santé est inférieure zéro, égale ou inférieure à
zéro, je dois dire. Dans ce cas, nous allons régler l'intensité des secousses
sur les valeurs mortelles. La
force de la secousse de soulignement sera donc égale à la force de la
secousse mortelle, et le temps
de secousse sera égal
à la durée de la secousse mortelle OK, maintenant, il y a
une autre chose ici
, c'est que selon l'
état de santé de notre personnage, nous pouvons vouloir augmenter
ou diminuer sa force. C'est pourquoi j'ai choisi MX
Shake Strength ici. heure actuelle, ce
sera toujours le maximum
de 10,0 que j'ai configuré là-bas Je pense donc qu'une bonne façon de
procéder serait de vérifier les dégâts
que vous avez infligés par rapport au maximum de PV
du personnage. Donc, si une attaque leur fait
perdre la moitié de leur santé, il
faut que ce soit un tremblement de caméra
assez fort. Mais s'il ne s'agit que d'un
coup au fil du temps, du genre « Oh, ça fait un dommage par seconde », c'est
peu important. Vous pouvez simplement en faire
une toute petite secousse ou éliminer complètement
la secousse. Donc var, le ratio de dégâts sera égal à la valeur absolue F, du point d'événement hg. C'est le montant de
santé que nous venons de changer, et il va
être divisé par le maximum de l'un ou l'autre point oh. Donc, lors de l'édition, j'ai remarqué que les calculs ici sont incorrects. Appeler le maximum
entre un point oh et le point de statistiques MX HP n'a pas beaucoup de
sens ici, car nous voulons
en fait que le ratio soit entre le
changement et la santé, la valeur absolue de ce chiffre de
toute façon. Et le MX HP. Donc, ce que nous voulons vraiment faire,
c'est dire variable en pourcentage. Et ce que nous
voulons vraiment dire c'est la valeur flottante de la valeur absolue de la variation du point de données p divisée par le point de
soulignement MX HP Cela nous donne donc notre ratio, qui devrait être de 0 à 100 Mais nous voulons y mettre un terme. Disons donc un ratio serré maintenant. Je vais supprimer
cela et disons fixer F sur le pourcentage de variation, et nous allons le
forcer entre 0,0 et 1,0. Donc, si, pour une raison ou une autre, notre valeur de modification était réellement ou une autre, notre valeur de modification était réellement
supérieure à notre
total de PV MX, disons que nous avons subi 9 000 dégâts
et que notre maximum de PV était de 100, cela représenterait en fait
une variation en pourcentage de 90 Nous voulons donc simplement le limiter
à 100 %
ou, si nous
allons dans l'autre sens, il ne peut pas être inférieur à 0 % de variation. Notre valeur totale sera donc
comprise entre 0 et 100, quelle que soit l'
ampleur du changement Multipliez la force de secousse maximale
par le ratio de serrage. La dernière chose
à faire ici pour nous
assurer que cela ne revienne
pas zéro est de prendre le MX HP
et de le transformer en flotteur. C'est donc important,
car sinon, entier divisé par un
entier supprimerait simplement le point décimal avant même de le convertir en pourcentage
de variation Maintenant, nous pouvons courir
et nous
assurer que cela
fonctionne toujours comme prévu Je trouverai
donc un gars pour nous appeler. OK, et nous avons toujours
ce tremblement d'écran, non ? Bien sûr, celui de la mort
sera bien plus important. Comme nous avons modifié les calculs, vous pouvez également ajuster l'intensité maximale des secousses
et la rendre plus forte, par
exemple 20 ou 30. Et n'oubliez pas qu'il s'agira
toujours d' un pourcentage de l'intensité
maximale des secousses. Vous devez donc
en tenir compte lorsque vous
déterminez réellement la force du shake Donc, voyons voir, à 30 ans, la force
maximale est un peu comme
ça. Peut-être un peu fort. Je pourrais donc même baisser
ce chiffre à 20. Comme un dernier chiffre. OK, enfin,
nous avons vraiment besoin du processus pour le shake. Allons donc jusqu'en haut. Une fois le soulignement prêt, je dirais processus de soulignement de
la fonction Donc je le remplis automatiquement. Ensuite, nous allons dire que si le temps de tremblement est
supérieur à 0,0, nous allons
réellement secouer l'écran. Donc, pour
y parvenir, nous utilisons quelques mathématiques. Nous allons donc dire que le
temps de soulignement est inférieur au delta Nous supprimons donc le temps écoulé, puis je vais
obtenir les valeurs de secousse en X
et en Y et appliquer
ce décalage à l' Donc, var shake X
sera égal à une plage F aléatoire de moins 1,0 à 1,0
fois la force du tremblement. Donc, en gros, nous
obtenons une direction aléatoire multipliée par notre force de secousse
actuelle. Et puis var shake Y, bien
sûr, vous pouvez
imaginer que c'est pareil. Cela sera égal à la plage de soulignement F
aléatoire, 1,0 à
1,0 fois
souligne la force des secousses Nous prenons les deux et nous les
appliquons au décalage de la caméra. décalage sera donc égal au décalage normal
plus
le vecteur deux, et ce sera le
shake X et le shake Y.
Donc, à chaque mise à jour d'image, l'appareil photo va prendre une nouvelle position aléatoire légèrement
différente du décalage d'origine,
et il le fera jusqu'à ce que
le temps de tremblement soit terminé Donc, si le temps de
vibration est égal ou inférieur à zéro, nous dirons le contraire, nous
voulons rétablir le
décalage de l'appareil photo à son niveau d'origine. Le décalage sera donc
égal au décalage d'origine. OK, et si j'ai bien compris, c'est à peu près
notre script. La dernière chose à
faire est d'
attribuer le contexte au joueur
et l'inspecteur. Donc, rapidement ici, menu déroulant, chargement
rapide, contexte du joueur. Et lançons le jeu
, laissons notre joueur se faire toucher et voir si cela
fonctionne comme prévu. OK, donc voici un orc, et notre caméra tremble à
chaque fois que nous sommes touchés Et il y a notre caméra qui
tremble à la mort, qui est beaucoup plus forte,
comme vous pouvez le constater. Il s'agit donc essentiellement de l'effet de tremblement de
l'appareil photo dans son intégralité. Ensuite, ce
serait évidemment le bon moment pour afficher
l' écran GameOver afin que nous puissions revenir au menu Démarrer du jeu, que nous devons également créer
57. P56 Créer un jeu sur écran avec le menu de navigation principal: L'une des dernières choses que
nous devons ajouter est un écran GameOver et
un écran de menu principal GameOver
va donc, bien sûr, apparaître lorsque notre
personnage sera vaincu Nous devrons donc accéder à
nouveau
au contexte du joueur afin de vérifier
si I live est faux. Je vais donc d'abord ouvrir le système de fichiers
et accéder à l'interface utilisateur, et nous allons trouver notre interface de jeu
principale, Canvas qui facilitera un
peu
le travail afin que nous puissions voir où nous allons
placer le jeu à l'écran. Donc pour l'instant,
je pense que je vais passer au niveau supérieur
et la masquer. Cela facilitera le travail. Et prenons l'interface utilisateur. Je vais
cliquer avec le bouton droit sur Ajouter un nœud enfant. Nous voulons donc un nouveau contrôle ce contrôle sera centré. Donc, dans la mise en page, faisons la mise en page, positionnons
les ancres et faisons le centre Maintenant, le clic permet également d'accéder à la souris
et de transformer le filtre en Ignorer. Et faisons un clic droit et ajoutons un conteneur de panneaux à
ce nœud de contrôle. Donc, conteneur en panneaux.
Ce sera le contexte. Nous allons prendre le
conteneur en panneaux et l'étirer. Alors zoomez, assurez-vous que le conteneur
du panneau est
sélectionné ici, et développons-le. Notre conteneur de panneaux que nous voulons est donc centré sur le contrôle de nos parents. Passons donc maintenant à la mise en page et
au centre des ancres de mise en page. Cela devrait placer les
points d'ancrage des parents ici, au
centre, donc c'est une bonne chose Il sera centré
sur l'écran. Renommons le
nœud parent en écran GameOver. Cliquez également dessus avec le bouton
droit de la souris et enregistrez-le en
tant que branche dans le
dossier UI, écran GameOver Alors maintenant, nous pouvons simplement passer à
cela et le modifier purement et simplement. Donc, pour notre écran GameOver, nous aurons bien sûr besoin
de quelque chose comme une étiquette en texte enrichi comme titre Cliquez avec le bouton droit de la souris sur Ajouter
une étiquette en texte enrichi. Et je peux juste exprimer
GameOver qui sommeille en vous. Nous voudrons probablement également
faire du
thème basé sur les racines notre thème de
jeu principal. Chargez donc rapidement le thème ici, thème de
jeu qui
nous donnera la police Pix Art Maintenant, nous pouvons également prendre
l'étiquette de texte enrichi, et disons le contenu adapté. Nous voulons également
parler de texte centré, qui semble
également trop volumineux. Ce ne sera pas un problème, je pense, fois que nous aurons ajouté le
conteneur VBox, alors, cliquez avec le bouton
droit de la souris sur le conteneur du
panneau, ajoutez un conteneur VBox Déplacez l'
étiquette de texte enrichi en dessous. OK, ça fixe le dimensionnement puisque maintenant c'est le conteneur
qui le
contrôle Faisons un clic droit
sur la VBox et ajoutons peut-être un rat de texture ,
puis nous aurons une icône
triste à ce sujet Ensuite, nous aurons
une icône GameOver. Si nous utilisons la texture et la texture de l'
atlas, nous l'étendons. Ensuite, pour l'atlas, chargeons rapidement nos icônes. Nous pourrions simplement utiliser le 64 64 ici si nous voulons le
conserver dans le projet. Modifier la région. OK,
puis nous devons effectuer un zoom arrière et
sélectionner quelque chose qui
serait bon pour, exemple, une partie terminée. Il y a donc beaucoup d'
options parmi lesquelles choisir. Je pense à ce crâne qui a l'
air de dormir. Il ne fait ni trop sombre,
ni trop mignon, donc je pense que cela pourrait fonctionner. Permettez-moi de mettre cela de côté
afin que je puisse voir l'éditeur de région. Il se peut que je
doive changer la taille ici. Je vais essayer un pas de quatre
sur le X et de quatre sur le Y. De
cette façon, je peux l'étirer vers la droite, puis
la gauche et la droite vont
se correspondre Je vais aussi tirer un peu le
bas vers le haut. OK, donc avec l'étape 44, cela a un peu bien fonctionné pour que je
puisse me rapprocher d'ici. Nous zoomons sur notre écran
GameOver. Je vais vouloir, je
crois, un clip filtrant. Je pense également que pour
le mode stretch, nous devons rester centrés sur l'aspect, et cela me semble bien. Nous allons donc également ajouter
une boîte de description. Donc, cliquez avec le bouton droit sur la VBox, ajoutez une autre étiquette de texte enrichi, et nous pouvons dire que vous
avez été vaincu Nous essayons de réessayer. Bien sûr, allons-y, adaptons le contenu. Ouaip. Ensuite, nous avons juste
besoin d'un
bouton en bas pour accéder
au menu principal. Alors, cliquez sur VBox, ajoutez un bouton de nœud enfant Ce bouton indiquera le menu principal. Je vais y joindre un script. Il s'agira donc d'un nouveau bouton. OK, ensuite,
prenons ce bouton ici et je vais le renommer bouton de changement de
scène parce que nous allons revenir
au menu principal Attachons-y un script. Ce sera donc le point GD du
bouton de changement de scène. Créez ça. Et nous voulons ajouter
Export var sur le même chemin. Nous pouvons donc en faire un fichier d'exportation,
et
ce serait des guillemets, point
étoilé, TSCN. D'accord, chemin de notre scène est
une chaîne, puis une fois
prêt, nous nous connecterons au
signal sur lequel vous appuyez,
donc appuyez sur point, connectez lorsque vous appuyez
sur le bouton, puis le trait de
soulignement de la fonction lorsque vous
appuyez sur le bouton pour
passer Faisons donc un point Gtree pour
changer de scène en fichier, et nous indiquons le chemin de la scène, puis cela
changera notre
scène actuelle en scène du menu principal En tant que vérification importante, il serait probablement utile de dire
que chemin de la scène est vide. Égal à faux
et indique qu'il doit y avoir
un chemin de visualisation vers lequel changer
lorsque vous appuyez sur ce bouton. OK. Donc, une autre chose que je veux
probablement, c'est un conteneur de
marge. Faisons un clic droit
sur l'écran GameOver et ajoutons un conteneur de marge Je vais le mettre
directement sous le conteneur du panneau
, puis VBox en dessous D'accord ? Nous
pouvons donc maintenant définir des valeurs pour le conteneur de marges
et les remplacements de thème, quatre
pour tous les côtés, ce qui le rendra un peu plus beau en donnant une petite zone tampon au texte Et notre jeu à l'écran, nous devons nous assurer
que cela ouvrira l'interface utilisateur lorsque la partie sera perdue. Je vais donc joindre
un nouveau script ici. Jeu d'interface utilisateur sur écran. Créez ça. Vous voudrez peut-être un nom de classe ici,
partie au-dessus de l'écran. Et trouvons une référence au joueur
par le biais du contexte. Donc, à Export vara, le contexte
est du type contexte du joueur. Nous dirons que la fonction de soulignement
est prête, et une fois prête,
nous créerons des statistiques contextuelles sur les points
du joueur, et nous obtiendrons le changement Alive. Connectons-nous à cela et
disons qu'aucun joueur Alive n'a changé. Nous avons donc modifié notre
fonction de soulignement sur Player Alive. Je ne me souviens pas si cela
comportait des paramètres Je vais
donc cliquer sur le symbole Alive changed, et nous allons vérifier
s'il contient le boole live, alors
revenez au script de fin de partie, et nous en avons besoin
comme paramètre ici P Alive est donc un booléen. Cela sera annulé. Et si P Live est égal à faux, alors nous allons afficher l'intégralité de
notre menu de jeu ici. OK, maintenant, notre style de
bouton de changement de scène ne fonctionnera
pas car nous
n'avons pas de scène de menu principal. Créons donc un espace réservé. Ajoutez une nouvelle interface utilisateur de scène, et ce sera le menu principal. Je vais l'enregistrer dans le projet. Faisons-le donc simplement
à la racine
du menu principal du projet, enregistrez-le. Ensuite, dans l'écran de fin de
jeu, assignons ce menu principal comme chemin de la scène et le
bouton de changement de scène, comme celui-ci. Vous pouvez simplement glisser-déposer. C'est le moyen le plus simple de le faire. OK, aussi, avant que j'oublie, allez sur l'écran Game Over et
attribuez le contexte au joueur. Il suffit donc de charger rapidement cette ressource contextuelle
du joueur. Maintenant, nous voulons partir à la découverte du monde entier. Nous pouvons voir que l'interface
utilisateur du jeu est là. Voyons donc si nous pouvons
simplement le tester très rapidement. Et assurez-vous que nous pouvons accéder
au menu principal. J'ai donc cliqué sur Play. Et
c'est juste là. Je vais aller
dans le menu principal, ce qui nous donne un écran vide
car nous n'
avons rien ajouté
à cette scène. Il s'agit essentiellement d'un
élément d'interface utilisateur vide. Cela fonctionne donc réellement. Je pense que l'autre
chose que nous voulons faire est d'être prêts pour le
jeu à l'écran. Assurons-nous simplement qu'il se cache. Nous allons donc dire « cache-toi, prêt ». Dans notre interface utilisateur Canvas, peut que
nous
souhaitions également le cacher,
mais il n'est pas nécessaire de
dire si cela peut aider. Mais je vais simplement le laisser visible par défaut afin que nous puissions
tester la hauteur. Il se cache donc, et maintenant il
ne nous reste plus qu'à nous faire vaincre, et il devrait apparaître s'
il fonctionne correctement. Donc deux coups, trois coups,
quatre coups, cinq coups. Il y a notre fenêtre contextuelle Game Over, le menu
principal, et le
flux fonctionne. La dernière chose dont j'ai besoin
ici, c'est de le redimensionner. Je vais donc passer le
jeu
à l'écran dans notre interface utilisateur Canvas, et prenons le formulaire de mise en page et prenons l'échelle à trois. Cela devrait être assez grand. Je peux donc le tester une
fois de plus très rapidement en jeu. OK, donc un coup, deux,
trois, quatre, cinq
coups, la partie est terminée. Et nous obtenons le bouton du menu principal. Et c'est le flux de base.
58. Suivi P57 du score élevé et affichage de l'interface utilisateur pour vaincre vos ennemis et survivre: bien,
c'est que notre jeu fait défaut, c'est
d'avoir un score élevé, de pouvoir suivre le nombre ennemis que nous avons
vaincus dans une partie, puis de mémoriser ce
score dans un fichier sécurisé pour obtenir une feuille de score élevée que nous pourrions voir sur l'écran du menu
principal. Pour mettre cela en œuvre, nous
devons d'abord commencer par compter le nombre d'ennemis que nous avons vaincus chaque fois qu'un
ennemi est vaincu. Nous allons donc
avoir besoin d'une combinaison de rapports sur l'état de décès à un gestionnaire de statistiques ou à un gestionnaire de meilleurs
scores, puis de prendre cette
valeur une fois le jeu terminé et de l'enregistrer pour
mettre à jour le fichier sécurisé. Plus tôt dans le cours,
nous avons donc ajouté un gestionnaire de jeu Singleton et nous n'en avons jamais
vraiment fait grand-chose En fait, la façon dont j'ai implémenté le jeu à l'écran
a fini par me contenter d' utiliser le
contexte du joueur plutôt que d'avoir à en rendre compte directement au gestionnaire de
jeu. Donnons donc un objectif au game
manager afin que nous
puissions l'utiliser dans le cours. Nous aurons donc un
objet dans
un gestionnaire de jeu pour les statistiques du jeu, puis nous le
suivrons pendant le jeu. Et puis nous le réglons
chaque fois que nous en démarrons un nouveau. Donc, dans les systèmes, je
vais
cliquer avec le bouton droit de la souris et créer un nouveau script. Disons que ce sont les statistiques du jeu, qui seront
prises en compte comme arbitre, car nous allons
simplement en faire un enfant du game
manager Singleton Ouvrez donc les statistiques du jeu, puis disons si
nos ennemis sont vaincus, ce sera un entier
dont la valeur par défaut est zéro, et nous aurons besoin d'un
nom de classe ici en haut Donc les statistiques du jeu.
Ensuite, dans le gestionnaire de jeu, j'aurai une fonction de démarrage, qui sera annulée,
et qui
reprendra nos statistiques de jeu
et les réinitialisera ou les
définira sur un nouvel objet. Donc, pour les statistiques du jeu. Ce seront des statistiques
égales à GameStats point nu. Allons-y pour le moment. Et quand le monde sera chargé, je vais avoir envie de prendre les statistiques du
jeu et de les réinitialiser. Attachons donc un
script au monde. Cliquez ici,
joignez un script. Nous allons le mettre dans la scène de base. Alors créez-le et je
dirais « prêt à fonctionner », et nous dirons game
manager point SAT. OK, donc quel que soit le chargement que
nous avons besoin de notre jeu au début, nous l'aurons
là. Donc, tant que nous utiliserons
le script mondial ici, nous serons en mesure
de le gérer. Nous pouvons également vouloir
lui donner un nom de classe. Cela pourrait devenir
un script assez important si nous devions continuer
avec la série. Je pense donc qu'il mérite
le nom de classe World. Donc maintenant, chaque fois que nous
commençons une nouvelle partie, cela réinitialise essentiellement les statistiques. Et puis peut-être signaler la fin de la partie. Nous pourrions envisager d'y aller
un peu plus tard et de sauvegarder les
statistiques des meilleurs scores comme il se doit. OK, maintenant je veux
modifier nos statistiques, et je veux signaler chaque fois que
nos statistiques sont modifiées. Dans les statistiques du jeu, nous allons donc créer un signal indiquant que nos
ennemis ont été vaincus. Signalez donc que les ennemis sont
vaincus, changés. Nous prendrons un montant et un
entier comme paramètres, et nous suivrons
un schéma
similaire chaque fois que nous
mettrons à jour la valeur, nous nous prémunirons contre le fait qu'il
s'agisse des mêmes valeurs. Si le nombre d'ennemis vaincus est égal
à la valeur, nous revenons simplement. Dans le cas contraire, nous allons
définir une nouvelle valeur. Ainsi, les ennemis vaincus ont une valeur
égale, puis nous disons que les ennemis vaincus ont changé le point m par une nouvelle valeur. OK, donc chaque fois que
nous mettons à jour la propriété, nous la signalons avec un signal afin que nous puissions
observer la propriété. Et je pense que c'est à peu près
tout ce dont nous avons besoin pour configurer une interface utilisateur. OK, maintenant que c'est fait, chaque fois que l'état de
mort est activé, disons, sur notre orc ou sur notre squelette, passons au script de l'état de
mort Donc, pour ce qui est de l'état de mort, je pense
que c'est sur Enter
qui est le plus logique pour indiquer les statistiques à points du gestionnaire de jeu, EMS vaincu plus égal à un, et c'est ainsi que nous allons
mettre à jour ce compteur en gardant une trace de tous les
ennemis que nous avons vaincus. Maintenant, la dernière chose dont nous avons besoin, c'est d'une petite interface utilisateur pour montrer
combien d'ennemis nous avons vaincus
. Donc, dans combien d'ennemis nous avons vaincus notre canevas d'interface de
jeu, ajoutons-en une autre. Faisons en
sorte qu'elle devienne un conteneur de panneaux. Ajoutez un conteneur à panneaux pour enfants ici, et nous placerons la mise en page sous forme d'ancres en haut à droite Je vais l'étirer
un peu comme ça. Compensez-le. Permettez-moi de
l'appeler la vue Game Stats. Cliquez ensuite avec le bouton droit sur Enregistrer une branche en tant que scène
et l'interface utilisateur, bien sûr, passe dans la scène, puis cliquons dessus avec le bouton droit de la souris
et donnons-lui un script. Ce sera donc le point de vue de Gamestt. Je peux lui donner le
nom de la classe, la vue du jeu. Et dans la vue en deux D
où nous le modifierons, ajoutons une étiquette pour nos
véritables ennemis vaincus. Cliquez donc avec le bouton droit sur Ajouter un nœud enfant. Nous allons commencer par un
conteneur HBox, je crois,
puis cliquer avec le bouton droit sur Achil
Node, étiquette Rich Text Je vais juste le dupliquer. Le premier servira donc
à afficher le texte, puis le second
sera le numéro. Ce sera donc le label statistique. Et puis celle du bas
sera l'étiquette du montant. OK. Le
label SAT indiquera donc systématiquement les
ennemis vaincus, deux points, adaptons-nous au contenu. Et puis
pour le second, je mettrai des crochets, zéro. Ce n'est donc qu'un espace réservé. Et je pense que nous en avons besoin
pour s' étendre afin de
pouvoir réellement les voir. Essayons donc de passer à la mise en page, dimensionnement du
conteneur et de l'
étendre à l'horizontale Ouaip. Et puis l'étiquette du montant, pareil. Accédez à la mise en page. Dimensionnement du contenant, étendre sur le, étendre sur l'horizontale OK, alors maintenant c'est un peu
ce que nous obtenons en ce moment. OK, maintenant,
appuyez sur Q pour accéder aux statistiques du jeu pour passer en mode sélection, et nous allons le réduire
à ce dont nous avons besoin. Un conteneur de marge serait
également bien ici Je vais
donc cliquer avec le bouton droit de la souris pour ajouter
un conteneur de marge enfant, et placer le conteneur HBox en dessous sur le conteneur de
marge Le thème remplace
les constantes et peut-être quatre pixels de chaque côté.
Ça a l'air bien mieux. Je pense que c'est peut-être
assez fonctionnel pour le moment. Je vais revenir à Game UI Canvas
et m'assurer qu'il se trouve à
nouveau dans le coin supérieur droit
en tant qu'ancre, haut à droite, puis le
décaler en appuyant sur W pour le déplacer Ensuite, déplacez-le un peu vers
le bas du coin. OK. Ensuite, dans
le script de GameStts View, je dois me connecter au signal
des Gamests Donc, la fonction est déjà soulignée. Nous allons créer un
gestionnaire de jeu où les statistiques indiquent les points sur les ennemis vaincus changent de connexion sur
les ennemis vaincus. Je vais prendre ce nom et créer
une nouvelle fonction ici, fonction sur l'ennemi
vaincu modifiée, qui annulera le montant P et le nombre entier, et nous allons
mettre à jour la valeur ici. OK, donc en gros, nous
prenons le nouveau montant et nous le fixons sur l'étiquette. Donc, chez Export VR. Quoi qu'il en soit, nous prenons l'étiquette «
ennemis vaincus », et nous définissons le texte comme étant
égal à une chaîne
du montant, et c'
est à peu près tout. Nous avons juste besoin de deux
points à la fin. Peut-être qu'une fois prêts, nous voulons affirmer que l'étiquette de
défaite de l'ennemi existe. Vous devez définir l'étiquette des ennemis vaincus pour indiquer le
nombre ou la monture des ennemis vaincus. Nous allons être un
peu plus précis. Maintenant, cliquez sur la
vue des statistiques du jeu, passez à la scène. Et à l'intérieur d'ici, nous
voulons attribuer cette étiquette de montant. Cliquez donc sur Attribuer et
choisissez l'étiquette du montant. Et si j'ai bien compris, cela
devrait être tout ici. Alors jouons
et essayons. Tout ce que nous avons à faire est de vaincre quelques ennemis et de les voir
apparaître en haut à droite. Le problème, c'est que les statistiques ne
sont pas initiées à quoi Je veux
donc
cliquer avec le bouton droit sur le symbole Lou .
Je suppose que
le problème est que les statistiques ne seront peut-être pas définies
avant que l'interface utilisateur ne soit prête, puisque c'est le
sommet du monde, je suppose que les enfants sont
prêts en premier. Donc, je suppose qu'une meilleure façon de le
faire serait de dire que les statistiques
sont égales au point u. Cela sera
donc toujours
créé au début du jeu Ensuite, nous voulons
appeler Stats Dot Reset. Nous allons donc simplement créer une
nouvelle fonction pour cela. Cela signifie également
que nous n'avons pas besoin de reconnecter les signaux car nous utilisons toujours le même objet C'est donc en fait une
meilleure façon de procéder. Passons aux statistiques du jeu et
créons notre fonction de réinitialisation. Donc réinitialisation des fonctions. Nous
ramenons simplement tout à ses valeurs par défaut. Donc, le nombre d'ennemis vaincus est égal à zéro, et cela devrait être tout ce dont
nous avons besoin pour le moment. Désormais, les statistiques devraient
être définies
dès le début du jeu, avant même que
le monde ne soit chargé. Ensuite, à partir de là, nous devrions pouvoir nous
connecter au signal. OK, essayons encore une fois. C'est bon, joue. OK, nous avons
un décompte en haut à droite. Bien sûr, c'est bien
trop petit, mais on peut au moins
s'en rendre compte. Vainquons donc un orc et
assurons-nous qu'il fonctionne. Et nous en avons un qui
apparaîtra si nous en tuons un autre. OK ? Voilà, nous en avons
trois. Donc oui, le décompte fonctionne à coup sûr. J'ai juste besoin d'agrandir l'interface utilisateur. Donc, dans le gameplay de Canvas, c'est ce que
nous allons faire ici. Une
échelle de transformation simple de trois. Déplacez-le vers
la droite ici. Et maintenant, nous devons réellement supprimer une grande partie
de cet espace supplémentaire. C'est juste
trop cher sans aucune raison. Je vais donc avoir besoin d'une
petite modification. Passons à
la vue des jeux. En fait, je vais le remettre à zéro sans les crochets qu'
il ne
soit pas affiché mal avant de
vaincre le premier ennemi il ne
soit pas affiché OK, maintenant que la
taille est trop grande,
je pense que c'est en grande partie
dû au fait que je définis
manuellement la taille de vue
du jeu Réduisons-le donc ici
à ce dont nous avons réellement besoin. Nous pouvons donc les réduire
beaucoup. Et cette seconde vue n'a pas besoin d'être aussi
grande que la première. n'y a donc aucune
raison de les faire occuper
autant d'espace. Je pense que ce que nous
voudrions peut-être , c'est davantage un conteneur de
flux. Permettez-moi de remplacer le type
de conteneur H box un conteneur flow H. OK, maintenant je vais passer
à l'étiquette du montant, et décocher la case « Développer » ici Ensuite, essayons de prendre la taille minimale personnalisée
et de la régler à 40 pixels,
probablement assez grande, pour que je puisse contenir au moins
mille chiffres. Et puis le reste
de l'
espace sera occupé
par l'ennemi vaincu. Nous allons également changer l'
affichage sur la base par
notre thème par défaut, le thème de jeu à chargement
rapide. Oui, d'accord, ça
va aussi avoir un impact important. Alors maintenant, si on y regarde, je peux vraiment le réduire. J'aurais vraiment dû le faire
au début. Donc, quelque chose comme
ça, c'est notre espace pour l'étiquette et le
numéro là-bas. Nous pouvons passer au game play UI Canvas et nous pouvons
le réduire considérablement. Vous pouvez voir que
tout ce
qui n'est pas le pixel de droite
est simplement consommé par l'étiquette de
texte sur la gauche. Il est donc préférable que ces deux
éléments n'essaient pas d' occuper une part égale de la taille
de la vue,
mais que l' un d'eux soit
similaire à une taille statique et que le reste s'agrandisse simplement. Ensuite, je vais juste mettre ça un peu plus dans un
coin là-bas. Nous allons appuyer sur Play. Et voyez
comment cela se passe. OK, c'est bien mieux, une taille
plus appropriée. Donc, bien sûr, juste
pour tester à nouveau. Nous allons simplement vaincre un gars, et cela sera mis à jour. Ainsi, nos ennemis vaincus comptent. Ajoutons donc une
statistique supplémentaire, à savoir
combien de temps notre joueur a
survécu dans le jeu,
une autre statistique utile à avoir
et qui combien de temps notre joueur a
survécu dans le jeu, nous permettra d'obtenir le meilleur score possible. Donc, dans notre point de vue Gamests, je vais dupliquer
ce conteneur HBox. Nous allons maintenant avoir
besoin d'un conteneur VBox qu'ils
puissent se superposer les
uns sur les autres Cliquez avec le bouton droit sur Margin
Container, ajoutez une VBox. Déplacez ces deux cases H
en dessous, comme suit,
et remplacez l'étiquette des
statistiques sur la gauche par deux points
indiquant le temps de survie. Et si nous passons à GameStatsView, ce sera une
configuration vraiment Nous allons simplement nous connecter
aux statistiques indiquant combien de temps nous avons vécu et les afficher
sur la zone du temps de survie. Faisons donc un clic droit sur Stats, recherchons le symbole
et ouvrons-le. Nous allons donc avoir survécu à
var time, qui est un float égal à 0,0. Nous allons définir sa valeur. Nous ne devrions pas vraiment avoir besoin de ce
gardien. C'est juste un extra. Donc je vais juste dire que le temps de
survie est égal à la valeur. Et puis, bien sûr, le
temps a survécu, a changé d'émission, le temps a survécu. Ensuite, nous aurons ce
signal ici en haut. Le temps a survécu, a changé. Ce qui va
être un flotteur temporel. OK, donc la
raison d'avoir ce gardien est juste que
si, pour une raison ou une autre, quelque chose dans le jeu fixait la valeur à laquelle
il se trouve déjà, par
exemple, les ennemis vaincus étaient de
50, et maintenant c'est à nouveau 50. Je déclencherais une actualisation
supplémentaire de l'interface utilisateur. Mais honnêtement, tout d'abord, il est peu probable
que cela se produise. Et deuxièmement, cela ne
devrait pas vraiment faire toute
une histoire. C'est donc plutôt
une question de technicité. Cela ne change que si
la valeur a réellement changé, plutôt que si cela pose vraiment
un problème pour le jeu. Je voulais donc simplement
clarifier cela. OK, maintenant, notre réinitialisation doit
également prendre le temps survie et le fixer à 0,0 parce que nous
réinitialisons l'heure OK, alors voyons quoi d'autre ? Dans notre univers de jeu, je pense que nous
voulons augmenter le temps. Ainsi, lorsque le monde fonctionnera, nous aurons un processus de
soulignement des fonctions Prendre le Game
Manager Dot Stats Dot TV Plus équivaut au Delta. Mais cela ne peut réellement se produire
que lorsque le joueur est vivant. Faisons donc simplement Exporter le contexte dans Exporter le
contexte VR, le contexte du joueur. Vous pouvez voir où nous utilisons cette ressource contextuelle dans le jeu à
différents endroits. avoir en
tant que ressource sauvegardée
est donc extrêmement utile
pour pouvoir répartir la référence
sur l'ensemble de notre interface utilisateur et sur les autres nœuds qui doivent
référencer le joueur sans avoir de
référence directe à la scène du joueur. J'espère donc avoir
clairement indiqué à quel point cela peut être utile. Nous avons donc le contexte du joueur, et nous voulons uniquement
augmenter le temps survie si le joueur est vivant. Donc, si contact point player
point stats point live, alors nous augmenterons le temps. Sinon, nous
allons simplement ignorer cela. Et cela devrait
suffire pour l'instant, j'ai besoin d'une référence à
la nouvelle étiquette de quantité. Nous dirons donc que dans Export var, Time label est une étiquette en texte enrichi, et il s'agit de la vue
GameSts, bien sûr Donc disons que Game Manager Point Stats Point Time Survive
Change Point Connect, on Time Survive
Survive, Change Et nous avons juste un autre
rappel ici. La fonction selon le temps de
survie est modifiée, obtient le flotteur PT. Nous allons renvoyer la valeur nulle, puis nous avons mis le
texte sur l'étiquette. Le
texte du point de l'étiquette horaire
sera donc égal à une chaîne du PT, et c'est probablement suffisant. Je vais également faire une assertion
sur l'étiquette
horaire . Assurez-vous qu'il est réglé. L'étiquette temporelle doit être définie pour mettre à
jour le temps de survie. OK. Et dans notre vue Gamests, attribuons cette
autre étiquette de montant Nous souhaiterons peut-être renommer
ces conteneurs HBox. Le premier conteneur était donc le conteneur vaincu de l'ennemi. Et puis le second est
le conteneur qui a survécu au temps. Donc, il suffit de clarifier
lequel est lequel. Assurons-nous que c'est
dans l'interface utilisateur du gameplay. Nous allons faire le tour du monde pour
voir à ce qu'il soit toujours là. Appuyez sur Play pour tester et exécuter et voir à quoi
cela va ressembler. Ah, d'accord, donc je n'ai pas défini le contexte du
monde, bien sûr. Sur le nœud mondial,
nous devons donc charger rapidement
le contexte du joueur. OK ? Et maintenant, si nous courons, le temps devrait
pouvoir augmenter. Et puis nous avons l'heure
là-haut en haut à droite. Maintenant, cela fonctionne pour l'essentiel. Je pense qu'il y a
quelques problèmes ici. Premièrement, il semble que nous devions l' étendre un
peu plus verticalement. Oh, sympa. Lorsque le
jeu est positif, il s'arrête également. C'est important. Ensuite,
je ne pense pas que nous ayons besoin d'afficher toutes les
millisecondes Je pense que le réduire
à une décimale
serait un peu moins
stressant pour les yeux Vous pouvez voir que les deuxième et troisième décimales volent. Tu ne peux même pas
le lire. Il ne sert donc à rien de montrer
cette information. OK, donc pour modifier notre fonction de réglage
du texte, nous allons plutôt utiliser
le pourcentage entre guillemets un F. Cela nous donnera la valeur flottante avec
une décimale, puis nous donnerons un symbole de
pourcentage afin ajouter la variable PT pour configurer
réellement cette chaîne OK, maintenant nous pouvons
appuyer sur Play et nous
verrons que l'heure n'
affiche que la première décimale C'est dix fois plus
lisible et moins distrayant. Mise à niveau majeure. Je pense donc que cela s'annonce
très bien pour nos statistiques de jeu. Je pense que la seule
chose que je pourrais changer c'est mettre le temps de survie en haut et l'ennemi est vaincu
en bas et appuyer
une fois de plus sur Play. Je pense que ça va juste
être un peu mieux. Le temps a survécu. Je pense que je veux la
plus voyante en haut à droite, puis les autres
statistiques plus mineures qui apparaissent en dessous, celles qui seront
le moins mises à jour Juste une petite
préférence visuelle. OK. Et juste pour montrer que nous
pouvons toujours vaincre les orcs, et cela ne fonctionne pas. Les statistiques du jeu sont donc au moins bonnes
en termes de gameplay.
59. P58 Enregistrement et chargement des scores hauts avec JSON: OK, maintenant que nos
statistiques de jeu fonctionnent, nous voulons nous en occuper
et en cas de défaite, nous voulons mettre à jour
les meilleurs scores
et les enregistrer dans un fichier JSON. Ce serait donc essentiellement le début d'un système d'économie de charge. Et dans ce type de
jeu, en particulier, il n'y a pas tant un
état de sauvegarde que des scores élevés, mais le processus serait vraiment similaire si vous
deviez enregistrer un fichier de jeu. En gros, vous devez
sérialiser les données dans un fichier, et l'un des moyens les plus
pratiques faire est le format JSON Donc, pour enregistrer et
charger les données, je veux avoir un objet de
sauvegarde. Normalement, j'en ferais un système distinct, mais le seul moment où
nous avons besoin de sauvegarder les données, c'est lorsque notre
personnage est vaincu, et nous allons gérer cela
via le gestionnaire de jeu. Je vais donc simplement
créer un nouveau script dans les systèmes, créer un nouveau script dans les systèmes, et je vais l'
appeler save load. Je ne vais pas l'appeler
système car il s'agit plutôt d' un composant du
game manager lui-même. Et cela sera compté. Je vais donc créer ce script. Élargissons
les systèmes. Ouvre-le. Nous pourrions lui donner le nom
de classe save load. Et nous allons avoir
besoin de deux fonctions ici : la fonction de sauvegarde
des statistiques, qui prendra les statistiques du jeu en
cours
comme paramètre. Donc des statistiques sur les statistiques du jeu, et nous allons annuler ici. Cela prendra donc les statistiques
actuelles et les transformera en un
dictionnaire de données, puis nous
sérialiserons ces données Les données de réalité virtuelle sont donc égales
à que je vais mettre
entre crochets ici au dictionnaire Colon, stats point two Bien entendu, cette méthode n'existe pas. Nous l'écrirons dans une minute. Et une fois que nous avons les
données dans un dictionnaire, s'
agit
d'un dictionnaire de données. D'ailleurs, il s'
agit
d'un dictionnaire de données. D'ailleurs,
je pourrais clarifier les choses
en y déclarant le type. Mais chaque fois que vous voyez
ces crochets et ce script GD, vous
parlez d'un dictionnaire Ensuite, nous transformons
ces données en une chaîne JSON. C'est donc très simple
à faire également. Nous dirons que la chaîne var JSON sera égale à JSunnu. Nous avons donc un nouvel
objet JSON qui
nous permet d' appeler cette chaîne de méthode
Pi sur nos données, et qui la rend dans un format de chaîne JSON
lisible au format JSON. Nous devons donc maintenant
ouvrir le chemin du fichier. Nous dirons donc que
le fichier var sera
égal au point d'accès au fichier OP Il s'agit donc d'une autre
classe statique de la bibliothèque Godo, et nous devons lui donner un chemin ,
puis un accès au fichier correct Nous allons donc dire le chemin du fichier de sauvegarde
, que nous n'avons pas encore défini, puis nous voulons y accéder ici. Alors, où allons-nous trouver le chemin du fichier
sécurisé
ici en haut ? Nous dirons var, le chemin
du fichier de sauvegarde est une chaîne. Cela sera égal à user
slash gametatt JSON. OK, donc ce
Fopath
signifie essentiellement qu'il va
enregistrer les données de l'application, en supposant que vous soyez sous Windows, pour ce projet de jeu spécifique, à la racine de ce dossier, il y aura un nouveau fichier
appelé gamesatt Donc, chaque jeu créé dans GADO possède
un dossier utilisateur dans Windows, où les données de l'application slash Gdolah le nom de
votre projet Ensuite, il va enregistrer le JSON
GameStatst à la racine. Ce fichier JSON est donc
effectivement votre fichier de sauvegarde. Dans un jeu de survie, le fichier de discussion correspond en fait à vos meilleures statistiques,
car chaque fois
que vous commencez une nouvelle partie, vous avez un nouveau personnage,
vous ne sauvegardez et ne chargez le jeu comme vous le
feriez dans un RPG classique Mais le processus est
plus ou moins le même. Donc, si le fichier existe et que nous avons dû l'ouvrir
pour l'écrire, n'est-ce pas ? Donc, si nous ne le trouvons pas, c'est qu'
il doit y
avoir une erreur. Mais si nous la trouvons, nous dirons file point store string parce que nous avons une chaîne
JSON là-haut, vrai, donc nous stockons simplement la chaîne
JSON dans le fichier, puis nous faisons file point Close. Et c'est ainsi que vous
écrivez dans le fichier. Sinon, si la bonne
opération
échoue, nous voulons envoyer un message
d'erreur, bien sûr. Donc, une erreur push ne
parviendra pas à ouvrir un
fichier pour écriture, et je pourrais dire au chemin, pourcentages, et nous
ferons avec les guillemets Ensuite, ici, pourcentage du chemin du fichier de
sauvegarde. Donc, en donnant autant
d'informations que possible, nous pourrons ensuite déboguer à partir de
là en cas de problème Bien sûr, vous devez orthographier correctement
porti error. Cela aiderait, et c'
est la fonction la plus sûre. OK, maintenant nous voulons utiliser
notre fonction de statistiques de chargement. Donc, les statistiques de chargement des fonctions, et nous allons
avoir l'
objet de statistiques sur lequel nous chargerons
les données. Les statistiques sont donc du type statistiques de jeu. Bien sûr, nous l'obtiendrons plus tard
dans le game manager. Et d'abord, nous voulons
ouvrir le fichier pour que R puisse y accéder. Donc, le fichier VR est égal à Dieu,
je ne peux pas taper pour le moment. Le fichier VR est égal au point d'
accès au fichier OP sur le chemin
du fichier de sauvegarde Nous chargeons et
enregistrons donc dans le même chemin de fichier. Et puis nous avons Fleaccess
point RED. Alors on y va. Supposons donc que s'il ne s'agit pas d'un fichier, nous n'avons pas réussi à ouvrir, alors
nous pouvons dire, erreur push, échec de l'ouverture du fichier pour
lecture aux pourcentages de chemin,
pourcentage, sauvegarde du chemin du fichier Nous pourrions même vouloir en
faire un booléen. Donc, si nous en faisons un booléen, nous pouvons renvoyer false ici, comme si nous avions échoué à l'opération Cela pourrait être un
peu plus utile. Plus tard, vous pourrez modifier Safsts pour qu'il fasse la même
chose si vous le souhaitez Et nous renvoyons false, pas littéralement le mot clé. À
ce stade, nos fichiers sont ouverts en lecture. Nous devons donc maintenant obtenir la
chaîne à partir du fichier JSON. Notre JSOText est donc égal
à file point Get as text. OK. Et la raison pour laquelle
cela ne s'affiche pas est probablement parce que je ne l'ai
pas tapé ici. Je pourrais donc parler d'accès aux fichiers. Voyons voir, le texte JSON doit également y
être souligné,
et nous pouvons continuer Nous avons donc obtenu le texte du fichier, nous en avons donc
terminé avec le fichier. Fermons le
dossier, fermons le filet. Si le fichier est vide, nous pouvons revenir ici. Le texte à points JS est donc vide. Ensuite, vous pouvez renvoyer
vrai ou faux ici. Cela dépend en quelque sorte
de ce que vous voulez. Je vais renvoyer vrai, en fait, afin que nous puissions indiquer que
l'opération a réussi, mais qu'il n'y avait aucune donnée à charger. Nous allons donc dire qu'il charge les
données de statistiques sur l'objet de statistiques du
jeu. Donc, si le fichier n'est pas vide, nous
devons le convertir. Donc var JSON
sera égal à Jsunt Nu. Nous avons donc un nouvel objet JSON, puis nous
voulons analyser le texte Supposons donc que var error soit égal à l' analyse de points
json sur le texte JSON Donc, s'il y a un
problème, cela renverra une erreur. Donc, en cas d'erreur, nous
voulons envoyer une erreur, pas réussi à analyser le JSON
avec les pourcentages d'erreur, et je dirais le pourcentage Je pense que cela pourrait ajouter des informations
supplémentaires utiles. Ensuite, nous renvoyons false
ici car, bien sûr, s'il y a une erreur lors de l'analyse du fichier, il y a un
problème majeur avec notre fichier SAI Il n'a probablement pas été correctement
formaté. OK, donc s'il n'y a pas eu d'erreur, nous savons que l'analyse a fonctionné correctement, nous pouvons donc dire var Une donnée d'un dictionnaire est
égale à une donnée json point g. Nous sommes donc en train de
le
transformer au
format GIDCognized sous forme Ensuite, nous dirons que les données de
Varsats sont un dictionnaire égal à data point Get in quote
Stats, je crois Et la valeur par défaut
est un dictionnaire vide. Ces statistiques devraient donc correspondre à
celles que nous avons ici. Nous avons enregistré les statistiques dans
la paire clé-valeur des statistiques, et nous devons les récupérer à
partir de la paire clé-valeur des statistiques. Donc, une fois que nous aurons nos données statistiques
réelles, qui sont un dictionnaire, nous pouvons faire des statistiques point
à partir d'un dictionnaire pour un autre, et nous allons transmettre
les données statistiques. Et c'est tout ce que nous devons
faire pour le chargement, donc nous revenons à la vérité. OK, je pense que ça a l'air
plutôt correct. Ce dont nous avons besoin maintenant, c'est
d'un dictionnaire à deux et d'une méthode de dictionnaire
pour nos statistiques de jeu. Donc, si nous ouvrons les statistiques du jeu, disons que function to dict
renvoie un dictionnaire, puis function
from dict va
prendre un dictionnaire de données
et renvoyer void. Donc, pour
en faire un dictionnaire, nous avons besoin d'un dictionnaire VR comme celui-ci qui sera
égal à un nouveau dictionnaire. Et puis, en fait, vous
savez, à l'intérieur d'ici, nous pouvons simplement regrouper
tout cela en une seule chose et mettre chaque nouvelle paire
clé-valeur sur une nouvelle ligne. Nous dirons donc que les ennemis vaincus sont égaux aux
ennemis vaincus. CD de deux points pour la paire
clé-valeur. Sur la gauche, vous
avez le nom de la chaîne et sur la droite, vous
avez la valeur réelle. Donc, sur la gauche,
nous avons survécu au temps. Ensuite, deux points, et temps a survécu jusqu'à la
variable de droite, puis nous renvoyons
le dictionnaire. Et c'est vraiment aussi simple que cela. Ensuite, pour from dictionary, nous voulons charger les anciennes valeurs
dans les valeurs actuelles. Nous allons donc faire en sorte que
les ennemis vaincus soient égaux à p data point git, la valeur clé de la paire d'
ennemis vaincus. Ensuite, la valeur par défaut, rendons-la nulle pour que,
si elle n'existe pas, nous rencontrions une erreur, car sinon nous la chargerions
à zéro, ce qui
remplacerait définitivement toutes nos données de sauvegarde On peut se demander dans quelle
direction vous voulez aller ici. Par exemple, voulez-vous que le chargement de la sauvegarde échoue
immédiatement, ou voulez-vous qu'il réussisse mais qu'il remplace ensuite les
anciennes données réelles, ce qui ne semble pas
vraiment souhaitable, n'est-ce Vous ne voulez pas annuler
la progression du joueur. Alors peut-être que ce serait plutôt comme vous deviez publier un
correctif ou quelque chose comme ça. Si vous vous retrouvez dans une
situation où le JSON
ne se charge tout simplement pas correctement, vous n'avez pas ce champ, il manque le nom,
quelque chose comme ça. C'est pourquoi je m'oriente
plutôt vers « Oh, ça
devrait être nul ». Ainsi, lorsqu'il essaie de définir le float sur une valeur nulle ou
un entier sur une valeur nulle, vous allez rencontrer une
erreur, et elle doit être corrigée, sinon toutes les parties de
vos joueurs seront interrompues. Je pense que c'est probablement
la voie à suivre. Le
temps de survie sera donc égal à pdta point get on time
survived sous forme de chaîne, puis la
valeur par défaut est OK, nous avons
donc les statistiques du jeu Actuellement, les seules
statistiques de jeu sont nos statistiques de jeu principales, nos statistiques de jeu actuelles, mais nous voulons également avoir des
statistiques de jeu persistantes,
nos statistiques de jeu les plus élevées. Je veux donc mettre une
fonction ici pour prendre la valeur la plus élevée par rapport
aux statistiques d'un jeu actuel. Je dirais donc que la fonction est
réglée au plus haut niveau, disons, établissez des scores élevés. Au P, statistiques du jeu actuelles, et cela
va être annulé. Nous allons donc l'
appeler uniquement en fonction nos statistiques de jeu les plus élevées, mais en gros, nous allons
prendre la plus élevée des
deux valeurs. Le nombre d'ennemis vaincus sera donc égal au maximum d'ennemis vaincus ou au point P actuel d'
ennemis vaincus. OK, donc nous
prenons simplement la valeur la plus élevée, et nous la fixons sur le
nombre entier d'ennemis vaincus. Et nous faisons la même chose
avec le temps qui a survécu. Le temps de survie est égal au maximum. Le temps a survécu, et le temps du point P
actuel a survécu. OK, c'est comme ça qu'on
obtient les meilleurs scores. Nous comparons simplement les
statistiques actuelles à la fin
du jeu pour voir si elles sont supérieures à nos meilleurs scores
actuels. Nous avons donc besoin de l'objet de sauvegarde, et nous avons également besoin des statistiques de jeu les plus
élevées dans notre gestionnaire de jeu. Ouvrons donc le gestionnaire de
jeu maintenant. Gestionnaire de jeu point GD. Nous aurons donc également ici
les statistiques du score le plus élevé de var, qui
sera un GamestStnu et nous aurons également ici le var saveoad qui sera égal
à notre objet save Il ne s'agit donc que d'un
composant local de notre gestionnaire de jeu. Nous pourrions même le rendre privé. Oui, pourquoi pas ? Rendez-le privé. Parce que selon la logique
de sauvegarde, nous voulons uniquement appartenir
au game manager Ce n'est pas vraiment
quelque chose que d'autres scripts devraient aborder, nous le rendons
donc privé. Donc, cette fonction ici,
disons la fonction End Game, je pense qu'il vaut mieux
la renommer Ce sera annulé. Donc, à la fin du jeu, nous voulons utiliser nos
statistiques de meilleurs scores, et nous voulons établir des scores élevés
avec nos statistiques actuelles. Ensuite, nous souhaiterons peut-être
réinitialiser les statistiques actuelles, mais je ne vais pas le faire car nous
voudrions peut-être afficher dans le menu principal du jeu les scores de la
dernière session,
afin de ne pas les réinitialiser
tant que nous n' aurons pas correctement
recommencé le jeu. Je pense que c'est légèrement mieux. Oh, et bien sûr, après avoir
établi les meilleurs scores, nous voulons appeler save
load point save stats. Nous allons donc enregistrer
les statistiques des meilleurs scores. Et je pense que ce n'est pas prêt. Oui, aucune fonction Ready. Et n'oubliez pas qu'il s'agit d'
Auto Load Singleton, donc dès que le jeu démarrera, il sera déjà chargé Et je veux souligner chargement par points
sur les statistiques les plus élevées Et oui, ça
gère le reste. Ainsi, la file d'attente logique pour la sauvegarde
et le chargement est essentiellement cachée à l'intérieur de cet objet de
sauvegarde ou plutôt
encapsulée, en fait Toute la charge de sauvegarde
se trouve donc à l'intérieur d'ici, mais c'est le gestionnaire
de jeu qui gère le
moment où il doit enregistrer
et charger ces données. Et comme vous pouvez le constater,
le gestionnaire de jeu est beaucoup plus facile à lire, car nous
répartissons ses fonctions en
différents composants plutôt que de
tout regrouper dans un script de gestionnaire de jeu géant Cette vidéo est donc un peu longue Je vais
donc réaliser la vidéo suivante sur la création de
l'écran du menu principal. Nous avons déjà le modèle pour cela car notre
bouton Game Over passe ici, mais nous n'avons
rien configuré ici Nous allons donc associer
cela aux statistiques des
meilleurs scores , avoir un affichage, un bouton Démarrer le jeu et un
arrière-plan d'écran de démarrage.
60. P59 Concevoir un menu principal avec un affichage à fort score et une fonctionnalité de démarrage du jeu: vais prendre la mise en
page du conteneur High Scores, Je vais prendre la mise en
page du conteneur High Scores,
et la placer sur les ancres en haut ou à
droite. Ensuite, je peux zoomer. Je vais appuyer sur Q pour déplacer cette
position à peu près là. Développons notre conteneur de meilleurs
scores, puis nous allons créer
d'autres nœuds de contrôle ici. Je vais donc cliquer ici pour
ajouter un nœud enfant. Disons Margin Container. Même histoire avec le conteneur
Margin. Nous voulons un thème de remplacement, quatre pixels sur chacun d'entre eux Ensuite, pour gagner
du temps, je pense que nous pourrions passer à la vue Gamesets. Et je vais copier-coller temps passé
et les ennemis vaincus. Je vais juste
contrôler tout voir et le coller
dans le menu principal. Donc à l'intérieur de là. Et j'ai oublié
un conteneur VBox, alors ajoutez un conteneur VBox,
puis déplacez ces deux conteneurs de texte
en dessous. Comme ça. Et puis c'est à peu près à
ça que ça va ressembler en ce moment. Sauvegardons le
conteneur des meilleurs scores dans sa propre scène, le bouton droit de la souris, disons sur une scène
branchien, comme ça Ensuite, je veux transformer
la mise en page et tripler l'échelle, comme ça. OK, donc quand nous le ferons,
cela va un peu
perturber
notre préréglage Anchors, donc je vais juste le
positionner là-bas Pas besoin de le rendre
vraiment parfait. Ouvrons également le conteneur des meilleurs
scores et ajoutons un texte de titre. Donc, en zoomant ici dans
le conteneur VBox, je vais cliquer avec le bouton droit de la souris et
ajouter une étiquette en texte enrichi Et positionnons-le
au-dessus du conteneur VBox. Vérifiez le contenu de Fit, et
disons les meilleurs scores, mais je vais le préfacer
par, disons, arc-en-ciel Terminez les crochets, passez à la fin Rainbow. Bien sûr, pour que cela
fonctionne, nous devons vérifier que le code BB est activé, et là nous obtenons un arc-en-ciel
par défaut. Je pense donc que je veux
baisser la fréquence et rendre cela moins dramatique. Supposons donc que la
fréquence soit égale à 0,5. Eh bien, passons même à 0,25. Ouais C'est bien mieux. Ensuite, nous avons besoin du
SAT pour la saturation. Disons donc une saturation
de 0,2, peut-être de 0,5. OK, c'est un peu plus
docile. C'est donc une bonne chose. Et nous allons faire le centre
d'alignement horizontal. OK, c'est pas trop mal. Donc, dans le menu
principal, nous pouvons voir à quoi
cela va ressembler. De retour dans le conteneur des meilleurs scores, attribuons la bonne étiquette. Max vaincu est donc
l'étiquette de quantité située sous le conteneur vaincu de l'
ennemi. Et puis l'étiquette ayant survécu le plus longtemps se trouve dans le contenant
ayant survécu. OK, sauvegardez ça, et
revenons à notre menu principal, nous avons besoin d'un arrière-plan texturé. Je vais donc faire un
clic droit sur le menu principal. Ajoutons un acte de texture. Je vais le renommer en
background wrecked. Nous y reviendrons.
De plus, sur l'écran du menu principal, nous voulons nous assurer que nous
désactivons le filtrage de la souris. Donc, souris sur la droite, nous tournons le filtre pour l'ignorer.
C'est important. Sinon, le menu principal
bloquerait les
boutons situés en dessous. Ajoutons donc
maintenant un bouton pour démarrer le jeu. Ajoutez donc un bouton. Renommons-le en bouton
Démarrer le jeu. Et si je me souviens bien, j'ai juste un script qui permet de changer de
scène immédiatement. Donc, bouton de changement de scène, je vais le glisser-déposer directement sur le bouton
Démarrer le jeu. Ensuite, nous devons lui donner
le chemin de la scène du monde. Donc, en haut à droite, chemin de la scène, sélectionnez le point mondial TCN, et maintenant ce bouton devrait
permettre d'ouvrir le monde, qui est notre scène de jeu Ce bouton est très
petit, bien sûr, nous devons
donc passer à la mise en page. Et je vais tripler l'
échelle ici. Positionnons-le également dans les ancres, puis disons
centre-bas. Nous pouvons zoomer ici. Je vais appuyer sur W.
Compensons-le jusqu'ici. Donnons-lui le
texte Démarrer le jeu, et nous voudrons peut-être également
sélectionner une icône. Passons donc à l'icône
sous forme de texture d'atlas, chargement
rapide et à l'atlas
à partir de notre projet de jeu. Je vais faire 64 ou 64. Modifiez la région et
choisissez simplement l'icône votre choix pour démarrer le
jeu. Donc je ne sais pas. Comme il s'agit d'un jeu basé sur le
combat, peut-être qu'une de ces
épées serait bonne Donc je vais juste prendre ça, assurer d'obtenir tous les pixels. Je dois donc l'
étirer vers la gauche, appuyer sur Fermer. Juste au cas où je
vérifierai également le clip du filtre. Nous ne voulons pas que des
pixels de bord s'y introduisent. Alors c'est essentiellement
notre jeu de départ. Appuyez sur le bouton W et
assurez-vous qu'il se trouve dans les limites de notre menu principal Passons également à Project, et nous allons prendre le menu principal et en faire notre scène de lancement
du jeu. Donc, en général, Run, au lieu de lancer
le monde maintenant, nous allons le charger. Le menu principal comporte des points TSCN. OK, maintenant voyons
où nous en sommes. Je vais appuyer sur Play. Nous avons le meilleur score là-haut,
nous avons Start Game. Appuyons sur Démarrer le jeu, qui lance notre scène de
jeu principale. C'est ce à quoi on pouvait s'attendre.
Et très rapidement, en fait, battons-nous pour que nous
puissions voir le meilleur score
sur notre menu principal. Bien entendu, j'ai renommé le jeu Game
Manager point report Nous devons
donc le remplacer par
Game Manager point end game. Cela dépend de l'état du joueur
vaincu. OK, maintenant
lançons-nous une fois de plus. Je vais donc m'assurer de me faire vaincre par l'une de ces œuvres, trois coups, quatre
coups, cinq coups. Et voyons voir. Les joueurs ont
déjà été libérés. C'est une bonne nouvelle pour le monde car nous avons effectivement
libéré le joueur. Nous devons également nous exprimer au
nom du monde entier. Si le processus fonctionne, où nous ajoutons
le temps de survie, nous devrons dire si
le contexte sort du joueur. Et nous devons dire que
cela n'est pas égal à zéro. Je pense que pour les références précédemment
libérées, si vous utilisez simplement le
lecteur Context Out , vous recevrez
toujours une erreur, mais si vous dites « n'est
pas égal à null », cela permettra de contourner ce problème. OK, donc en gros, si le
joueur n'existe plus, ou s'il
n'est plus en vie, nous allons ajouter le temps de
survie aux statistiques du jeu. Puisque le joueur a été supprimé, cela permettra de régler cette partie du problème, et nous devrions être prêts à partir. OK, donc encore un coup de poing, pour m'assurer
que ça fonctionne bien. Oh, nous pouvons voir que
le meilleur score a été mis à jour ici,
donc c'est une bonne chose. Il se peut que nous devions redimensionner légèrement
l'interface utilisateur. Comme vous pouvez le voir,
le problème ici, c'est qu'il affiche environ
12 décimales, donc nous allons changer
cela dans une minute Voyons si nous pouvons être vaincus en moins de 7
secondes. OK, allons-y. Un, deux, attendez. Améliorez cet équipement,
et il a échoué. OK. Nous devons donc trouver un ou
deux autres ennemis. Allons-y. 12 secondes Menu principal Vous pouvez voir que notre plus longue durée de
survie est actuellement de 12,6 secondes. Les ennemis en ont vaincu deux. Fermons le jeu et appuyons sur Play. Cela permettra de vérifier
que le chargement depuis le fichier fonctionne réellement. Fermons donc et appuyons sur Play. Je ne l'ai peut-être pas encore configuré. Il est intéressant de
voir si c'est le cas ou non. OK, donc oui, quand
le jeu se charge, le gestionnaire de jeu est l'une des premières choses à charger, et il charge déjà
dans le meilleur
score le meilleur score
enregistré dans le fichier. OK, donc c'est le moment
idéal pour montrer où cela en est
, présentons les données de l'application
dans Windows File Explorer, puis nous voulons trouver Godot Et puis je crois que
ce sont les données des utilisateurs de l'application, le dernier script GD du projet Script
Survivor Et juste ici,
nous avons Arjsofle. OK, alors modifions-le dans le Bloc-notes. Et là, vous pouvez
voir juste là. Nos statistiques de jeu réelles
sont enregistrées dans un fichier. Nos ennemis vaincus à
deux reprises ont survécu à 12,6 Ce sont nos données de jeu enregistrées, qui sont mises à jour chaque fois que nous sommes vaincus si nous atteignons
l'un de ces chiffres. OK, donc pour le conteneur des
meilleurs scores, le texte de survie le plus long, nous voulons juste
copier ce que nous
faisions dans la vue des statistiques du jeu. Je vais donc me lancer
dans ce script. Ensuite, je voudrais copier
ce bit ici, qui prend le
flux et nous donne une chaîne qui n'a qu'
une décimale Accédez au conteneur des meilleurs scores, et je le
remplacerai ici par celui-ci. Le PT, bien sûr,
sera en
fait le game manager point high
scorstts point Time survived Maintenant, si nous sommes en train de jouer, nous
arrivons au menu du jeu, nous devrions voir 12,6
secondes ici C'est beaucoup plus lisible
que notre meilleur score. Maintenant, pour ce qui est du contexte, je vais littéralement prendre une
capture d'écran du jeu. Et vous pouvez
désactiver l'interface utilisateur pour cela si vous souhaitez
faire une capture d'écran. Ce serait probablement
un peu plus utile. OK, désactivons également formes
de collision avant
de prendre la capture d'écran. Déboguez donc les formes de collision. OK, alors allons-y et prenons notre
site en tant que mise à niveau
afin que nous puissions le montrer. Je vais laisser deux de ces
micros sur la carte du jeu. Nous attendrons que le
squelette apparaisse, puis nous verrons si nous pouvons obtenir une belle capture d'écran dans le jeu Une chose que j'
envisagerais serait d'augmenter le taux d'apparition si nous voulions souligner nombre d'ennemis dans le jeu OK, alors faisons une capture d'écran ici. Je n'aime pas trop celui-ci. Faisons peut-être une capture d'écran. Alors, imprimez l'écran pour prendre une capture d'écran si cela
n'était pas évident. Et je vais ouvrir Gap. Gap est donc un éditeur d'images gratuit. C'est un peu comme Photoshop. Mais c'est gratuit. Alors
passons à File New, et je vais faire 1920
x 1080 pixels. Ouvre-le. Contrôlez V pour coller
notre capture d'écran, et prenons
quelque chose comme ça. Ce n'est pas vraiment un tutoriel de
retouche d'image ici, mais très rapidement, je vais en quelque sorte y coller une barre
supérieure. Donc, en utilisant un fond noir, nous pouvons lui donner le
texte si nous le souhaitons. Je vais choisir une police.
Allons-y donc avec Pixel Regular. Vous devez installer cette
police si vous voulez l'utiliser. OK, donc j'ai juste passé
un peu de temps à créer une
sorte de miniature personnalisée, sauf que nous allons
l'utiliser dans le projet final du jeu Il suffit donc de taper sur un
fond noir en haut texte
Pixar, de mentionner
qu'il s'agit d'un cours GD, d'un cours Do,
puis de l' Ce ne sera probablement pas la dernière miniature
du cours,
mais nous pouvons au moins l'utiliser pour l'écran du menu du jeu
pour le moment Et je vais l'ouvrir. Je l'ai exporté vers le
projet, bien sûr. Donc, là où vous l'avez enregistré,
vous pouvez voir que j'ai l'écran du menu
principal ici. Donc, ce que je veux faire et l'interface utilisateur, c'est en fait
le mauvais écran. Nous voulons le menu principal.
Nous passons à Background Rec. Je vais charger rapidement, et je vais rechercher l'
écran du menu principal. Mets-le dedans. Il se peut que je
doive augmenter la taille ici, alors passons au mode mise en page, aux ancres et faisons le point. OK, donc maintenant que tout cela est
complètement détruit, nous
voulons nous assurer que rien n'
est bloqué par cela Je pense donc que nous devons
le déplacer en haut à gauche. OK, les
meilleurs scores montrent que nous pouvons jouer. OK, et nous pouvons jouer, et nous devrions le voir là-bas. meilleur score de Script Survivors
est ici. C'est un cours de Gado Nous avons le
bouton Démarrer le jeu et l'icône Gado,
qui, je veux dire, sont assez
solides pour cinq ou dix minutes de travail. Je pense, bien
sûr, qu' elles peuvent être améliorées OK, donc maintenant, à ce stade, le jeu
est
presque terminé. Nous y avons notre écran de démarrage. Nous pouvons commencer le jeu,
les meilleurs scores, affichant pendant le jeu
pour les scores actuels et sur l'écran du menu principal pour
les meilleurs scores de tous les temps. Nous pouvons vaincre les ennemis.
Nous pouvons perdre la partie. Nous pouvons effectuer une mise à niveau, peut-être
voulons-nous faire un peu de nettoyage, exemple en supprimant ces
améliorations de départ de la carte du jeu C'est un peu bizarre
là-bas. Mais c' était juste là à des fins
de test. Peut-être voulons-nous augmenter la difficulté, ajouter de
nouveaux ennemis. Nous pourrions demander à notre
personnage principal, vous savez, montrer la lance
si nous
voulons qu' elle soit là
plutôt que de la lancer sans bras Mais, je veux dire, ça marche
pour ce qu'il est maintenant. Et nous pouvons
monter de niveau plusieurs fois. Il n'est pas prêt pour une
sortie complète, bien sûr. Il y aurait encore beaucoup
de travail à faire là-bas, mais tout
fonctionne essentiellement comme prévu.
La partie est terminée. Voilà notre meilleur score.
Peut-être pourrait utiliser une bande son, que le menu principal
pourrait utiliser une bande son, alors je pourrais faire une autre vidéo pour
peaufiner le cours,
mais c'est à
peu près
tout . J'espère donc que vous
avez tous
beaucoup appris jusqu'
à la fin. Je sais que c'était un cours
assez long, 11 heures plus le temps d'
édition total. Donc, je veux dire, si vous arrivez
ici, que vous avez
tout suivi et que votre
jeu fonctionne tel qu'il est, je veux dire, du bon travail parce que
c'était en fait beaucoup. OK, alors merci beaucoup d'
avoir regardé, en gros, la fin de mon cours de survie aux scripts,
le script GD dans Gadot 4.4
61. P60 Peaufiner les survivants du script ~ Améliorations et débogage: Dans cette vidéo, nous
allons donc essayer de peaufiner le prototype de notre script
Survivor. Tout d'abord, à la
fin de la dernière vidéo, j'ai sept erreurs
dans la console. C'est donc la première chose dont
nous allons nous occuper. Chaque fois que vous voyez une erreur, c'est bon moment pour la corriger, déboguer, découvrir
ce qui n'allait pas Nous avons donc des ramassages d'articles auxquels aucun article
n' est
réellement assigné Je pense donc que ce qui
serait vraiment pratique ici serait de
dire « pourcentage du Sud », puis de le mettre ici
sous forme de pourcentages OK, vous pouvez donc voir
que le message d'erreur ici n'est pas
aussi clair qu'il pourrait l'être. Lors du ramassage
d'un article,
il faut qu'il y ait un article, mais nous ne savons pas quel article
a réellement échoué. Donc, comment vous pouvez le faire lors
du ramassage d'articles, un script en deux D se trouve à la fin du script
assigné au ramassage, faire un pourcentage,
puis suivre la chaîne
avec un pourcentage automatique Cela remplacera donc les
pourcentages par le nœud, qui sera résolu par un nom de nœud ou, en d'autres termes, nœud
auquel l'élément n'a pas
été attribué OK,
refaisons-le encore une fois. Je vais juste jouer un petit moment, voir si nous rencontrons de nouveaux problèmes. OK, donc depuis le
ramassage de ces objets et la partie santé, cela indique que l'article n'
est pas prêt, ce qui est étrange car c'est certainement ce que
devrait faire l' exportation Donc, si l'élément est égal à null, nous signalons une erreur. Oh, d'accord, d'accord, d'accord.
J'ai donc fait une erreur ici. S'il s'agissait d'une affirmation,
cela fonctionnerait bien. Mais ce que nous
voulons vraiment faire, c'est
dire, si l'élément est égal à null, puis nous avons envoyé l'erreur. J'étais toujours dans la
logique des assertions là-bas.
Passons donc à la case départ. Si l'élément est nul,
nous envoyons un message d'erreur. Maintenant, si nous jouons, cela
devrait fonctionner, bien sûr. Sinon, cela
provoquerait toujours une erreur. Vous pouvez donc voir dans le
débugri ci-dessous qu'il n'y a
aucun problème pour le moment Je vais récupérer quelques objets. Faisons en sorte que les ennemis les abandonnent, et cela devrait très
bien fonctionner pour cela. Jusqu'à présent, il ne
semble pas y avoir d'
autres nouvelles erreurs. J'ai remarqué un petit problème
de mise en page de l'interface utilisateur ici. Donc je pense que si je prends
la faux ici, cela pourrait repositionner
cette interface utilisateur d'une manière étrange Oh, d'accord, c'est
ce qui s'est passé. La boîte HB était en fait en
train de s'agrandir pour s'agrandir. Donc, pour résoudre ce problème, je dois soit verrouiller
la taille en place. Bon sang, je devrais juste
l'agrandir puis le
déplacer vers la droite. Je pense que ce serait mieux. OK, donc pour cette interface utilisateur, nous devons l'étendre un
peu pour qu'elle ait de la
place pour griller. Je vais donc passer à l'interface utilisateur du joueur. Ensuite, prenons le conteneur du panneau
racine, étirez-le vers la droite pour
qu'il ait plus d'espace. Je vais accéder à l'interface utilisateur Game Play. Déplaçons-le vers la droite. Maintenant, si j'appuie sur Play et que nous
améliorons notre santé, et qu'il la redimensionne, cela ne
devrait plus pousser plus vers la
droite, car il y a
déjà de l'espace pour contenir
cette étiquette en texte intégral Et j'ai besoin de redimensionner un peu la disposition
des armes. Je l'ai un peu
mal décalé, donc je vais juste l'
aligner vers le haut, nous allons appuyer sur Jouer, démarrer le jeu. OK, et ça a l'
air plutôt solide. Dans le monde, je souhaite supprimer tous ces
micros par défaut C'était juste pour les tests. Ils ne devraient pas figurer dans
le prototype final Je vais
donc les supprimer avec Control X, en
les sélectionnant tous. Et je pense que je veux rendre le jeu standard un
peu plus difficile. Je vais donc passer au système
de génération, et augmenter
le taux de propagation. Je vais donc le
réduire au début pour augmenter
le
taux d'apparition Ajoutez également un point supplémentaire
ici, un peu comme ça. Ajustez le guidon,
quelque chose comme ça. Je veux juste une
courbe plus abrupte pour que plus d'ennemis apparaissent plus rapidement que je puisse montrer un gameplay
plus intense Dans la démo. OK ? Et tous jouent. Testons-le
un peu et voyons comment cela se passe.
Je vais donc commencer le jeu. Nous voulons que nos ennemis
arrivent au centre. Peut-être que les orcs sont
un peu trop lents. Je pourrais augmenter la vitesse de
déplacement des orcs et du squelette Il n'est donc pas vraiment nécessaire
de vous faciliter la tâche ici. OK. Voilà donc nos
squelettes et les orcs Je vais donc augmenter la
vitesse de déplacement des deux. Je vais chercher le contrôleur de
statistiques des orcs. Changeons les statistiques des orcs. La vitesse peut être, disons, 35, puis
passons au squelette. Vitesse du contrôleur satellite de 60. Je vais juste rendre les choses un
peu difficiles, puis le MX HP
pourra atteindre 100 points. C'est bon. Et le HP de l'orc est de 40. C'est bon.
Jouons. Démarrez le jeu. Une chose que vous pourriez
ajouter, c'est que je ne vais pas le
faire ici, mais le fait qu'
un ennemi apparaisse en rafale
au début rendrait
le jeu un
peu plus intense
si vous commencez le jeu en faisant un ennemi apparaisse en rafale
au début rendrait
le jeu un peu plus intense
si vous commencez le jeu en apparaître
instantanément dix
joueurs sur Cela pourrait aider.
Mais je pense que c'est un peu exagéré
pour le simple prototype Les œuvres avancent donc
un peu plus vite, et les squelettes
sont assez rapides maintenant Ce sera donc certainement
beaucoup plus difficile. Je dois prendre le HP
actuel et le régler sur 100 au début. OK, peut-être que les squelettes sont même un peu
trop rapides, honnêtement OK, donc fixons les PV de départ des
joueurs, le joueur, contrôleur de
statistiques, les
statistiques des joueurs, les PV à 100. Et je vais énerver un peu
les squelettes. Disons 50 vitesses. Je
pense que c'est plutôt juste. OK, en ce qui concerne les définitions des
niveaux des joueurs, je vais également faciliter
le passage au niveau supérieur. Je vais donc passer au niveau trois
et le mettre à cinq. niveau quatre sera de
dix XP, le niveau cinq peut être de 15, le niveau six peut être de 20, et le niveau
sept peut être de 25 HP. Ensuite, j'en
ajouterai un de plus pour 100. Et ce sera comme celui que
vous n'aurez pas vraiment l'occasion d'atteindre. En fait,
ajoutons-en un de plus. Disons 1 000 nouvelles définitions
de niveau. Si je fais en sorte qu'il soit
difficile d'y aller, c'est juste que cela n'arrive pas vraiment. J'ai en quelque sorte tout
gâché. C'était le niveau 1 000 prend dix XB. Ce
n'est pas ce que je veux. Ce que je voulais, et
supprimons cela, c'est le niveau 9, ce sera
une définition de niveau avec 1 000 EXP nécessaires, ajoutez-la Cela me permet donc
de ne pas avoir à prévoir une telle mise
à l'échelle
lors de la démonstration du prototype. Ce serait un peu
exagéré pour le moment. Alors, appuyons sur Play, et je vais
voir comment se déroule le jeu. Démarrez le jeu et nous
attendrons que les premiers
ennemis apparaissent OK, je pense que c'est un peu
trop facile au début. Je veux que ce soit intense rapidement. Donc je pense que ce que je vais faire
, c'est créer cette apparition
instantanée de dix mecs Donc, dans le monde, disons que
lors de l'exportation, V apparaît initialement, et je vais le définir
comme N égal à dix Le monde aura
une référence au système de génération,
donc au système de génération. Et puis, une fois prêt, je dirais que les portées initiales sont supérieures à zéro Ensuite, nous dirons système de génération. Laisse-moi voir. Comment s'appelaient
les fonctions ? Spawn aléatoire. Et dois-je l'appeler
dix fois ? Tiens bon. OK. Oui, et il
semblerait que je doive l'appeler dix fois, soit le
nombre de tranches initiales. Donc, pendant un certain temps, lors des premières apparitions, nous allons appeler
spaorsystem point Donc dix apparitions initiales, cela devrait nous faire apparaître dix mecs au
début de la partie D'accord, n'oubliez pas de configurer le système des commanditaires dans le monde Attribuez donc ce système de commandite. Référence directe au nœud,
appuyons sur Play. Et si cela fonctionne, nous aurons dix gars au
début du jeu,
ce qui devrait
rendre les choses encore plus difficiles OK, oui, ça fait beaucoup de joueurs pour le
début du match. Il suffit donc de les
éviter tous. C'est peut-être
trop dur, honnêtement. Je vais passer à cinq, et je vais également le remplacer par cinq
dans le script. Je pense que dix joueurs
au début, alors que tu
n'as même pas
atteint le niveau supérieur , c'est beaucoup
à gérer en un seul coup OK, nous avons donc nos
cinq gars à partir de maintenant. Allons chercher de l'XP. Je vais m'améliorer avec le
Syth, ce qui nous donnera un moyen supplémentaire de toucher les
ennemis. C'est beaucoup plus facile maintenant. Et je vais juste continuer à y aller. Apportons quelques améliorations puisque la courbe
d'EXP
a été beaucoup plus facile, nous devrions être en mesure de monter de
niveau assez facilement Mais je dois dire qu'
augmenter la vitesse des ennemis
les rend certainement beaucoup plus difficiles à esquiver, donc c'est quelque chose
à garder à l'esprit. Continuons à améliorer la lance. Donc je pense qu'à un certain niveau, la lance touche deux gars à la
fois. Il y est déjà. Une lance de niveau 3
peut toucher deux mecs. Ce qui est certainement
une énorme mise à niveau. Je suis juste en train de
passer en revue le gameplay ici. Les squelettes à 50
vitesses sont assez résistants. 60 vitesses pour les squelettes,
ce serait certainement trop. Continuons
avec la lance. Sur la base des paramètres actuels, je ne sais vraiment pas si la lance ou la
faux sont meilleures Avec de grands
groupes comme celui-ci,
la faux
serait probablement meilleure parce que, vous savez, elle peut
tous les toucher en même temps. Mais parfois, un
objectif unique est également important. Je veux dire, nous sommes juste en
train de comprendre comment jouer au jeu
en ce moment. Cela fait donc une tonne de squelettes, et à un moment donné, ils
vont en quelque sorte m'attraper Nous pouvons voir un
petit problème, ce genre de trop
s'agglutiner Je veux donc qu'ils ne s'
empilent pas les uns sur les autres, mais je pense que leurs formes de
collision sont probablement trop grandes pour le moment. Cela
les rend en quelque sorte incapables de bouger. Nous avons donc rencontré
un problème intéressant que nous pouvons résoudre. Mettons le jeu en pause,
puis je vais
prendre les squelettes toutes les scènes,
prenons la forme de la collision, et je vais la
réduire considérablement. Faisons en sorte que ce soit deux,
puis nous passerons à l'orc. Nous allons prendre sa forme de collision. Il s'agit de la forme de collision
du corps du personnage de base, et prenons cette forme de
collision, étendons-la et
définissons-la également à deux. Si nous interrompons le jeu, si cela fonctionne correctement, et je pense que c'est le Je ne peux pas dire 100 %. Ensuite, comme leur forme de
collision est plus petite, ils s'agglutineront moins Mais oui, c'est quand même assez difficile quand il y a
autant de mecs qui s'en prennent à vous. S'il y avait aussi des
projectiles, alors vous avez certainement un jeu
assez difficile à ce stade Je peux donc obtenir
quelques autres choses. Améliorons la
faux cette fois. Et passons au jeu à
l'écran. Je pourrais probablement me
balader pendant un moment, mais nous voulons juste vérifier que tout fonctionne toujours
avec le
prototype raffiné, fruité et solide qu'il contient. Et passons au menu principal. Notre temps a survécu. Je pense que je dois l'indiquer un peu vers la gauche juste pour qu'il y ait de la place pour le point décimal dans ce cas À part cela, je pense que
nous avons l'air plutôt bien. Donc, dans le menu principal, je vais juste l'étendre un peu vers la gauche, tout
mettre sur une seule ligne. Ça aura l'air mieux. Et peut-être que j'ai aussi
mis de
la musique dans le menu principal. Je vais donc cliquer avec le bouton droit sur un nœud. Faisons du
lecteur AudioStream, pas deux D, parce que, je veux dire, il n'y a
pas de monde à deux D maintenant Nous ne faisons que
regarder le menu du jeu. Chargons rapidement
notre AudioStream, donc .p3 car je dois le
trouver dans le OK,
ajoutons-le
maintenant dans le fichier audio à partir du dossier audio. Nous avons trois Red
Hearts Box jump. Nous allons également l'utiliser pour
le menu principal. Je vais mettre des écouteurs pour pouvoir tester
ça par moi-même. Jouons. Oh, je n'ai pas
vraiment joué le son. OK, alors passons au jeu automatique. Ouais. Et puis joue. OK, en fait, je voudrais
regarder le monde principal du jeu, et voir à
quel point c'est bruyant. C'est -40 décibels. OK, donc je veux même que ce soit un peu plus silencieux dans
le menu principal Faisons donc ça à -45
décibels. Je vais appuyer sur Play. Testez-le. OK,
puis on passe à Start Game. C'est un peu plus fort ici.
Peut-être que la musique de fin de partie que je fais un peu
plus fort que ça aussi OK. Donc, pour ce qui est du monde final,
je vais le prendre et le
mettre à moins 35 Je pense que je l'ai fait très silencieux pendant le cours parce que je ne
voulais tout simplement pas que cela
soit une interférence lorsque j'en parlais. OK, alors appuyons sur Play. Nous pouvons commencer le jeu.
OK, c'est bon. Un autre effet sonore que
je pourrais ajouter est que chaque fois que nous ouvrons l'écran de sélection du
niveau supérieur, je pense que cela peut
utiliser un effet sonore. À part ça, je pense que
nous avons l'air bien. Passons donc à l'écran de sélection du
niveau supérieur. D'accord, cliquez sur Ajouter un lecteur
AudioStrem ici. Voyons si nous avons de
bons effets
sonores de niveau supérieur dans le projet. Ce sera donc dans le menu de l' interface utilisateur
audio.
Bien sûr, laissez-moi vérifier. OK, l'article d'utilisation
semble fonctionner. Je vais donc utiliser le lecteur de
flux audio ici. Nous allons ajouter un article d'occasion. Cela ne fonctionnera pas automatiquement, je dois
donc passer à la sélection
LevelUp. Nous allons ajouter une fenêtre
contextuelle Export var. AudioStream, qui
sera un lecteur AudioStream. Nous allons donc dire pop
up audiostream point play, et je dois juste
corriger cette exportation OK, puis assurez-vous d'
ajouter la fenêtre contextuelle AudioStream dans l'exportation Nous devons donc l'ajouter. Nous pourrions faire à
ready assert si nous voulons assert pop up AudioStream N'oubliez pas de configurer le lecteur
AudioStream pour qu'il diffuse un son de niveau supérieur OK, maintenant appuyons sur Play.
Nous pouvons passer à Start Game. Et testons en battant
un ennemi, nous montons de niveau. Ensuite, nous procédons à notre mise à niveau. La musique continue. Et je trouve que c'est plutôt fluide. C'est vraiment sympa d'avoir un véritable effet sonore
pour le veo up. Continuons donc
avec Syth cette fois. C'est sûr que le
Syth fait la guerre ici. C'est peut-être OP, en fait. OK, donc Syth 4,
voyons comment ça se passe. C'est sûr, c'est vraiment difficile. C'est un gros problème. Comme
il s'agit essentiellement d'une AOE, elle ne devrait probablement pas
faire autant de dégâts,
soyons honnêtes OK, je pense que j'en ai assez
vu. Je vais juste
polir la lance. Et faites en sorte que la lance
soit plus amusante à utiliser. Passons donc au joueur, à
l'arme de lance. Passons à la définition de la
scène. Nous pouvons simplement l'améliorer autant que nous
le voulons, je pense Short de niveau 1. Nous pouvons
le laisser comme valeur par défaut Niveau deux, trois,
quatre, cinq. Voyons voir. Pour le niveau 2, je vais juste
lui faire infliger 20 à 30 dégâts,
puis le temps de recharge. Oui, on peut faire 0,9. Le niveau 3 sera de 30 à 35. Je pense que la lance peut également faire deux coups au niveau
deux. C'est très bien. Ensuite, au niveau 3,
nous infligerons 30 ou 40 dégâts. OK, donc le maximum atteint deux, puis nous augmenterons les projectiles à
deux au niveau quatre, ce qui fera 35 à 45
dégâts à 0,8 Et puis infligeons
40 à 45 dégâts. Cela peut aller plus vite.
Faisons en sorte que le refroidissement soit de 0,6. Les projectiles peuvent l'être, pourquoi pas ? Disons simplement
trois projectiles. Ça a l'air
dingue, mais bon. Ensuite, je vais faire un rapide tour
d'horizon avec la lance. Voyons si la lance peut
même rivaliser avec la faux. OK, encore des lances. Cela devrait nous
donner deux projectiles.
Cela devrait être bien mieux. Atteindre le niveau quatre
a été un peu difficile. Je ne vais pas trop
équilibrer cela, mais je voulais au moins le
rendre supportable Oh, mon Dieu. Le frai
devient un peu ridicule. Oh, j'ai oublié de mettre la musique en boucle. OK, ouvre le monde du jeu. C'est très important.
Donc, le monde du jeu. Ouvrons cette scène. Nous avons le lecteur de flux audio. Nous voulons prendre cette
musique et vérifier la boucle. Je pense donc que nous devons le
faire dans le cadre du projet. Faisons-en trois. Double-cliquez
dessus et activez le bouclage D'accord. Fermer.
Et puis autoplay Donc, sur votre lecteur de flux audio, vérifions Looping
on pour ce son Cela devrait également être sur l'écran du menu
principal au cas où. Voici les paramètres, en boucle, puis je vais remettre le jeu en pause Cela ne commencera donc pas tant que
nous n'y serons pas retournés. Donc, puisque nous avons atteint
le niveau 5 de la lance, nous ne pouvons plus sélectionner de lance C'est bien de vérifier
et de s'assurer que, vous savez, cela ne s'arrête pas en essayant
de passer au niveau 6 Nous pouvons donc toujours choisir
la faux, bien sûr. OK. Et je vais juste me
laisser mourir à ce stade. Je pense que oui. Tout semble
plutôt bien aller. Oh, et l'écran des meilleurs
scores ici, s'il ne s'
affiche toujours pas correctement, allons-y. Donc, pour les meilleurs scores, afin assurer qu'il y a
suffisamment d'espace ici, fixons-leur une
taille minimale. Je vais le régler sur 60,0, puis
étendre la base des meilleurs scores vers la gauche OK, prenez également
l'étiquette du montant, et faisons une
taille minimale de 60, d'accord ? Et nous pouvons prendre les meilleurs scores
et les augmenter encore
plus vers la gauche. C'est bon. Puis appuyez sur Play. Et assurez-vous simplement
que les meilleurs scores ne soient pas exagérés. Ce serait donc une bonne chose pour
au moins un chiffre de plus, je pense,
sans exagérer ni emballer ou quoi que ce soit d'autre. OK, donc à ce
stade,
je pense que le prototype
est relativement raffiné. Je suis sûr que
nous pouvons apporter des modifications au code et au contenu à ajouter
au jeu pour en
faire un jeu à part entière Mais en ce qui concerne le cours, qui montre les bases de la configuration de
tout cela,
un jeu semblable à un survivant
et GD Script Gudo 4.4, je pense que c'est à peu près
tout ce qu'il y a à J'espère donc que vous avez
vraiment apprécié de
suivre Long jusqu'au bout. Il y a peut-être quelques
petites vidéos de mise à jour, mais c'est à peu près tout. Merci encore d'
avoir regardé Iben Chris, et je vous verrai dans
mon futur contenu vidéo