iT邦幫忙

0

Tofy開發日誌 #7

  • 分享至 

  • xImage
  •  

Tofy開發日誌 #7

時間 2024/9/29 上午 11:50
地點 一樣還是在我房間


今天來談談Remote Event

首先,在談到Remote Event之前,我們要先了解什麼是客戶端以及伺服器端

客戶端,顧名思義,就是客戶的那一端,通常是指遊玩此遊戲的玩家的輸入端(Like你用什麼裝置遊玩、是否使用手柄、有沒有使用vpn)

伺服器端,也就是伺服器的那一端,通常是指這個遊戲的創作者的這一端,當然,如果你是在其他的平台(像Minecraft)架設伺服器,你需要花費許多時間與金錢來架設。但Roblox很貼心地幫我們完成了這一件事情,所以在這裡指的伺服器端是Roblox的那一端。

那了解這些東西有什麼用呢,舉個例子:
今天我們要製作一個工具,它可以讓玩家在拿著這個工具時,如果滑鼠點擊了,則新增一個Partworkspace

首先,在workspace新增一個Tool
https://ithelp.ithome.com.tw/upload/images/20240929/201696649JGw93eYX9.png

接著,在Tool裡面新增一個Part
https://ithelp.ithome.com.tw/upload/images/20240929/20169664nP1uWwfo9B.png

Part的名稱改為Handle
https://ithelp.ithome.com.tw/upload/images/20240929/20169664h5Pkypnpbx.png

你可以把工具改成你喜歡的大小
https://ithelp.ithome.com.tw/upload/images/20240929/20169664thHvmCBV4O.png

Handle中新增一個LocalScript
https://ithelp.ithome.com.tw/upload/images/20240929/20169664OQ51P44R99.png

LocalScript中打上以下程式碼

script.Parent.Parent.Activated:Connect(function() --在 "點擊" 這個事件發生的同時新增一個function
	local Mouse = game.Players.LocalPlayer:GetMouse() --定義玩家滑鼠鼠標
	local MCP = Instance.new("Part") --定義一個新增的實例 "Part"
	MCP.Name = "MCP" --實例的名稱為 "MCP",也就是MouseClickedPosition的縮寫
	MCP.CFrame = CFrame.new(Mouse.Hit.Position.X, Mouse.Hit.Position.Y + 0.5, Mouse.Hit.Position.Z) --將實例的座標定義為滑鼠點擊的座標,然後Y要加0.5格(否則會陷入地板)
	MCP.Size = Vector3.new(1, 1, 1) --定義實例的大小為1, 1, 1
	MCP.Parent = workspace --實例的母項為"workspace"
	MCP.Anchored = true --實例的錨定為是
	MCP.CanCollide = false --實例的是否為實體為否
end)

若完成後,進入遊戲並撿起道具使用,你應該會看到這樣
https://ithelp.ithome.com.tw/upload/images/20240929/20169664Y9ps6l2UbE.png

但如果你從伺服器端來看,你會看到這樣
https://ithelp.ithome.com.tw/upload/images/20240929/20169664ArikBBUjQy.png

那這是為什麼呢?
其實答案非常的簡單,我們並沒有把新增一個Part的這個事件告訴伺服器,那伺服器當然也不會知道我們有新增一個Part,所以伺服器端沒有顯示,而其他玩家的客戶端也不會顯示(因為伺服器也沒有告訴其他玩家"我有新增一個Part"),那我們要如何告訴伺服器我們做了哪些事呢?

而這,就是Remote Event的工作了。

使用Remote Event也非常簡單,就以我們剛剛寫好的東西為例(欸不要刪掉欸你該不會刪掉了吧.....)

首先,在ReplicatedStorage新增一個RemoteEvent
https://ithelp.ithome.com.tw/upload/images/20240929/20169664NbrF2CN0jk.png

你可以隨意改變RemoteEvent的名字,這邊我先把它改成AddPartEvent
https://ithelp.ithome.com.tw/upload/images/20240929/20169664VzGkM3HBOp.png

接著,在ServerScriptService新增一個Script(是Script不是LocalScript喔)
https://ithelp.ithome.com.tw/upload/images/20240929/20169664gbwmnT6vW6.png

然後先回到剛剛的LocalScript,並且把程式碼改成:

script.Parent.Parent.Activated:Connect(function()
	game:GetService("ReplicatedStorage"):WaitForChild("AddPartEvent"):FireServer(game.Players.LocalPlayer:GetMouse().Hit) --通知"ReplicatedStorage"裡的"AddPartEvent",並且傳輸玩家鼠標的點擊。
end)

--把剛才function裡面的程式碼先移下來

--local Mouse = game.Players.LocalPlayer:GetMouse()
--local MCP = Instance.new("Part")
--MCP.Name = "MCP"
--MCP.CFrame = CFrame.new(Mouse.Hit.Position.X, Mouse.Hit.Position.Y + 0.5, Mouse.Hit.Position.Z)
--MCP.Size = Vector3.new(1, 1, 1)
--MCP.Parent = workspace
--MCP.Anchored = true
--MCP.CanCollide = false

然後打開剛才在ServerScriptService新增的Script,輸入以下程式碼:

game:GetService("ReplicatedStorage"):WaitForChild("AddPartEvent").OnServerEvent:Connect(function(Player, MouseHit) --當AddPartEvent被通知時,使用以下function,並輸入剛才傳輸過來的資料
	local MCP = Instance.new("Part")
	MCP.Name = "MCP"
	MCP.CFrame = CFrame.new(MouseHit.Position.X, MouseHit.Position.Y + 0.5, MouseHit.Position.Z)
	MCP.Size = Vector3.new(1, 1, 1)
	MCP.Parent = workspace
	MCP.Anchored = true
	MCP.CanCollide = false
end)

寫好以後,當你撿起道具並使用,在伺服器端應顯示如圖
https://ithelp.ithome.com.tw/upload/images/20240929/20169664EqkmLqEotP.png

那各位應該會好奇,為什麼在傳輸過來的資料有兩個,但我們所傳輸的資料只有一個,其實這是Remote Event裡最容易寫錯的地方,不管你傳輸了多少筆資料,第一項資料永遠都會是傳輸資料的玩家,接下來第二項開始才會是你傳輸的資料。

以上,就是Remote Event的基本使用方法

你們可能會問為什麼前兩天沒有文章然後今天突然教個Remote Event,其實這一切都跟明天的文章有相關,相信我,有好康的,比遊戲還刺激。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言