제어 구조 는 Luau 코드 실행 흐름을 관리하는 문입니다. 네 가지 주요 유형의 제어 구조가 있습니다.
- An if then else 문은 지정된 조건이 true인 경우에만 코드를 실행합니다. 코드 실행은 반복되지 않습니다.
- A 반복 루프 코드를 실행하고 조건이 true인 경우 실행을 반복합니다.
- 루프에 대한 A 는 지정된 입력에 따라 코드를 여러 번 실행합니다(번).
if 문, while 루프 및 repeat 루프의 조건은 Luau 식이나 값일 수 있습니다.값이 false 또는 nil가 아니면 Luau가 조건부 문에서 그것을 true로 평가합니다.다른 스크립트 언어와 달리 Luau는 0과 빈 문자열을 모두 true로 간주합니다.
문이 있는 경우
기본 if 문은 조건을 테스트합니다. 조건이 참이면 Luau는 then 와 end 사이의 코드를 실행합니다.
elseif 문을 사용하여 조건 if가 거짓이면 추가 조건을 테스트할 수 있습니다.모든 if 및 elseif 조건이 실패하면 else 문을 사용하여 코드를 실행할 수 있습니다.elseif 및 else 부품은 모두 선택 사항이지만 초기 if 문 없이는 사용할 수 없습니다.
if , elseif , else 조건의 연쇄에서 Luau는 상위에서 하위로 조건을 테스트하고, 첫 번째 true 조건에 멈추고 그 다음에 이어지는 코드를 실행합니다.
if 2 + 2 == 5 thenprint("Two plus two is five") -- 조건이 false이기 때문에 인쇄하지 않음elseif 2 + 3 == 5 thenprint("Two plus three is five") -- 2+3은 5입니다elseprint("All conditions failed") -- 이전 조건이 참이기 때문에 인쇄하지 않음end
루프 동안
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 루프는 조건이 true가 될 때까지 반복됩니다.조건부 테스트는 코드 블록이 실행된 후에 평가하므로 코드 블록은 항상 적어도 한 번 실행됩니다.다른 언어와 달리, 로컬 변수를 선언한 루프 내부의 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() 함수는 테이블의 숫자 인덱스를 반복하는 반복기를 반환하고 각 요소에 대해 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() 함수는 테이블의 모든 인덱스(숫자 인덱스 포함)를 반복하는 반복기를 반환하고 사전의 각 항목에 대해 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