Maintenant que vous avez un monde 3D, cette section du tutoriel vous apprend à ajouter votre premier script pour définir une mécanique de collecte de pièces.Cette mécanique permet aux joueurs de collecter des pièces, et désactive la collecte d'une pièce si elle a été récemment collectée.
Créer les pièces
Avant de pouvoir programmer quoi que ce soit, vous devez avoir des objets de remplacement dans le monde à utiliser comme vos pièces.Comme les plates-formes de pile de mer que vous avez faites dans la section précédente, les pièces peuvent être des objets simples Part.
Pour créer les pièces :
Dans la fenêtre Explorateur , ajoutez un nouveau dossier dans le dossier Monde , puis renommez-le pièces .
Insérez une partie cylindre dans le dossier pièces , puis renommez la partie en pièce .
Sélectionnez la partie, puis dans la fenêtre propriétés ,
- Définir Couleur brique à Or .
- Définir Matériel à Métal .
- Définir la taille à >.
- Désactivez CanCollide .Cela indique au moteur que d'autres parties peuvent passer à travers la pièce, ce qui signifie que les joueurs peuvent traverser les pièces pour les collecter.
- Activer Ancré .Cela indique au moteur de ne jamais modifier la position de la pièce en raison de toute simulation liée à la physique, ce qui signifie que les joueurs peuvent toucher la pièce sans affecter sa position.
Dupliquez quelques pièces supplémentaires et positionnez-les autour de la carte à des fins de test.
Vos parties de cylindre ressemblent maintenant à des pièces et empêchent la simulation de physique, mais vous devez ajouter de la logique aux pièces afin que les joueurs puissent les collecter.
Créer le script
Pour que les pièces soient collectables, vous voulez réagir aux joueurs qui les touchent.Le moteur Roblox peut vous notifier lorsque quelque chose touche une pièce, mais vous devez le déclarer dans un script.Pour créer un script :
Dans la fenêtre Explorateur , passez la souris sur ServerScriptService et cliquez sur le bouton ⊕ . Un menu contextuel s'affiche.
Dans le menu contextuel, sélectionnez Script .Un nouveau script s'affiche sous ServerScriptService , qui indique au moteur d'exécuter le script sur le serveur et empêche les clients d'accéder au code.
Renommez le script en CoinService .
Remplacez le code par défaut par le code suivant :
-- Initialisation des services et des variableslocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10-- Définir le gestionnaire d'événementlocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Le joueur a touché une piècecoin.Transparency = 1coin:SetAttribute("Enabled", false)print("Player collected coin")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- Configurer les écouteurs d'événementfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)endMaintenant, chaque fois qu'un joueur touche une pièce, la pièce disparaît pendant 10 secondes, et le journal des sorties imprime Player collected coin .
Explication du codeLes sections suivantes décrivent comment le script fonctionne plus en détail.
Initialiser les services et les variables
Comme avec beaucoup de code que vous avez probablement écrit dans d'autres langues, vous définissez des variables dont vous avez besoin plus tard en haut du script.Notre code fait ce suivre:
Obtenir des instances de service - Les services Roblox fournissent une fonctionnalité intégrée pour les caractéristiques communes.Le script obtient d'abord des instances du service Workspace qui contient tous les objets du monde 3D, et du service Player qui gère et contient tous les joueurs connectés à votre expérience.
Obtenir des références à toutes les pièces - Le script interroge ensuite l'espace de travail 3D pour toutes les références aux objets de pièces avec la méthode GetChildren().Cette méthode renvoie un tableau contenant tout ce qui est parenté à l'objet avec lequel il est associé, qui dans ce cas est le dossier Workspace.World.Coins que vous avez créé précédemment.
Définit une variable globale - La variable COOLDOWN est utilisée plus tard pour définir la durée de désactivation d'une pièce après sa collecte.
Initialisation des services et des variableslocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10...
Définir le gestionnaire d'événement
Le moteur Roblox simule physiquement le monde 3D et gère une grande partie de la logique pour gérer les événements liés au rendu, à la physique et au réseau.Lorsque vous êtes intéressé par le scripting de votre propre logique pendant certains de ces événements, vous pouvez les écouter et les gérer, tout en laissant le moteur faire le reste.Dans ce cas, vous écoutez et traitez les événements liés aux pièces qui sont touchées.Le script définit la logique pour gérer cet événement dans la méthode onCoinTouched(), qui fait ce qui suivre:
Détecte si la pièce est activée - Chaque a un attribut booléen qui définit si oui ou non l'objet existe dans le monde 3D.Vous pouvez obtenir les attributs d'instance avec la méthode GetAttribute().
Détecte si un joueur a touché la pièce - Si une pièce est activée, la méthode utilise le service du joueur pour vérifier si l'objet qui a touché la pièce était en fait un joueur.Lorsqu'un événement de touch se produit, le moteur Roblox transmet l'objet qui a touché la pièce en tant que paramètre otherPart.Le script vérifie si le parent de otherPart appartient à un joueur.
Désactive la pièce si un joueur la touche, et la réactive après 10 secondes - Enfin, si un joueur a touché la pièce, la méthode désactive la pièce, attend 10 secondes, puis réactive la pièce pour la collections.task.wait() est utilisé à la place de wait() car il fournit une meilleure performance en ne mettant pas entièrement en pause l'exécution du code, ce qui permet aux tâches dans d'autres fils de s'exécuter simultanément.
Définir le gestionnaire d'événementlocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Le joueur a touché une piècecoin.Transparency = 1coin:SetAttribute("Enabled", false)print("Player collected coin")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend
Connectez le gestionnaire d'événements
Tous les objets 3D simulés hérités de BasePart et donc ont un événement Touched().La boucle suivante connecte le gestionnaire onTouchedEvent() à l'événement de toucher de chaque pièce en effectuant ce qui suivre:
Itération à travers toutes les pièces - Itération à travers chacune des pièces en utilisant une itération générale.
Relier le gestionnaire à l'événement - Dans chaque itération de la boucle, la pièce est activée par défaut, ce qui la rend visible dans le monde 3D au cours du démarrage initial de l'expérience.La méthode handler onCoinTouched() est également connectée à l'événement Touched de la pièce afin qu'elle s'exécute chaque fois que l'événement se produit.Lorsque le moteur détecte une touche, il passe également dans l'objet qui a touché l'objet, otherPart .
Relier le gestionnaire d'événementsfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end
Tester la mécanique
Il est temps de voir si la mécanique de collection de pièces fonctionne comme prévu. Pour tester votre expérience :
Dans la barre d'outils, cliquez sur le bouton Jouer . Studio entre en mode de test de jeu.
Déplacez votre personnage pour toucher une pièce.Si vos scripts fonctionnent correctement, la fenêtre Sortie s'affiche Player collected coin et la pièce disparaît pendant 10 secondes avant de réapparaître.