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 script n'importe quoi, vous devez avoir des objets de placeholder dans le monde pour utiliser comme vos pièces. Comme les plateformes de plateformes de mer que vous avez fait dans la section précédente, les pièces peuvent être des objets simples Part objets.
Pour créer les pièces :
Dans la fenêtre Explorateur , ajoutez un nouveau dossier dans le dossier Monde , puis renommez-le en 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 de brique à or .
- Définir Matériau à Métal .
- Définir la taille 0,6, 8, 4.
- Désactivez CanCollide . Cela signale au moteur que d'autres parties peuvent passer à travers la pièce, ce qui signifie que les joueurs peuvent marcher à travers les pièces pour les collecter.
- Activer Anchored . Cela signale au moteur de ne jamais changer 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 son emplacement.
Dupliquez quelques pièces supplémentaires et positionnez-les autour de la carte pour tester les fins.
Vos pièces de cylindre ressemblent maintenant à des pièces et empêchent la simulation de physique, mais vous devez ajouter une logique aux pièces pour 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 quand quelque chose touche une pièce, mais vous devez déclarer cela 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énementslocal 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énementsfor _, 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 de sortie imprime Player collected coin .
Explication du codeLes sections suivantes décrivent comment le script fonctionne plus en détail.
Initialisation des services et des variables
Comme avec beaucoup du code que vous avez probablement écrit dans d'autres langues, vous définissez des variables dont vous avez besoin plus tard au sommet du script. Notre code fait les suivre:
Obtenir des instances de service - Les services Roblox fournissent des fonctions intégrées pour les fonctionnalités courantes. Le script obtient d'abord des instances du service Workspace, qui contient tous les objets dans le monde 3D, et du service Class.Player », qui gère et contient tous les joueurs connectés à votre expérience.
Obtenez des références à toutes les pièces - Le script puis effectue des requêtes sur l'espace de travail 3D pour toutes les références à l'objet de pièce avec la méthode GetChildren(). Ce méthode renvoie un tableau contenant tout ce qui est associé à l'objet avec lequel vous avez créé précédemment le dossier Workspace.World.Coins .
Définit une variable globale - La variable COOLDOWN est utilisée plus tard pour définir la durée à laquelle désactiver une pièce après qu'elle soit collectée.
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énements
Le moteur Roblox simule physiquement le monde 3D et gère beaucoup de la logique pour gérer les événements liés à la 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 écouter et gérer eux, tout en laissant le moteur faire le reste. Dans ce cas, vous écoutez et gé
Détecte si la pièce est activée - Chaque Instance a un attribut Enabled qui définit si oui ou non l'objet existe dans le monde 3D. Vous pouvez obtenir des attributs d'instance avec la méthode 0> Class.Instance:GetAttribute()|GetAttribute()0>.
Détecte si un joueur a touché la pièce - Si la 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 est en fait un joueur. Lorsqu'un événement de touche se produit, le moteur Roblox passe l'objet qui a touché la pièce en tant que otherPart paramètre. Le script vérifie si le parent de other
Désactive la pièce si un joueur la touche, et la réactive après 10 secondes - Enfin, si un joueur touche la pièce, la méthode la désactive, attend 10 secondes, puis la réactive après 10 secondes pour la collections. task.wait() est utilisé au lieu de wait() car il fournit une meilleure performance en ne mettant
Définir le gestionnaire d'événementslocal 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
Connexion du gestionnaire d'événements
Tous les objets 3D simulés héritent de BasePart et ont donc un événement Touched(). Le suivant de la boucle connecte le gestionnaire onTouchedEvent() au toucher de chaque pièce en faisant les choses suivre:
Traversez toutes les pièces - Traversez chacune des pièces en utilisant l'itération générale.
Connectez le gestionnaire à l'événement - Dans chaque itération du boucle, la pièce est activée par défaut, de sorte qu'elle soit visible dans le monde 3D lors du début initial de l'expérience. La méthode onCoinTouched() du gestionnaire de pièces est également connectée à l'événement
Connexion du gestionnaire d'événementsfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end
Tester le mécanicien
Il est temps de voir si la mécanique de collecte de pièces fonctionne comme prévu. Pour tester votre expérience :
Dans la barre de menu, cliquez sur le bouton Jouer . Studio entre en mode playtest.
Déplacez votre personnage pour toucher une pièce. Si vos scripts fonctionnent correctement, la sortie window affiche Player collected coin , et la pièce disparaît pendant 10 secondes avant de réapparaître.