コントロール構造 は、Luau コードの実行フローを管理する声明です。コントロール構造には、4種類の主なタイプがあります:
- An if then else 文は、指定された条件が true である場合にのみコードを実行します。コードの実行は繰り返されません。
- A 繰り返しループ はコードを実行し、条件が true である場合、実行を繰り返します。
- ループのための A は、指定された入力に応じてコードを設定数回実行します.
if 文、while ループ、および repeat ループの条件は、Luau の表現または値であることができます。値が false または nil でない場合、Luauは条件付き文でそれを true として評価します。他のスクリプト言語とは異なり、Luau はゼロと空の文字列の両方を true と考えます。
文がある場合
基本の if 文は、条件をテストします。条件が真である場合、Luau は then と end の間のコードを実行します。
elseif 文を使用して、if 条件が偽である場合、追加の条件をテストできます。すべての else および if および elseif 条件が失敗した場合にコードを実行するための 文を使用できます。elseif と else のパーツは両方オプションですが、最初の if 文言なしでは使用できません。
if、elseif、else の連鎖で、Luau は上から下への順序で条件をテストし、最初の true 条件に停止し、その後に続くコードを実行します。
if 2 + 2 == 5 thenprint("Two plus two is five") -- 条件が偽であるため印刷しないelseif 2 + 3 == 5 thenprint("Two plus three is five") -- 2 plus 3 は 5elseprint("All conditions failed") -- 前の条件が真であるため印刷しないend
ループ中 while
A while — do ループは、指定された条件が真か否かを評価します。条件が false または nil である場合、ループが終了し、Luau はループ内のコードをスキップします。条件が true である場合、Luau はループでコードを実行し、プロセスを繰り返します。
local timeRemaining = 10while timeRemaining > 0 doprint("Seconds remaining: " .. timeRemaining)task.wait(1)timeRemaining -= 1endprint("Timer reached zero!")--[[ 結果の出力:Seconds remaining: 10Seconds remaining: 9Seconds remaining: 8Seconds remaining: 7Seconds remaining: 6Seconds remaining: 5Seconds remaining: 4Seconds remaining: 3Seconds remaining: 2Seconds remaining: 1Timer reached zero!]]
無限ループ
while — do ループを使用して、条件として true を設定して無限のゲームループを記述できます。
while true doprint("Looping...")task.wait(0.5)end--[[ 結果の出力:Looping...Looping...Looping...Looping......]]
繰り返しループ
The repeat — until ループは、条件が真になるまで繰り返します。条件付きテストは、コードブロックが実行された後の 後 に評価されるため、コードブロックは常に少なくとも 1回運行します。他の言語とは異なり、ローカル変数を repeat ループ内で宣言した until 内の Luau スコープには条件が含まれています。
local currentGoblinCount = 18-- ゲームで最大 25 のゴブリンをスポーンするrepeatspawnGoblin()currentGoblinCount += 1print("Current goblin count: " .. currentGoblinCount)until currentGoblinCount == 25print("Goblins repopulated!")--[[ 結果の出力:Current goblin count: 19Current goblin count: 20Current goblin count: 21Current goblin count: 22Current goblin count: 23Current goblin count: 24Current goblin count: 25Goblins repopulated!]]
ループについて
ループ A は、数字カウンター またはコレクションの アイテム数 に基づいて、コードを設定数回実行します。
ループ用の数字
A for — do ループはカウンターを使用してループを実行する回数を決定します。ループは、開始値、終了値、オプションの増加値で宣言されます。
Luau はカウンターを開始値と同等に設定し、for ループでコードブロックを実行し、カウンターに増加を追加します。増分が正の場合、プロセスはカウンターが終値と同じまたはそれ以上になるまで繰り返されます。増分が負である場合、プロセスはカウンターが終値と同じかそれ以下になるまで繰り返されます。
オプションの増分は、1 にデフォルトします。全数字である必要はありません。
for counter = 1, 3 doprint(counter)end--[[ 結果の出力:123]]for counter = 1, 6, 2 doprint(counter)end--[[ 結果の出力:135]]for counter = 2, 0, -0.5 doprint(counter)end--[[ 結果の出力:21.510.50]]
ループの一般化
一般的な for ループは、数列ではなくコレクション内のアイテムを反復します。一般的な for ループでは、コレクション内の各アイテムのコードを実行し、コード内の各アイテムを簡単に使用できます。
ループには、異なる種類のコレクションを順回するための関数またはイテレータが必要です。グローバル ipairs() は配列用のイテレーターを返し、グローバル pairs() は辞書用のイテレーターを返します。string ライブラリは、string.gmatch() を提供して、文字列を反復します。
一般化された反復
Luau では、in キーワードを使用して、直接テーブル上でループを実行できます。たとえば、ipairs() のような再帰関数を使用するのではなく:
for i, v in {1, 2, 3, 4, 5} doprint(i, v)end
一般化された反復も、__iter メタメソッドを使用してカスタムイテレーター関数を作成できます。この工夫された例は、最後の要素から最初の要素まで、逆順でアレイを反復します:
local myTable = {1, 2, 3, 4, 5}
myMetatable = {
__iter = function(t)
local i = #t + 1
return function()
i -= 1
if i > 0 then
return i, t[i]
end
end
end,
}
setmetatable(myTable, myMetatable)
for i, v in myTable do
print(i, v)
end
--[[ 結果の出力:
5 5
4 4
3 3
2 2
1 1
]]
配列
ipairs() 関数は、テーブルの数値インデックスを順回しするIterator を返し、それぞれの要素について index と value を返します。これにより、すべてのインデックスが数字の配列に適しています。
local array = {"a", "b", "c", "d", "e"}for index, value in ipairs(array) doprint(index, value)end--[[ 結果の出力:1 a2 b3 c4 d5 e]]
辞書
pairs() 関数は、テーブルのすべてのインデックス (数値インデックスを含む) を順回しするIteratorを返し、辞書の各エントリに対して key と value を返します。辞書テーブル内の要素の順序は任意です。これにより、非数字のインデックスでアイテムが保存されている辞書でのループが適切になります。
local dictionary = {[1] = "a",["Hello"] = "b",[5] = "c",[true] = "d",["World"] = "f",[false] = "e"}for key, value in pairs(dictionary) doprint(key, value)end--[[ 結果の出力:Hello btrue dfalse eWorld f5 c1 a]]
ループを破る
ループを強制終了するには、break キーワードを使用します。次のコードサンプルは、無限ループ while — do を破る方法を示しています。
local secondsElapsed = 0local timeout = 5while true dotask.wait(1)secondsElapsed += 1print("Seconds elapsed:", secondsElapsed)if secondsElapsed == timeout thenbreakendendprint("Five seconds elapsed. Time to move on!")--[[ 結果の出力:12345Five seconds elapsed. Time to move on!]]
ループを続ける
ループを反復させて再起動させるには、continue キーワードを使用します。A for ループはカウンターを反復します; while および repeat — until は続行する前にループ条件をチェックします。次のコードサンプルは、特定の のすべての子を取得します。
local function GetChildrenOfClass(parent: Instance, className: string): {Instance}
local children = {}
for _, child in parent:GetChildren() do
if child.ClassName ~= className then continue end -- ループを反復する
table.insert(children, child)
end
return children
end