在昨天,我們在定義RemoteEvent的位置的時候,我們使用了一個名為GetService的函式擷取RemoteEvent在ReplicatedStorage中的位置,那看到這你一定會好奇,為什麼不直接用 . 就好了,一定要用GetService嗎?
而在昨天我也只有用簡單的一句話帶過這項疑問,避免程式運行過快導致來不及擷取,但其實這背後的邏輯並不是只有這一句話這麼簡單
通常在製作腳本時,我們會需要定義很多的變數,而其中,路徑這項資料型態在腳本中又佔了一大宗,而我們在定義某項物件的路徑的時候,時常會出現像以下的錯誤
這項錯誤是在系統無法找到你所定義的路徑內的物件時才會觸發,雖然可能真的是你寫錯了路徑,但更多的時候,你定義的路徑其實是正確的,但系統卻找不到,這又是為什麼呢?
問題就是出在速度,有的時候你的腳本會比你要定義的物件先載入好,而此時腳本在執行定義時就會因為找不到物件而報錯,此時如果能夠讓腳本持續等待直到找到這個物件就會是個不錯的解決方法。
當然如果我們在每一個定義前面都放上這樣一個邏輯的函式會非常複雜且臃腫,所以Luau已經幫我們在語言庫裡預先定義好了這項函式,也就是WaitForChild
這項函式的使用方法為
local Part = workspace:WaitForChild("Part")
它的作用等同於
local Part = workspace.Part
但也就是多了這一個等待,讓這個腳本的報錯率降低,另外你也可以在函式的第二個參數輸入一項數字,這個數字代表的是要讓這項函式等待這個物件等多久,如果一直沒有等到才會報錯
local Part = workspace:WaitForChild("Part, 5")
這項函式同理,不過他適用的對象為服務,畢竟也是會有客戶端比伺服器端先載入好的情況。
接下來這部分會跟前幾天說過的if判斷式相關,漏看的麻煩回去複習。
當我們使用if來尋找某項物件時,我們除了直接判斷名稱是否相同,此物件使否等於此物件等這種方式,我們還可以以是否等於某項物件型態來判斷。
那首先我們要瞭解何謂物件型態,物件型態指的就是這項物件的Class,Class就是這個物件的類型,舉例來說,我們在平常測試時會新增的Part、將外部3D物件匯入後的MeshPart、可以讓玩家最為梯子攀爬的TrussPart等物件,他們的ClassName都叫做BasePart,知道了這項概念後,我們就可以用一項名為IsA的函式判斷物件的物件型態為何。
舉個例子,假設現在我們使用一個for迴圈取得workspace裡的所有物件
for index, value in pairs(workspace:GetChildren()) do
end
接下來我們要輸出所有ClassName為BasePart的物件
for index, value in pairs(workspace:GetChildren()) do
if value:IsA("BasePart") then
print(value)
end
end
而我們在尋找某一項特定物件時,也不一定要直接用等式來尋找
舉例就像
if workspace.Part == true then
print("I found the Part!")
end
而我們也可以使用一項叫做FindFirstChild的函式來尋找
if workspace:FindFirstChild("Part") then
print("I found the Part by using FindFirstChild!")
end
這項函式的作用在於,如果我們要尋找的對象的名稱與其他物件重複,他將會把結果導向他先找到的那項物件,通常我們在做關於物件判斷時很常使用到這項函式。
學會了這些函式可以大幅減少你在寫程式時的錯誤,因為說真的有些錯誤不是你的錯~