WaitForChild

格式

WaitForChild(childName,timeout)

Yields
暂停调用该函数的Lua线程,直到准备好返回结果为止,而不会中断其他脚本”

简介

寻找自身的子对象。如果没有子对象,在没有填写timeout参数时,会暂停进程直到找到子对象;如果填写了timeout参数,会根据参数时间暂停进程,超出参数时间后,进程照常进行。

在处理客户端运行的代码时,WaitForChild非常重要。重启世界编辑器不保证将对象从服务器复制到客户端的时间或顺序。这可能会导致脚本在索引尚不存在的对象时中断。

游戏开始运行后,各部件会按照逻辑顺序依次加载,因此,通常需要WaitForChild方法来确保能正确获取希望引用的对象
加载顺序:
玩家最先加载(玩家加载事件Player.PlayerAdded),待玩家加载后,客户端最先加载中的脚本开始执行,同时,开始加载玩家下的玩家脚本、玩家界面等对象。
因此,在客户端最先加载中的脚本下调用玩家下的对象时,必须使用WaitForChild函数,确保能够正常地调用到所需的对象。

注意事项

在没有填写timeout参数的情况下使用该函数查找对象时,若5秒后未查找成功,则会在脚本输出日志中提示可能无法查找到目标

相关链接

教学视频:
https://creator.reworlder.com/tutorials 高级课程第一章课时1

参数

变量名称 类型 默认 描述
childName string Name 对象名称
timeout float timeout 时间间隔

返回值

类型 描述
RWObject 自身的子对象

实例

实例1 比较WaitForChild方法与GetChild方法的区别

在客户端最先加载下添加脚本。在玩家加载完成时,先分别通过名称和类名寻找角色对象,最后通过WaitForChild方法寻找角色对象。观察比较三次寻找的结果。

local workSpace=GetService("WorkSpace")
Players.PlayerAdded:Connect(function ()
        local player=Players:GetLocalPlayer()

        local avatar=workSpace:GetChildByName(player.Name) --尝试在工作区下通过名称寻找玩家的角色
        if avatar then --若存在角色,打印角色名称
            print(avatar.Name)
        else
            print("当前工作区内无角色")
        end

        avatar=workSpace:GetChildByClassName("Avatar") --尝试在工作区下通过类名寻找玩家的角色
        if avatar then --若存在角色,打印角色名称
            print(avatar.Name)
        else
            print("当前工作区内无角色")
        end

        avatar=workSpace:WaitForChild(player.Name) --暂停脚本执行进程,直到找到指定的角色
        if avatar then  --若存在角色,打印角色名称
            print(avatar.Name)
        else
            print("当前工作区内无角色")
        end
    end)

实例2 比较游戏各部分的加载顺序

在客户端最先加载中添加脚本,当玩家加载时尝试分别获取“玩家界面”“玩家脚本”“玩家角色”。然后通过WaitForChild方法在玩家角色加载时立即打印信息。通过在玩家初始化脚本和界面初始化下添加脚本,打印“玩家界面”和“玩家脚本”加载信息。
客户端最先加载脚本:

local workSpace=GetService("WorkSpace")
Players.PlayerAdded:Connect(function ()
        print("玩家加载")
        local player=Players:GetLocalPlayer()

        local ui=workSpace:GetChildByName("玩家界面") --尝试在工作区下通过名称寻找玩家界面
        if ui then --若存在玩家界面,打印玩家界面名称
            print(ui.Name)
        else
            print("当前工作区内无玩家界面")
        end    

        local sc=workSpace:GetChildByName("玩家脚本") --尝试在工作区下通过名称寻找玩家脚本
        if sc then --若存在玩家脚本,打印玩家脚本名称
            print(sc.Name)
        else
            print("当前工作区内无玩家脚本")
        end

        local avatar=workSpace:GetChildByName(player.Name) --尝试在工作区下通过名称寻找玩家的角色
        if avatar then  --若存在角色,打印角色名称
            print(avatar.Name)
        else
            print("当前工作区内无角色")
        end

        avatar=workSpace:WaitForChild(player.Name) --暂停脚本执行进程,直到找到指定的角色
        if avatar then  --若存在角色,打印角色名称
            print("玩家角色 "..avatar.Name.." 加载")
        else
            print("当前工作区内无角色")
        end
    end)

玩家脚本初始化脚本:

print('玩家脚本加载')

界面初始化——2D容器界面脚本:

print('玩家界面加载')
文档更新时间: 2020-08-17 16:58   作者:王辰剑