[개체 탐색] WaitForChild()로 자식 탐색하기

beans·2023년 4월 22일
0

WaitForChild() 메소드는 해당 이름을 가진 자식 개체가 생성될 때까지 대기합니다. "Child"라는 이름을 가진 자식 개체가 생성될 때까지 대기하려면 다음과 같은 코드를 작성할 수 있습니다.

local parent = workspace.Part
local child = parent:WaitForChild("Child")
child.Color = Color3.new(1, 0, 1)

이 경우 WaitForChild()가 “Child”를 찾을 때까지 그 아래 코드들은 실행되지 않습니다. 그렇기 때문에 child.Color = Color3.new(1, 0, 1) 코드를 반드시 수행시킬 수 있습니다.

하지만 “Child”가 존재하지 않을 수도 있다면 2번째 인자로 탐색을 종료할 시간을 지정할 수 있습니다. 이 경우 지정된 시간 동안 “Child”를 찾지 못하면 nil이 반환됩니다.

local parent = workspace.Part
local child = parent:WaitForChild("Child", 5)
child.Color = Color3.new(1, 0, 1)

2번째 인자로 5를 지정함으로써 WaitForChild()를 5초 동안만 탐색하겠다는 의미가 됩니다.

만약 5초가 지나도 ”Child” 탐색에 실패했다면, child에는 nil이 반환되고, child가 nil이라면 그 아래줄(child.Color = Color3.new(1, 0, 1))은 오류가 발생됩니다.

그런데 WaitForChild()를 쓸 일이 있나요?

서버에서 실행되는 Script의 입장에서는 이미 모든 개체가 로딩된 상태이니 . 연산자(닷 연산자)를 사용해도 오류가 발생할 일이 없습니다. 하지만 만약 사용자가 특정 행동을 했을 때 서버 쪽에서 “Child”가 생성될 일이 있다면 WaitForChild()를 사용할 수 있습니다. 이 경우 parent:ChildAdded:Connect() 이벤트를 사용하는 것이 사용성과 코드 최적화에 더 좋을 수 있습니다.

그렇다면 서버에서는 WaitForChild()를 쓸 일이 거의 없습니다. 어디에 쓰일 수 있을까요? 바로 클라이언트에서 쓰일 수 있습니다.
클라이언트에서 실행되는 LocalScript는 모든 개체가 로딩된 상태에서 실행되지 않습니다.
PlayerGui의 ScreenGui의 Frame을 탐색한다고 가정해 보겠습니다.
클라이언트는 서버에 접속한 후 Workspace, ReplicatedFirst, ReplicatedStorage, StarterGui, StarterPack, StarterPlayerScripts, StarterCharacterScripts 등등이 서버로부터 클라이언트로 복제됩니다. 만약 이 때 StarterPlayerScripts에 있는 LocalScript를 두고 PlayerGui의 ScreenGui.Frame을 탐색하라는 내용이 있다면 PlayerGui에 ScreenGui가 서버로부터 복제되기 전에 ScreenGui.Frame 탐색이 시도되어 오류가 발생할 수 있습니다. 이럴 경우에 WaitForChild()를 사용할 수 있습니다.

그렇다면 2번째 인자는 쓸모 없지 않나요?

ScreenGui.Frame에 반드시 접근해야 하는데 정상의 경우라면 빠른 시간 내에 ScreenGui.Frame에 접근할 수 있겠지만, 만약 개발자가 StarterGui가 아닌 StarterPlayer에 ScreenGui를 넣어 놓았을 때는 ScreenGui를 찾을 수 없게 되어 WaitForChild() 이후 문장이 실행될 수 없게 됩니다. 이 경우 WaitForChild(”개체 이름”, 5)로 2번째 인자에 5를 넣어 5초 이후에도 탐색되지 않는다면 nil이 오게 하여 개발자가 실수했음을 알려줄 수 있는 수단으로 사용할 수도 있습니다.

0개의 댓글