제어 구조

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

제어 구조 는 Luau 코드 실행 흐름을 관리하는 문입니다. 네 가지 주요 유형의 제어 구조가 있습니다.

if 문, while 루프 및 repeat 루프의 조건은 Luau 식이나 값일 수 있습니다.값이 false 또는 nil가 아니면 Luau가 조건부 문에서 그것을 true로 평가합니다.다른 스크립트 언어와 달리 Luau는 0과 빈 문자열을 모두 true로 간주합니다.

문이 있는 경우

기본 if 문은 조건을 테스트합니다. 조건이 참이면 Luau는 thenend 사이의 코드를 실행합니다.

elseif 문을 사용하여 조건 if가 거짓이면 추가 조건을 테스트할 수 있습니다.모든 ifelseif 조건이 실패하면 else 문을 사용하여 코드를 실행할 수 있습니다.elseifelse 부품은 모두 선택 사항이지만 초기 if 문 없이는 사용할 수 없습니다.

if , elseif , else 조건의 연쇄에서 Luau는 상위에서 하위로 조건을 테스트하고, 첫 번째 true 조건에 멈추고 그 다음에 이어지는 코드를 실행합니다.


if 2 + 2 == 5 then
print("Two plus two is five") -- 조건이 false이기 때문에 인쇄하지 않음
elseif 2 + 3 == 5 then
print("Two plus three is five") -- 2+3은 5입니다
else
print("All conditions failed") -- 이전 조건이 참이기 때문에 인쇄하지 않음
end

루프 동안

A whiledo 루프는 지정된 조건이 참이나 거짓인지 평가합니다.조건이 false 또는 nil 이면 루프가 종료되고 Luau가 루프에서 코드를 건너뜁니다.조건이 true 인 경우 Luau는 루프에서 코드를 실행하고 프로세스를 반복합니다.


local timeRemaining = 10
while timeRemaining > 0 do
print("Seconds remaining: " .. timeRemaining)
task.wait(1)
timeRemaining -= 1
end
print("Timer reached zero!")
--[[ 결과 출력:
Seconds remaining: 10
Seconds remaining: 9
Seconds remaining: 8
Seconds remaining: 7
Seconds remaining: 6
Seconds remaining: 5
Seconds remaining: 4
Seconds remaining: 3
Seconds remaining: 2
Seconds remaining: 1
Timer reached zero!
]]

무한 루프

조건으로 whiledo 루프를 설정하여 무한한 게임 루프를 작성할 수 있습니다.true


while true do
print("Looping...")
task.wait(0.5)
end
--[[ 결과 출력:
Looping...
Looping...
Looping...
Looping...
...
]]

반복 루프

The repeatuntil 루프는 조건이 true가 될 때까지 반복됩니다.조건부 테스트는 코드 블록이 실행된 후에 평가하므로 코드 블록은 항상 적어도 한 번 실행됩니다.다른 언어와 달리, 로컬 변수를 선언한 루프 내부의 repeatuntil 루프의 Luau 범위에는 조건이 포함됩니다.


local currentGoblinCount = 18
-- 게임에서 최대 25까지 고블린 스폰
repeat
spawnGoblin()
currentGoblinCount += 1
print("Current goblin count: " .. currentGoblinCount)
until currentGoblinCount == 25
print("Goblins repopulated!")
--[[ 결과 출력:
Current goblin count: 19
Current goblin count: 20
Current goblin count: 21
Current goblin count: 22
Current goblin count: 23
Current goblin count: 24
Current goblin count: 25
Goblins repopulated!
]]

루프에 대해

A 루프는 숫자 카운터 나 컬렉션의 항목 수 에 따라 코드를 여러 번 실행하며,

루프에 대한 숫자

A fordo 루프는 카운터를 사용하여 루프를 실행할 횟수를 결정합니다.루프는 시작 값, 종료 값 및 선택적 증가 값으로 선언됩니다.

Luau는 카운터를 시작 값과 동일하게 설정하고, for 루프에서 코드 블록을 실행한 다음 카운터에 증가를 추가합니다.증가량이 양수인 경우 프로세스는 카운터가 끝 값과 같거나 더 큰 값이 될 때까지 반복됩니다.증가량이 음수인 경우 프로세스는 카운터가 끝 값과 같거나 작을 때까지 반복됩니다.

선택적 증가값은 기본값으로 1로 설정됩니다. 정수가 아니어도 됩니다.


for counter = 1, 3 do
print(counter)
end
--[[ 결과 출력:
1
2
3
]]
for counter = 1, 6, 2 do
print(counter)
end
--[[ 결과 출력:
1
3
5
]]
for counter = 2, 0, -0.5 do
print(counter)
end
--[[ 결과 출력:
2
1.5
1
0.5
0
]]

루프에 대한 일반화

제네릭 for 루프는 숫자 시퀀스가 아닌 컬렉션의 항목을 반복합니다.일반적인 for 루프를 사용하여 컬렉션의 각 항목에 대한 코드를 실행하고 코드에서 각 항목을 쉽게 사용할 수 있습니다.

루프에는 다른 유형의 컬렉션을 반복하기 위한 함수 또는 이터레이터가 필요합니다.글로벌 ipairs()는 배열에 대한 반복기를 반환하고, 글로벌 pairs()는 사전에 대한 반복기를 반환합니다.string 라이브러리는 문자열을 반복하기 위해 string.gmatch() 을 제공합니다.

일반화된 반복

Luau에서는 테이블에서 직접 in 키워드를 사용하여 테이블을 반복할 수 있으며, 반복기 함수와 같은 ipairs() 를 사용하지 않습니다.


for i, v in {1, 2, 3, 4, 5} do
print(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() 함수는 테이블의 숫자 인덱스를 반복하는 반복기를 반환하고 각 요소에 대해 indexvalue를 반환합니다.이로 인해 모든 인덱스가 숫자인 배열에 적합합니다.


local array = {"a", "b", "c", "d", "e"}
for index, value in ipairs(array) do
print(index, value)
end
--[[ 결과 출력:
1 a
2 b
3 c
4 d
5 e
]]

사전

pairs() 함수는 테이블의 모든 인덱스(숫자 인덱스 포함)를 반복하는 반복기를 반환하고 사전의 각 항목에 대해 keyvalue를 반환합니다.사전 테이블의 요소 순서는 임의입니다.이로 인해 항목이 비숫자 인덱스와 순서가 바뀌어 저장된 사전에서 반복하기에 적합합니다.


local dictionary = {
[1] = "a",
["Hello"] = "b",
[5] = "c",
[true] = "d",
["World"] = "f",
[false] = "e"
}
for key, value in pairs(dictionary) do
print(key, value)
end
--[[ 결과 출력:
Hello b
true d
false e
World f
5 c
1 a
]]

루프 깨기

루프를 종료하려면 break 키워드를 사용하십시오. 다음 코드 샘플은 무한한 whiledo 루프를 중단하는 방법을 보여줍니다.


local secondsElapsed = 0
local timeout = 5
while true do
task.wait(1)
secondsElapsed += 1
print("Seconds elapsed:", secondsElapsed)
if secondsElapsed == timeout then
break
end
end
print("Five seconds elapsed. Time to move on!")
--[[ 결과 출력:
1
2
3
4
5
Five seconds elapsed. Time to move on!
]]

루프 계속하기

루프를 반복하고 다시 시작하도록 강제하려면 continue 키워드를 사용하십시오.A for 루프가 수정 제안반복하고; whilerepeatuntil 는 계속하기 전에 루프 조건을 확인합니다.다음 코드 샘플은 특정 의 모든 자식을 가져옵니다.


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