Loop ng nesting memungkinkan Anda untuk mengulangi tugas dalam batches. Misalnya, memanggang tiga batches dari enam cupcake, atau menetapkan senjata ke pemain di dua tim.
Bagaimana Loop yang Dipicu Berjalan
Ketika loop diberantai, skrip berbaris sampai itu mencapai loop berikutnya. Loop dalam akan berjalan sampai kondisinya dipenuhi sebelum kembali ke loop eksternal.
Logika Loop yang Dipiram-piram
Diagram berikut menunjukkan langkah-langkah yang ditempuh oleh siklus.
|
Contoh Loop Terpiru
Loop yang terpengaruh dapat tampak agak abstrak, jadi contoh visual dapat membantu. Untuk latihan ini, salinan dan pasa beberapa script sampel dan eksekuti di Studio. Skrip ini akan membuat menara bagian. Loop luar akan mengontrol berapa banyak bagian untuk dibuat, sementara loop dalam akan meng
Buat naskah baru di ServerScriptService bernama PartMaker. Kopi kode di bawah ini.
local numberOfBatches = 7local partsPerBatch = 5local partsMade = 0-- Membuat kubus tunggallocal 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-- Lingkaran luarfor 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))-- Lingkaran dalamfor 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)endPerhatikan saat skrip menghasilkan beberapa batangan berwarna yang berbeda. Setelah melewati satu batangan, itu akan berhenti selama 2 detik. Pernyataan cetak dalam lingkaran luar hanya akan dijalankan satu kali per lingkaran dalam.
Terbungkus Untuk Menara Loop
Setiap loop memiliki kumpulan kode sendiri, jadi dapat bertanggung jawab atas tugas yang berbeda. Salah satu hal yang dapat dilakukan serangkaian balik berlebihan adalah mengubah letak di mana objek muncul untuk membuat menara seperti yang ada dalam video ini. Ada tiga serangkaian balik, satu untuk mengontrol di mana lebar, panjang, dan ketinggian menara muncul.
Mengkode Skrip Pembuat Kubus
Untuk melatih loop berlekatan, Anda akan membuat skrip yang menciptakan menara kubus. Untuk skrip menara kubus, pertama-tama kode fungsi yang menghasilkan satu kubus. Menara akan dibangun dengan secara berulang menyebut fungsi ini.
Mengatur skrip
Untuk naskah menara kubus, pertama kode fungsi yang menghasilkan satu kubus. Menara akan dibangun dengan mengulangi panggilan fungsi ini.
Hapus PartMaker script atau nonaktifkan (dalam propinsi skrip, periksa Dinonaktifkan). Jika Anda tidak, akan ada dua script membuat bagian pada saat yang sama di tempat yang sama.
Buat naskah baru bernama TowerBuilder. Tambahkan variabel untuk ukuran menara dan ukuran kubus di bagian atas.
local TOWER_SIZE = 4local CUBE_SIZE = 2Tambahkan fungsi lokal bernama makeCube() yang menciptakan kubus persegi tunggal menggunakan CUBE_SIZE .
local TOWER_SIZE = 4local CUBE_SIZE = 2-- Menciptakan kubus individuallocal function makeCube()local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)endTetapkan warna kubus ke variabel yang akan diperbarui dalam loop terbalik.
local function makeCube()local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorendTerakhir, orpai cube baru ke ruang kerja sehingga tampaknya.
local function makeCube()local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorcube.Parent = workspaceend
Muncul dalam Berbagai Arah
Untuk membuat menara, buat kubus di titik tertentu dengan menetapkan proporsi X, Y, Z setiap kubus baru. X dan Z adalah sisi ke sisi. Y adalah ke atas dan ke bawah.
Dalam makeCube() , tambahkan parameter untuk spawnX , spawnY , dan 1> spawnZ1> . Angka-angka ini akan menetapkan lokasi spawndari setiap kubus baru.
-- Menciptakan kubus individuallocal function makeCube(spawnX, spawnY, spawnZ)local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorcube.Parent = workspaceendDalam fungsi, tetapkan properti CFrame kubus ke CFrame baru menggunakan parameter spawnX, spawnY, dan spawnZ.
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
Memunculkan dengan Nested Loops
Skrip akan memiliki tiga loop total, satu untuk panjang, lebar, dan ketinggian menara. Untuk menyelesaikan seluruh lantai sebelum pindah ke atas, mulai dengan menetapkan koordinat Y di lantai pertama, lompatan terakhir.
Di bawah fungsi makeCube(), Buat untuk setel ulang untuk menetapkan cara tinggi setiap kubus muncul.
- Variabel Kontrol : heightIndex = 1
- Titik akhir : TOWER_SIZE
- Di dalam loop, tambahkan: lokal spawnY = (tinggiIndex - 1) * CUBE_SIZE
-- Membangun menarafor heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEendDengan loop pertama untuk ketinggian selesai, mulai pada loop kedua. Dalam loop pertama, tambahkan baru untuk loop untuk tempat menempatkan kubus di panjang menara.
- Variabel Kontrol : panjangIndex = 1
- Titik akhir : TOWER_SIZE
- Di dalam loop itu tambahkan: lokal spawnX = panjangIndex * CUBE_SIZE
for heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEfor lengthIndex = 1, TOWER_SIZE dolocal spawnX = lengthIndex * CUBE_SIZEendendDalam loop kedua , tambahkan ketiga untuk loop untuk menara lebar . Dalam loop final ini, panggil 1> makeCube()1> dan pas dalam X, Y, dan Z parameter.
- Variabel Kontrol : widthIndex = 1
- Titik akhir : TOWER_SIZE
- Di dalam loop tambahkan:
- local spawnZ = widthIndex * CUBE_SIZE
- makeCube(spawnX, spawnY, spawnZ)
- Waktu tunggu 0,25 detik sehingga Anda dapat menonton menara dibangun.
-- Membangun menarafor 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)endendendUntuk memiliki setiap lantai menjadi warna acak, ubah currentColor menjadi acak RGB nomor dalam loop yang sama di mana Anda membuat lantai baru.
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)endendendJalankan proyek dan tunggu sampai menyaksikan bahwa menara penuh telah dibuat tanpa kesalahan di Jendela Keluar.
Tantangan Opsional
Di bawah ini adalah tantangan self-diri yang berbeda yang menggunakan loop berantai di berbagai cara. Coba dan kode sendiri sebelum melihat solusinya.
Bagian Fade Away
Saat menara dibangun, memastikan bahwa bagiannya memudar dari transparansi dari kiri ke kanan.
Solusi kode di bawah ini.
local TOWER_SIZE = 6
local CUBE_SIZE = 2
-- Menciptakan kubus individual
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 -- Tetapkan transparansi
cube.CFrame = CFrame.new(spawnX, spawnY, spawnZ)
cube.Parent = workspace
end
-- Membangun menara
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 --Diperbarui setiap putaran dimulai dari 0
for widthIndex = 1, TOWER_SIZE do
local spawnZ = widthIndex * CUBE_SIZE
makeCube(spawnX, spawnY, spawnZ)
task.wait(0.05)
end
end
end
Menurunkan Objek
Alih-alih bagian, coba spawn objek yang sebenarnya. Contoh di sini menggunakan cupcake.
Pada diri memiliki, lihat apakah Anda bisa:
- Buat objek dari bagian dasar. Pastikan untuk menyatukan semua bagian agar objek tidak jatuh.
- Tempatkan objek di ServerStorage
- Ubah PartMaker yang ditemukan di Contoh Loop Bersarang untuk menggunakan objek Anda alih-alih bagian.
Sebuah sampel ditunjukkan di sini.
Solusi kode menggunakan cupcake ditambahkan.
local numberOfBatches = 30
local cupcakesPerBatch = 6
local cupcakesBaked = 0
--Membuat satu 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
-- Lingkaran luar
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))
-- Lingkaran dalam
for cupcakeNumber = 1, cupcakesPerBatch do
makeCupcake()
print("Inner loop: cupcake " .. cupcakeNumber)
-- Muffin melacak baked
cupcakesBaked += 1
task.wait(0.5)
end
print("Bottom outer loop: " .. cupcakesBaked .. " cupcakes baked so far.")
end
Sintesis
Untuk menyelesaikan lebih banyak tugas yang rumit, pengkode akan menemukan berguna untuk menggabungkan beberapa loop, dan bahkan jenis-jenis loop yang berbeda. Semua loop dapat dinaikkan, yang berarti bahwa satu loop berada di dalam lain. Loop yang dinaikkan kembali ke loop pertama jika berlaku.