Les joueurs peuvent maintenant collecter des pièces et les perdre lorsqu'ils meurent, mais les pièces ne font rien, et la plupart du monde 3D est inaccessible sans la capacité de sauter très haut. Cette section du tutoriel vous apprend à finaliser la logique de votre expérience en ajoutant un bouton à l'écran qui dépense des pièces pour augmenter la puissance de saut.
Créer le bouton de mise à niveau
Les interfaces 2D dans Roblox sont généralement constituées d'un ensemble de composants GUI dans un conteneur GUI. Dans ce cas, vous avez seulement besoin d'un composant TextButton qui dit Améliorer le saut (5 pièces) à l'intérieur d'un conteneur ScreenGui.
Configurer le GUI de mise à niveauDans ReplicatedStorage, créez un dossier nommé Instances.À l'intérieur du dossier Instances, créez un ScreenGui nommé JumpPurchaseGui avec ResetOnSpawn désactivé.À l'intérieur de JumpPurchaseGui, créez un TextButton nommé JumpButton avec les propriétés suivantes :- Text: "Améliorer le saut (5 pièces)"- TextSize: 25- AnchorPoint: 1, 1- Position: {1, 0}, {1, 0}Aussi à l'intérieur du dossier Instances, créez un RemoteFunction nommé IncreaseJumpPowerFunction.Enfin, sur le service StarterPlayer, activez la propriété CharacterUseJumpPower.
Définir les données de puissance de saut
Actuellement, seule la quantité de pièces est stockée pour chaque joueur dans le script de module PlayerData. Vous devez également stocker et mettre à jour la puissance de saut de la même manière. Comme les fonctions dans PlayerData ne sont pas spécifiques aux données modifiées, tout ce qui est nécessaire pour stocker la puissance de saut du joueur est d'ajouter une clé Jump et d'initialiser sa valeur initiale dans defaultPlayerData().
Mettre à jour PlayerData avec la puissance de sautDans ServerStorage, remplacez le code existant du module PlayerData par le suivant :```lualocal PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"PlayerData.JUMP_KEY_NAME = "Jump"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number,["Jump"] = jumpPower: number}--]]}local function defaultPlayerData()return {[PlayerData.COIN_KEY_NAME] = 0,[PlayerData.JUMP_KEY_NAME] = 0,}endlocal function getData(player)local data = playerData[tostring(player.UserId)] or defaultPlayerData()playerData[tostring(player.UserId)] = datareturn dataendfunction PlayerData.getValue(player, key)return getData(player)[key]endfunction PlayerData.updateValue(player, key, updateFunction)local data = getData(player)local oldValue = data[key]local newValue = updateFunction(oldValue)data[key] = newValuereturn newValueendreturn PlayerData```
Mettre à jour les données de puissance de saut
Maintenant que PlayerData est capable de suivre la puissance de saut, vous devez implémenter la logique sur le serveur pour mettre à niveau la puissance de saut d'une requête du client.
Le serveur et le client peuvent communiquer via RemoteEvents ou RemoteFunctions. Les événements distants ne cèdent pas lorsqu'ils sont déclenchés et peuvent être utilisés pour une communication unidirectionnelle. Les fonctions distantes, en revanche, cèdent jusqu'à ce qu'elles reçoivent une réponse, ce qui permet une communication bidirectionnelle.
Pour ce tutoriel, le client doit savoir si le serveur a réussi à mettre à niveau la puissance de saut du joueur, donc vous devriez utiliser une fonction distante.
Créer JumpServiceDans ServerScriptService, créez un script nommé JumpService avec le code suivant :```lua-- Serviceslocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Moduleslocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)-- Événementslocal IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunctionlocal JUMP_KEY_NAME = PlayerData.JUMP_KEY_NAMElocal COIN_KEY_NAME = PlayerData.COIN_KEY_NAMElocal JUMP_POWER_INCREMENT = 30local JUMP_COIN_COST = 5local function updateJumpPower(player, updateFunction)-- Mettre à jour la table de puissance de sautlocal newJumpPower = PlayerData.updateValue(player, JUMP_KEY_NAME, updateFunction)-- Mettre à jour la puissance de saut du joueurlocal character = player.Character or player.CharacterAdded:Wait()local humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.JumpPower = newJumpPower-- Mettre à jour le tableau des scores de sautLeaderboard.setStat(player, JUMP_KEY_NAME, newJumpPower)endendlocal function onPurchaseJumpIncrease(player)local coinAmount = PlayerData.getValue(player, COIN_KEY_NAME)if coinAmount < JUMP_COIN_COST thenreturn falseend-- Augmenter la puissance de saut du joueurupdateJumpPower(player, function(oldJumpPower)oldJumpPower = oldJumpPower or 0return oldJumpPower + JUMP_POWER_INCREMENTend)-- Mettre à jour le tableau des pièceslocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)return oldCoinAmount - JUMP_COIN_COSTend)-- Mettre à jour le tableau des scores de piècesLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)return trueendlocal function onCharacterAdded(player)-- Réinitialiser la puissance de saut du joueur lorsque le personnage est ajoutéupdateJumpPower(player, function(_)return 0end)end-- Initialiser tous les joueurs ajoutés avant de se connecter à l'événement PlayerAddedfor _, player in Players:GetPlayers() doonCharacterAdded(player)end-- Initialisation normale des joueurs depuis l'événement PlayerAddedlocal function onPlayerAdded(player)player.CharacterAdded:Connect(function()onCharacterAdded(player)end)endlocal function onPlayerRemoved(player)updateJumpPower(player, function(_)return nilend)endIncreaseJumpPowerFunction.OnServerInvoke = onPurchaseJumpIncreasePlayers.PlayerAdded:Connect(onPlayerAdded)Players.PlayerRemoving:Connect(onPlayerRemoved)```
Les sections suivantes décrivent le code plus en détail.
Mettre à jour les données de puissance de saut - updateJumpPower() met à jour la puissance de saut du joueur et le tableau des scores pour offrir un retour visuel. Cette fonction ressemble au code qui endommage des joueurs dans Créer des dangers pour les joueurs. Étant donné qu'un modèle Character et Humanoid existent pour le joueur amélioré, la fonction met à jour la propriété JumpPower avec la nouvelle valeur stockée par PlayerData, l'augmentant de 30. Si vous souhaitez que votre jeu dure légèrement plus longtemps, vous pouvez réduire ce nombre.
Valider les demandes du serveur - onPurchaseJumpIncrease() vérifie d'abord que le joueur a réellement le nombre de pièces requis pour acheter la mise à niveau. Toutes les demandes des clients au serveur doivent être validées pour empêcher des acteurs malveillants de soumettre de fausses demandes et d'exploiter votre jeu.
Ajouter le bouton à la GUI du joueur
Un objet ScreenGui n'est affiché à l'écran que s'il est parenté à l'objet PlayerGui d'un joueur. Par défaut, cela contient l'interface système comme la fenêtre de chat. Vous devez maintenant créer un script dans ReplicatedStorage pour copier le bouton de mise à niveau dans la GUI de chaque joueur et implémenter son comportement lorsqu'il est pressé.
Créer JumpButtonClickHandlerDans ReplicatedStorage, créez un script nommé JumpButtonClickHandler avec RunContext défini sur Client et le code suivant :```lualocal ReplicatedStorage = game:GetService("ReplicatedStorage")local Players = game:GetService("Players")local player = Players.LocalPlayerlocal playerGui = player.PlayerGuilocal IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunctionlocal jumpPurchaseGui = ReplicatedStorage.Instances.JumpPurchaseGuilocal jumpButton = jumpPurchaseGui.JumpButtonlocal function onButtonClicked()local success, purchased = pcall(IncreaseJumpPowerFunction.InvokeServer, IncreaseJumpPowerFunction)if not success then-- purchased sera le message d'erreur si le succès est fauxerror(purchased)elseif success and not purchased thenwarn("Pas assez de pièces !")endendjumpButton.Activated:Connect(onButtonClicked)-- Ajouter le JumpPurchaseGui à la GUI du joueurjumpPurchaseGui.Parent = playerGui```
Les sections suivantes décrivent le code plus en détail.
- Obtenir des références au GUI et à la fonction serveur - Les variables IncreaseJumpPowerFunction, jumpPurchaseGui, et jumpButton contiennent des références à la fonction et au GUI qui appelle la fonction dont vous aurez besoin plus tard.
- Définir le gestionnaire d'événements - onButtonClicked() définit la logique pour lorsque les utilisateurs cliquent sur le bouton de mise à niveau. Il utilise pcall() (appel protégé) pour invoquer la RemoteFunction. Toute communication client-serveur comme celle-ci nécessite pcall() pour gérer les erreurs ou les problèmes de connexion.
- Connecter le gestionnaire au bouton - L'événement Activated est compatible sur toutes les plateformes, y compris la souris, l'écran tactile ou le contexte de la manette. Il se déclenche lorsqu'un clic, toucher, ou bouton de manette est relâché.
Tester le jeu
Sélectionnez Tester dans le menu déroulant et cliquez sur Jouer. Le bouton Améliorer le saut apparaît dans le coin inférieur droit.
Essayez de cliquer sur le bouton avant de collecter des pièces pour vérifier qu'il ne vous accorde pas de puissance de saut supplémentaire, puis essayez de collecter des pièces et voyez si la mise à niveau fonctionne lorsque vous cliquez à nouveau.
Avec le code complet, essayez de régler la difficulté : ajoutez des pièces si le rythme semble lent, ou enlevez-en quelques-unes et placez-les dans des endroits plus délicats si les mises à niveau sont trop faciles à obtenir.