Maîtriser Godot 4 : créer un Roguelike pour survivants avec GDScript t | Chris Tutorials | Skillshare

Vitesse de lecture


1.0x


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

Maîtriser Godot 4 : créer un Roguelike pour survivants avec GDScript t

teacher avatar Chris Tutorials, Game Developer

Regardez ce cours et des milliers d'autres

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

Regardez ce cours et des milliers d'autres

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

Leçons de ce cours

    • 1.

      Introduction du cours

      1:43

    • 2.

      Configuration du projet Godot

      6:38

    • 3.

      Art, son et plugins ~ Importer et installer

      8:46

    • 4.

      Mouvement du joueur

      34:39

    • 5.

      Jouer aux animations à partir des feuilles de papier Spritesheets

      9:51

    • 6.

      La machine à l'état du joueur

      18:49

    • 7.

      Entrées du joueur en tant que composant

      13:08

    • 8.

      Changer avec des signaux

      9:17

    • 9.

      Inverser un personnage 2D

      13:41

    • 10.

      Des couches de carte en forme de herbe et de terre battue

      16:38

    • 11.

      Placer des arbres comme accessoires de carte

      15:16

    • 12.

      Ajouter des stumps et corriger le tri Y

      9:41

    • 13.

      Projectiles survenus avec un minuteur

      14:54

    • 14.

      Déplacer des projectiles

      6:25

    • 15.

      Configurer des ennemis et des boîtes à succès

      16:55

    • 16.

      Infliger des dégâts aux ennemis avec des Hitboxes et des statistiques

      9:14

    • 17.

      État mort lorsque l'ennemi atteint 0 HP

      13:59

    • 18.

      Faire tourner et diriger des projectiles avec la fonction Weapon Load

      5:43

    • 19.

      Ajouter des effets sonores et de la musique

      7:21

    • 20.

      Combat System Singleton

      5:48

    • 21.

      Animer un texte de combat flottant

      18:26

    • 22.

      Mouvement ennemi avec suivi du joueur dans Godot 4

      16:53

    • 23.

      Faire germer des ennemis sur la courbe temporelle

      15:36

    • 24.

      Créé hors écran avec décalage calculé

      19:25

    • 25.

      Apparition d'ennemis aléatoires avec les conditions de poids et de temps

      15:11

    • 26.

      Configuration des joueurs Hurtbox et Enemy Hitbox

      7:09

    • 27.

      Player Invincibility Timer and Custom Stat Definitions

      10:45

    • 28.

      Appliquer des dégâts périodiques sur les boîtes à succès ennemies

      4:35

    • 29.

      Défaite d'un joueur à la main

      7:40

    • 30.

      Tester et améliorer le comportement sur la défaite des joueurs

      5:06

    • 31.

      Créer une scène Pickup2D

      6:00

    • 32.

      Mettre en œuvre un système de collecte d'expérience avec Héritage

      4:42

    • 33.

      Configurer Collector2D et corriger les animations des joueurs

      5:24

    • 34.

      Création de mécanismes de l'arrière ennemi et redimensionnement de capteurs

      11:32

    • 35.

      Générer des positions de déposage d'objets aléatoires

      4:45

    • 36.

      Mettre en œuvre une zone de gravité de pickup

      10:31

    • 37.

      Créer une interface utilisateur pour joueur avec les barres de progression HP et EXP

      11:15

    • 38.

      Mise en œuvre d'un système d'interface utilisateur basé sur des statistiques avec des signaux

      10:38

    • 39.

      Rédiger un script pour les affichages dynamiques HP et EXP pour l'interface utilisateur

      16:06

    • 40.

      Déboguer et optimiser l'interface utilisateur et les scripts pickup

      5:11

    • 41.

      Système de niveau avec expérience et progression statistique

      18:39

    • 42.

      Setting Up XP Thresholds and Signal Connections for Level Up Rewards

      9:47

    • 43.

      Créer la mise en page de l'interface utilisateur et le texte animé

      8:39

    • 44.

      Concevoir l'interface utilisateur et les ajustements finaux pour la sélection de récompenses

      8:35

    • 45.

      Créer un système de niveau pour les armes afin de les améliorer

      9:55

    • 46.

      Articles d'armes pour augmenter la puissance de leurs armes

      13:24

    • 47.

      Créer un système de sélection d'objets pondérés pour augmenter les récompenses

      14:30

    • 48.

      Codage d'une sélection de récompense avec propagation du signal

      18:35

    • 49.

      Application de statistiques de niveau d'arme à la création et aux instances de projectiles

      10:03

    • 50.

      Fabrication d'une arme en forme de Scythe rotative

      10:21

    • 51.

      Création d'une interface de présentation d'armes pour l'inventaire de jeux ory

      19:40

    • 52.

      Connecting Signals and Configuring Weapons UI for Dynamic Display

      19:31

    • 53.

      Créer des éléments augmentant les statistiques pour les mises à jour de joueur

      11:14

    • 54.

      Mise en œuvre de HP Boost Pickups et corrections de l'interface utilisateur de niveau

      10:33

    • 55.

      Créer une potion de santé en pile pour les chutes ennemis

      5:23

    • 56.

      Mettre en œuvre un tremblement de caméra pour les effets de frappe et de mort du joueur

      10:14

    • 57.

      Créer un jeu over écran avec la navigation dans le menu principal

      8:29

    • 58.

      Suivi de scores élevés et affichage de l'interface utilisateur pour vaincre les ennemis et survivre

      17:15

    • 59.

      Enregistrer et charger les scores élevés avec JSON

      13:54

    • 60.

      Concevoir un menu principal avec un affichage High Score et une fonctionnalité de jeu

      11:22

    • 61.

      ~ Améliorations et débogage

      16:34

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

Généré par la communauté

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

128

apprenants

1

projet

À propos de ce cours

Vous voulez construire votre propre combat automatique Roguelite rempli d'action, même si vous débutez en codage ?

Ce cours pour débutants vous guide pas à pas dans la création d'un jeu en 2D complet, Script Survivors, en utilisant Godot 4 et GDScript, le langage de script puissant et adapté aux débutants de Godot. Sans expérience préalable en codage ou en développement de jeux, vous apprendrez par la pratique et construirez un prototype soigné à partir de zéro !

Ce que vous apprendrez :

  • Maîtriser les bases et les bonnes pratiques de GDScript : écrivez du code propre et réutilisable avec des conventions de nommage appropriées (par exemple, snake_case), exportez des variables pour faciliter les ajustements et auto-documenter vos scripts à l'aide de commentaires pour assurer la maintenabilité.

  • Développez des mécanismes de jeu de base : implémentez des armes qui se livrent à des attaques automatiques (comme des lances et des fuscages), des systèmes de génération d'ennemis avec des courbes de difficulté ajustables, une collection d'expérience (EXP) et un système de niveau dynamique avec des améliorations percutantes.

  • Tirer parti du système de scènes et de nœuds de Godot : organisez votre jeu en utilisant des scènes pour la modularité (par exemple, un joueur, des ennemis et des scènes de monde), des nœuds pour les objets du jeu (CharacterBody2D, Sprite2D) et des minuteurs pour une planification précise des événements.

  • Concevoir des systèmes de combat engageants : concevez des mécanismes de santé et de dégâts, notamment des formes de collision pour des interactions précises, des cadres d'invincibilité et des améliorations permettant de gérer plusieurs cibles afin de satisfaire la gameplay.

  • Améliorer l'interface utilisateur et les systèmes de sauvegarde : créez des interfaces utilisateur intuitives (par exemple, des affichages de scores élevés, des écrans de niveau supérieur) à l'aide de nœuds de contrôle et mettez en œuvre un système de sauvegarde/charge basé sur JSON pour suivre les scores élevés des ennemis vaincus et le temps de survie.

  • Utilisez des machines d'état pour une logique plus intelligente : utilisez le plugin Limbo pour gérer les comportements des personnages et des ennemis (par exemple, état de veille, de course, d'attaque), simplifiant la logique complexe et vous préparant à utiliser des schémas d'IA avancés.

  • Appliquer de vrais modèles de développement de jeux : apprenez des compétences transférables comme l'encapsulation (par exemple, les scripts GameManager et SaveLoad), la gestion des ressources (par exemple, PlayerContext) et l'organisation de projets pour l'évolutivité pour des projets de plus grande envergure.

À la fin de ce cours, vous pourrez :

  • Ayez un jeu d'action 2D entièrement jouable avec des ennemis, des améliorations et un menu principal, prêt à être présenté dans votre portfolio.

  • Vous pourrez naviguer en toute confiance dans l'éditeur de Godot, du gestionnaire de projet à l'inspecteur, et utiliser des outils tels que AnimationPlayer et des textures atlas pour des visuels parfaits au pixel près.

  • Être équipé pour créer vos propres jeux avec une base solide en Godot 4, GDScript et en flux de développement de jeux, et pouvoir s'attaquer à de nouveaux projets avec aisance.

Pourquoi ce cours ?

  • Pour débutants : Commence par les bases, avec des explications claires de l'interface de Godot, de la syntaxe GDScript et des concepts de dév. de jeux, garantissant une courbe d'apprentissage fluide.

  • Apprentissage pratique : suivez le cours pour créer un « script survivors », un prototype complet avec du pixel art, de la musique chiptune et des effets sonores, guidé par des exemples pratiques.

Compétences réelles : apprenez des techniques professionnelles comme les machines à l'état, la sérialisation JSON et la conception modulaire, pour vous préparer à de plus grands projets de développement de jeux.

Lancez-vous dès maintenant, créez des jeux d'action addictifs qui donneront envie aux joueurs de revenir en couture !

Rencontrez votre enseignant·e

Teacher Profile Image

Chris Tutorials

Game Developer

Enseignant·e

I believe the best way to learn technology--and programming in particular--is through video-based learning. My role is to provide clear, hands-on video tutorials that guide you step-by-step, but ultimately, it's up to you to engage actively, absorb the concepts, and practice consistently. This approach helps you become a more confident and skilled developer.

I specialize in Godot game development using GDScript and C#, breaking down complex topics into manageable lessons that empower you to build your own projects from the ground up.

If you want to experience my teaching style before enrolling, check out my free tutorials on my YouTube channel, Chris' Tutorials. I look forward to helping you grow as a programmer and creator!

Voir le profil complet

Level: All Levels

Notes attribuées au cours

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

Pourquoi s'inscrire à Skillshare ?

Suivez des cours Skillshare Original primés

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

Votre abonnement soutient les enseignants Skillshare

Apprenez, où que vous soyez

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

Transcription

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