iT邦幫忙

2025 iThome 鐵人賽

DAY 22
0

1. Raycast

我們假設一個情境,今天你想要做一個當某物件面向某物件時,觸發一項函式,如果用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

來測試看看
https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExa2Fkbmw2NHJ5amh2eG5jNmJ3cXZzaWpjeTl5bTh4dnkxaXRzYmtocyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/jFWPrxkgXamti3wZxc/giphy.gif


2. Pivot

有的時候你會想要在腳本內更改一個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()

上一篇
Day 21: 外部變數與Changed事件
下一篇
Day 23: 細部解釋CFrame.Angles方法
系列文
透過Roblox Studio學習Lua語言與基本程式邏輯31
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言