Kod zamanlaması, belirli bir eylem veya döngü tamamlandıktan sonra kodun çalışmasını sağlamak veya belirli bir süre boyunca kodu geciktirmek gibi birçok durumda faydalıdır. Roblox'un görev zamanlayıcısını yönetmek ve kodu zamanlamak için task kütüphanesini kullanabilirsiniz. Ayrıca bazı ek işlevselliğe sahip bir diğer kütüphane olan coroutine'u da kodu zamanlamak için kullanabilirsiniz.
Yaygın yöntemler
Aşağıdakiler, kodu zamanlamak için en yaygın kullanılan task yöntemleridir. Kodunuzun optimal olarak çalışmasını sağlamak için eski zamanlama yöntemleri olan wait() yerine görev yöntemlerini kullanmalısınız.
Aşağıdaki tabloda ilgili eski genel yöntemler ve tercih edilen, daha optimize edilmiş karşılıkları listelenmiştir:
| Eski genel yöntemler | Görev yöntemleri | Ek alternatifler |
|---|---|---|
| wait() | task.wait() | RunService.Heartbeat |
| wait(n) | task.wait(n) | |
| spawn(f) | task.defer(f) | task.delay(0, f) |
| delay(n, f) | task.delay(n, f) | |
| spawn(function() f(uv1, ...) end) | task.defer(f, uv1, ...) | task.delay(0, f, uv1, ...) |
| delay(n, function() f(uv1, ...) end) | task.delay(n, f, uv1, ...) |
task.spawn()
task.spawn() bir iş parçacığını veya fonksiyonu alır ve motorun zamanlayıcısı aracılığıyla hemen devam ettirir. Ek argümanlar, devam ettirilen iş parçacığına veya fonksiyona geçirilir.
Aşağıdaki kod örneği, belirli nesne kümesi üzerinden geçerken duraklayabilecek bir fonksiyonu çağırdığınızda task.spawn()'ı nasıl kullanabileceğinizi gösterir:
local function playerAdded(player)
print(player)
end
for _, player in Players:GetPlayers() do
task.spawn(playerAdded, player)
end
task.defer()
task.defer(), bir iş parçacığını veya fonksiyonu alır ve mevcut çerçevedeki geçerli devam noktası sona erene kadar erteleyerek işler. Ek argümanlar, devam ettirilen iş parçacığına veya fonksiyona geçirilir.
Bunu kullanmanın genellikle amacı, task.spawn() ile benzer bir davranış istemek ancak iş parçacığının hemen çalışmasıyla ilgilenmemektir. Aşağıdaki kod örneği, "A" için print() ifadesinin "B" için print() ifadesi çalıştıktan sonra erteleneceğini gösterir:
task.defer(print, "A")print("B")--> B--> A
task.delay()
task.delay(), bir iş parçacığını veya fonksiyonu alır ve belirli bir süre geçtiğinde bir sonraki Heartbeat adımında devam ettirmek üzere planlar. İş parçacığı, yerleşik hata işleme ve diğer motor özelliklerini destekleyen bir şekilde devam eder. Herhangi bir ek argüman, devam ettirilen iş parçacığına veya fonksiyona geçirilir.
Gerçek gecikme süresi değişebileceğinden, aşağıdaki kod örneği, mevcut zamanı bir argüman olarak geçirerek bunu nasıl hesaplayabileceğinizi göstermektedir:
task.delay(2, function(scheduledTime)
print(os.clock() - scheduledTime) --> 2.038702
end, os.clock())
Sıfır süre, iş parçacığının veya fonksiyonun bir sonraki adımda devam etmesini sağlayacaktır.
task.wait()
task.wait(), mevcut iş parçacığını verilen süre (saniye cinsinden) geçene kadar bekletir ve ardından iş parçacığını bir sonraki Heartbeat adımında devam ettirir.
Gerçek bekleme süresi değişebilir. Aşağıdaki kod örneği, bu yöntemin kullanımını kolaylık sağlamak için nasıl örneklediğini gösterir:
Gerçek bekleme süresi değişebileceğinden, aşağıdaki kod örneği, yöntemin döndürdüğü değeri saklayarak gerçek süreyi nasıl alabileceğinizi gösterir:
local elapsedTime = task.wait(2) -- 2 saniye bekleprint(elapsedTime) --> 2.0792941
Eğer süre verilmezse, süre varsayılan olarak sıfır olacak ve bu da iş parçacığının otomatik olarak bir sonraki adımda devam etmesini sağlayacaktır. Bu, task.wait()'ın RunService.Heartbeat ile davranış bakımından eşdeğer olduğu anlamına gelir.