Les boucles de nidification vous permettent de répéter des tâches dans des lots. Par exemple, le fait de cuire trois lots de six cupcakes ou d'attribuer des armes aux joueurs sur deux équipes.
Comment les boucles imbriquées s'exécutent
Lorsque les boucles sont imbriquées, les scripts vont ligne par ligne jusqu'à ce qu'il atteigne le prochain boucle. Le boucle intérieur s'exécutera jusqu'à ce que sa condition soit remplie avant de revenir au boucle extérieur.
Logique de boucle imbriquée
Le tableau suivant montre les étapes qu'un boucle prend.
|
Exemple de boucle imbriquée
Les boucles imbriquées peuvent sembler un peu abstraites, alors un exemple visuel peut aider. Pour cet exercice, copiez et collez un script d'exemple et exécutez-le dans Studio. Ce script créera des tours de parties. La boucle extérieure contrôlera le nombre de parties à créer, tandis que la boucle intérieure créera le lot réel.
Créer un nouveau script dans ServerScriptService nommé PartMaker. Copiez le code ci-dessous.
local numberOfBatches = 7local partsPerBatch = 5local partsMade = 0-- Crée un seul cubelocal function createPart()local part = Instance.new("Part")part.Size = Vector3.new(2, 2, 2)part.CFrame = CFrame.new(20, 0, 20)part.Color = currentColorpart.Parent = workspaceend-- Boucle extérieurefor partBatch = 1, numberOfBatches doprint("Top outer loop: part batch " .. partBatch)currentColor = Color3.fromRGB(math.random(0, 255), math.random(0, 255), math.random(0, 255))-- Boucle internefor partNumber = 1, partsPerBatch docreatePart()print("Inner loop: part " .. partNumber)partsMade += 1task.wait(0.5)endprint("Bottom outer loop: " .. partsMade .. " parts made so far.")task.wait(2)endRegardez le script générer une autre série de pièces de couleur. Après avoir terminé une série, il s'arrêtera pendant 2 secondes. La déclaration d'impression dans le boucle extérieure ne s'exécutera qu'une fois par boucle intérieure terminée.
Nesté pour la tour Loop
Chaque boucle a son propre ensemble de code, afin qu'elle puisse être responsable de différentes tâches. L'une des choses que les boucles imbriquées peuvent faire est de changer le placement d'où un objet apparaît pour créer une tour comme celle dans cette vidéo. Il y a trois boucles différentes, l'une pour contrôler où le long de la largeur, de la hauteur et de la hauteur d'un cône se trouve.
Programmer un script de créateur de cubes
Pour pratiquer des boucles imbriquées, vous ferez un script qui crée une tour de cubes. Pour le script de la tour de cubes, codez d'abord une fonction qui génère un seul cube. La tour sera construite en appelant répètitivement cette fonction.
Configurer le script
Pour le script de la tour cube, d'abord code une fonction qui génère un seul cube. La tour sera construite en appelant répètitivement cette fonction.
Supprimer le script PartMaker ou désactivez-le (dans les propriétés du script, vérifiez Désactivé). Si vous ne l'avez pas, il y aura deux scripts qui font des parties à la fois dans le même emplacement.
Créer un nouveau script nommé TowerBuilder. Ajoutez des variables pour la taille de la tour et la taille du cube au sommet.
local TOWER_SIZE = 4local CUBE_SIZE = 2Ajoutez une fonction locale nommée makeCube() qui crée un seul cube carré en utilisant CUBE_SIZE.
local TOWER_SIZE = 4local CUBE_SIZE = 2-- Crée des cubes individuelslocal function makeCube()local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)endDéfinissez la couleur du cube sur une variable qui sera mise à jour dans les boucles imbriquées.
local function makeCube()local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorendEnfin, parent le nouveau cube dans l'espace de travail pour qu'il apparente.
local function makeCube()local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorcube.Parent = workspaceend
Génération dans différentes directions
Pour créer une tour, faites apparaître des cubes à des endroits spécifiques en configurant les propriétés X, Y et Z de chaque nouveau cube. X et Z sont côté à côté. Y est vers le haut et vers le bas.
Dans makeCube() , ajouter des paramètres pour spawnX , spawnY et 1> spawnZ1> . Ces numéros définiront le lieu de génération de chaque nouveau cube.
-- Crée des cubes individuelslocal function makeCube(spawnX, spawnY, spawnZ)local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorcube.Parent = workspaceendDans la fonction, définissez la propriété CFrame du cube à un nouveau CFrame en utilisant les spawnX, spawnY, spawnZ paramètres.
local function makeCube(spawnX, spawnY, spawnZ)local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorcube.CFrame = CFrame.new(spawnX, spawnY, spawnZ)cube.Parent = workspaceend
Génération avec des boucles imbriquées
Le script aura trois boucles totales, une pour la longueur, la largeur et la hauteur de la tour. Pour terminer un étage entier avant de déplacer vers le haut, commencez par définir la coordonnée Y dans le premier, le dernier boucle.
Sous la fonction makeCube(), créez un for loop pour définir comment haut chaque cube génère.
- Variable de contrôle : heightIndex = 1
- Fin du point : TOWER_SIZE
- Dans le loop, ajouter: local spawnY = (hauteurIndex - 1) * CUBE_SIZE
-- Construit la tourfor heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEendAvec la première boucle pour la hauteur terminée, commencez sur la deuxième. Dans la première boucle pour la boucle, ajoutez une nouvelle pour la boucle pour le lieu où se placer le cube le long de la longueur de la tour.
- Variable de contrôle : longueurIndex = 1
- Fin du point : TOWER_SIZE
- Dans ce même loop, ajouter : local spawnX = lengthIndex * CUBE_SIZE
for heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEfor lengthIndex = 1, TOWER_SIZE dolocal spawnX = lengthIndex * CUBE_SIZEendendDans le deuxième boucle, ajoutez un troisième pour le boucle pour la tour largeur . Dans ce boucle final, appelez 1> makeCube()1> et passez les paramètres X, Y, Z.
- Variable de contrôle : widthIndex = 1
- Fin du point : TOWER_SIZE
- Dans le loop ajouter:
- local spawnZ = widthIndex * CUBE_SIZE
- makeCube(spawnX, spawnY, spawnZ)
- Un délai de 0,25 seconde pour que vous puissiez regarder la tour être construite.
-- Construit la tourfor heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEfor lengthIndex = 1, TOWER_SIZE dolocal spawnX = lengthIndex * CUBE_SIZEfor widthIndex = 1, TOWER_SIZE dolocal spawnZ = widthIndex * CUBE_SIZEmakeCube(spawnX, spawnY, spawnZ)task.wait(0.25)endendendPour que chaque étage soit une couleur aléatoire, modifiez currentColor pour des nombres aléatoires RGB dans le même script dans lequel vous créez un nouveau étage.
for heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEcurrentColor = Color3.fromRGB(math.random(0, 255), math.random(0, 255), math.random(0, 255))for lengthIndex = 1, TOWER_SIZE dolocal spawnX = lengthIndex * CUBE_SIZEfor widthIndex = 1, TOWER_SIZE dolocal spawnZ = widthIndex * CUBE_SIZEmakeCube(spawnX, spawnY, spawnZ)task.wait(0.25)endendendExécutez le projet et attendez que une tour complète ait été créée sans aucun erreur dans la fenêtre de sortie.
Défis facultatifs
Ce sont ci-dessous différents défis de nature autonome qui utilisent des boucles imbriquées de différentes façons. Essayez de programmer par vous-même avant de regarder la solution.
Parties éloignées
À mesure que la tour est construite, faites disparaître les parties à travers la transparence de gauche à droite.
La solution de code est ci-dessous.
local TOWER_SIZE = 6
local CUBE_SIZE = 2
-- Crée des cubes individuels
local function makeCube(spawnX, spawnY, spawnZ)
local cube = Instance.new("Part")
cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)
cube.Color = currentColor
cube.Transparency = cubeTransparency -- Définit la transparence
cube.CFrame = CFrame.new(spawnX, spawnY, spawnZ)
cube.Parent = workspace
end
-- Construit la tour
for heightIndex = 1, TOWER_SIZE do
local spawnY = (heightIndex - 1) * CUBE_SIZE
currentColor = Color3.fromRGB(math.random(0, 255), math.random(0, 255), math.random(0, 255))
for lengthIndex = 1, TOWER_SIZE do
local spawnX = lengthIndex * CUBE_SIZE
cubeTransparency = (lengthIndex - 1) * 0.10 --Mises à jour à chaque début de boucle
for widthIndex = 1, TOWER_SIZE do
local spawnZ = widthIndex * CUBE_SIZE
makeCube(spawnX, spawnY, spawnZ)
task.wait(0.05)
end
end
end
Objets pleuvoir
Au lieu des parties, essayez de générer un objet réel. L'exemple ici a utilisé des cupcakes.
En posséder, voyez si vous pouvez :
- Créez un objet à partir de pièces de base. Assurez-vous de souder toutes les pièces ensemble pour que l'objet ne tombe pas en pièces.
- Placez l'objet dans ServerStorage
- Modifiez le PartMaker trouvé dans l' exemple de boucle imbriquée pour utiliser votre objet au lieu des parties.
Une échantillon est affiché ici.
Une solution de code utilisant des cupcakes est incluse.
local numberOfBatches = 30
local cupcakesPerBatch = 6
local cupcakesBaked = 0
--Fait un seul cupcake
local function makeCupcake()
local ServerStorage = game:GetService("ServerStorage")
local cupcake = ServerStorage.Cupcake:Clone()
local cup = cupcake.Cup
local frosting = cupcake.Frosting
cupcake:SetPrimaryPartCFrame(CFrame.new(0, 20, 0) * CFrame.Angles(0, 0, -90))
frosting.Color = frostingColor
cup.Color = cupColor
cupcake.Parent = workspace
end
-- Boucle extérieure
for cupcakeBatch = 1, numberOfBatches do
print("Top outer loop: cupcake batch " .. cupcakeBatch)
frostingColor = Color3.fromRGB(math.random(0, 255), math.random(0, 255), math.random(0, 255))
cupColor = Color3.fromRGB(math.random(0, 255), math.random(0, 255), math.random(0, 255))
-- Boucle interne
for cupcakeNumber = 1, cupcakesPerBatch do
makeCupcake()
print("Inner loop: cupcake " .. cupcakeNumber)
-- Muffins de piste cuits
cupcakesBaked += 1
task.wait(0.5)
end
print("Bottom outer loop: " .. cupcakesBaked .. " cupcakes baked so far.")
end
Résumé
Pour accomplir des tâches plus complexes, les développeurs trouveront utile de combiner plusieurs boucles, et même différents types de boucles. Toutes les boucles peuvent être imbriquées, ce qui signifie que l'un des boucles est à l'intérieur d'un autre. Les boucles imbriquées suivent la même logique que n'importe quel autre boucle. Ils commencent dans le premier, le boucle extérieure, exécute des tâches à travers des boucles intérieures, et puis retournent au premier boucle si applicable.