我們假設一個情境,今天你想要做一個當某物件面向某物件時,觸發一項函式,如果用CFrame來達成這項目的會非常複雜,而使用碰到物件的話又會增加伺服器的負擔,這個時候就可以使用Raycast這項函式
這項函式可以回傳所擷取物體的某一面的直線方向所碰到的物件,有點類似超音波的概念,使用方法就是直接在Workspace使用Raycast函式
Workspace:Raycast()
而在函式中,我們可以放入三個參數,分別為
而其中,過濾這項參數可以省略 (畢竟你可能沒東西要過濾)
那現在我們用個情境來舉例,假設現在有一項玩家看不到的雷射光,而當玩家阻斷了雷射光的光線玩家就會死掉。
首先,先做兩個Part當作雷射光的起點與終點,然後在起點裡面放一個腳本。
腳本內定義
local Start = workspace:WaitForChild("Start")
local End = workspace:WaitForChild("End")
然後用Raycast函式,第一個參數放起點的位置,第二個參數方終點的位置 - 起點的位置 (可得距離)
local Start = workspace:WaitForChild("Start")
local End = workspace:WaitForChild("End")
workspace:Raycast(Start.Position, End.Position)
現在,我們已經有了雷射光了,但有兩個問題,他只會出現一次,而且我們碰到它不會死掉。
這時我們就給他一個重複的函式 (記得等待),然後透過判斷式來判斷
local Start = workspace:WaitForChild("Start")
local End = workspace:WaitForChild("End")
while task.wait(0.1) do --迴圈
local Raycast = workspace:Raycast(Start.Position, End.Position - Start.Position) --把Raycast放到變數裡面
if Raycast ~= nil then --先排除沒碰到東西的結果
if Raycast.Instance.Parent:FindFirstChild("Humanoid") then --如果碰到的物件的父項有玩家屬性
Raycast.Instance.Parent.Humanoid.Health = 0 --吼一夕啦!
end
end
end
來測試看看
有的時候你會想要在腳本內更改一個Model的位置,但當你寫好以後卻會發現出現了錯誤,原因是Model這項物件不含有Vector3或CFrame等屬性,那這時該怎麼做調整呢?
既然Model沒有像Part一樣的位置資訊,那我們就直接用Model的中心點物件來調整就可以了,Model的中心點物件叫做PrimaryPart,但其實直接改它的位置也只會改到PrimaryPart這個物件的位置而已,所以我們要使用另一個函式,叫做PivotTo
這項函式可以透過改變中心點物件的位置來改變整個Model的位置,使用方法也很簡單,直接對Model使用就行
workspace:WaitForChild("Model"):PivotTo(CFrame位置)
而如果你只是想取得這個Model的位置,你可以用GetPivot這項函式
local ModelCFrame = workspace:WaitForChild("Model"):GetPivot()