這個專案將使用條件語句創建一個部件,根據觸碰時的顏色在排行榜上給予或減少分數。如果是藍色,將給玩家幾分。如果是綠色,則將給很多分。最後,如果是紅色,則會扣除分數。
設置專案
給分的部分可以添加到任何與分數相關的專案中。例如,一個冒險遊戲,玩家在其中收集分數。
分數追蹤
要設置這個專案,您需要一個排行榜來追蹤分數和一個會變色的部分。排行榜的代碼將會提供。
在 ServerScriptService 中創建一個新腳本,命名為 Leaderboard。複製並粘貼下面的代碼到該腳本中。
--在 ServerScriptService 中創建一個名為 PlayerSetup 的腳本,內容如下。local Players = game:GetService("Players")local function onPlayerJoin(player)local leaderstats = Instance.new("Folder")leaderstats.Name = "leaderstats"leaderstats.Parent = player-- IntValue 的示例local points = Instance.new("IntValue")points.Name = "Points"points.Value = 0points.Parent = leaderstatsend-- 當 PlayerAdded 事件觸發時運行 onPlayerJoinPlayers.PlayerAdded:Connect(onPlayerJoin)
顏色改變部分
該腳本將為部分循環三種不同的顏色。每種顏色將有一個變量來儲存它的 RGB 值,這是一種包含三個數字(紅色、綠色、藍色)的數據類型,這些數字用於創建顏色。
創建一個名為 PointPart 的部分,並附加名為 PointScript 的腳本。
在 PointScript 中,使用 script.Parent 來引用該部分。
local pointPart = script.Parent創建變量來儲存不同的顏色。每個變量應設置為 Color3.fromRGB(),用於創建顏色值。
- 藍色(一些分數):(0, 0, 255)
- 綠色(很多分數):(0, 255, 0)
- 紅色(扣除分數):(255, 0, 0)
local pointPart = script.Parent-- 顏色local blue = Color3.fromRGB(0, 0, 255)local green = Color3.fromRGB(0, 255, 0)local red = Color3.fromRGB(255, 0, 0)添加變量以表示少量分數、大量分數以及扣除分數的數量。
-- 顏色local blue = Color3.fromRGB(0, 0, 255)local green = Color3.fromRGB(0, 255, 0)local red = Color3.fromRGB(255, 0, 0)-- 分數值local smallPoints = 10local largePoints = 50local losePoints = 100
添加玩家服務
要給予分數,您需要獲取玩家的資訊,該資訊儲存在瀏覽器的 Players 中,並且與角色物件是分開的。這是可以找到排行榜統計信息的地方。
您可以通過將 Players 服務添加到您的腳本來實現。服務是由 Roblox 工程師製作的額外可預構建函數集,以節省您的時間。
通過輸入以下內容獲取 Players 服務:
local Players = game:GetService("Players")
-- 分數值local smallPoints = 10local largePoints = 50local losePoints = 100-- 需要的服務local Players = game:GetService("Players")
函數和事件
PointsScript 將需要兩個函數。第一個函數將給予和減去分數。第二個函數將檢查玩家是否觸碰了該部分。這些函數將然後與觸碰事件相連,每當該部分被觸碰時將運行。
創建一個名為 givePoints() 的新函數和一個名為 player 的參數。在裡面添加一個用於測試的打印語句。
local Players = game:GetService("Players")-- 給予或減去分數local function givePoints(player)print("Giving player points")end在下面創建第二個名為 partTouched() 的函數,並添加一個名為 otherPart 的參數。
-- 給予或減去分數local function givePoints(player)print("Giving player points")end-- 檢查玩家是否觸碰了該部分local function partTouched(otherPart)end在該函數內部,使用函數 GetPlayerFromCharacter() 檢查 otherPart 變量中是否有玩家。
-- 檢查玩家是否觸碰了該部分local function partTouched(otherPart)local player = Players:GetPlayerFromCharacter(otherPart.Parent)end如果玩家觸碰了該部分,它將被儲存在目前的 player 變量中。如果沒有,則該變量將保持空白。請自己完成:
- 在函數內部檢查玩家是否有值。如果有,則調用 givePoints(player)。
- 在函數下方,將 partTouched() 連接到 pointPart 的 Touched 事件。
-- 檢查玩家是否觸碰了該部分local function partTouched(otherPart)-- 獲得觸碰該部分的玩家local player = Players:GetPlayerFromCharacter(otherPart.Parent)if player thengivePoints(player)endendpointPart.Touched:Connect(partTouched)運行該專案。每當玩家觸碰該部分時,您應該在輸出窗口看到一條消息,內容為:“Giving player points”
故障排除提示:
- 檢查 game:GetService("Players") 中的 "Players" 是否大寫且在引號中。
- partTouched() 應連接到 pointPart 的 Touched 事件。
創建循環顏色
要循環顏色,腳本將使用一個條件為真的 while 循環,每幾秒改變部分的顏色。此循環的條件將為真,因此它可以不斷運行。
在腳本的末尾,創建一個新的 while 循環,條件為真,這意味著循環始終運行。
-- 檢查玩家是否觸碰了該部分local function partTouched(otherPart)-- 獲得觸碰該部分的玩家local player = Players:GetPlayerFromCharacter(otherPart.Parent)if player thengivePoints(player)endendpointPart.Touched:Connect(partTouched)-- 循環顏色while true doend請自己編寫一個 while true do 循環,將 pointPart 的顏色更改為您創建的顏色變量。在顏色之間別忘了使用 task.wait()。完成後,檢查您的代碼是否與以下版本一致。
-- 循環 3 種顏色,每種顏色之間等待while true dopointPart.Color = bluetask.wait(3)pointPart.Color = greentask.wait(2)pointPart.Color = redtask.wait(1)end進行遊戲測試,檢查這三種顏色是否不斷循環而不停止。
故障排除提示
此時,如果顏色循環未按預期工作,請嘗試以下其中一項。
- 檢查 while 循環是否位於 腳本的底部,在 Touched 事件之下。如果循環不在底部,將會阻止腳本的其他部分正確運行。
- 檢查 Color3.fromRGB() 中的每個顏色是否正確書寫。必須有三個用逗號分隔的數字,範圍在 0 到 255 之間,例如 (255, 50, 0)。
給玩家加分
玩家將根據他們觸碰該部分時的當前顏色獲得分數。
找到當前顏色
每當玩家觸碰該部分時,腳本需要知道該部分的當前顏色,以便稍後給予分數。
找到 givePoints()。用 pointPart 的當前顏色變量替換您的測試消息。該變量將決定玩家獲得(或失去)的分數。
local function givePoints(player)local currentColor = pointPart.Colorend為了影響玩家的分數,該函數需要訪問玩家的排行榜。創建一個變量以儲存它。
local function givePoints(player)local currentColor = pointPart.Colorlocal playerStats = player:WaitForChild("leaderstats")end現在添加一個變量以獲取玩家的 Points 值,該值是他們排行榜的子項。
local function givePoints(player)local currentColor = pointPart.Colorlocal playerStats = player:WaitForChild("leaderstats")local playerPoints = playerStats:WaitForChild("Points")end
給予或減去分數
接下來,您將使用 if 和 elseif 根據觸碰時的部分顏色給予或減去分數。請記住,藍色提供少量,綠色提供大量,而紅色則扣除分數。
在 givePoints() 中,在變量的下面,使用 if 語句檢查當前顏色是否為藍色,如果是,則將 smallPoints 加到玩家的當前分數值中。
local function givePoints(player)local currentColor = pointPart.Colorlocal playerStats = player:WaitForChild("leaderstats")local playerPoints = playerStats:WaitForChild("Points")if currentColor == blue thenplayerPoints.Value += smallPointsendend要檢查綠色,請添加一個 else if 條件。如果是綠色,則將 largePoints 變量加到玩家的分數中。
if currentColor == blue thenplayerPoints.Value += smallPointselseif currentColor == green thenplayerPoints.Value += largePointsend使用 else 語句在 pointsPart 不為藍色或綠色時減去分數。
if currentColor == blue thenplayerPoints.Value += smallPointselseif currentColor == green thenplayerPoints.Value += largePointselseplayerPoints.Value -= losePointsend最後,銷毀該部分,以便腳本無法不斷給予分數。
if currentColor == blue thenplayerPoints.Value += smallPointselseif currentColor == green thenplayerPoints.Value += largePointselseplayerPoints.Value -= losePointsendpointPart:Destroy()進行遊戲測試,檢查每種顏色是否如預期給予分數。請確保測試所有 三個 條件。
給玩家反饋
PointPart 可以運作,但玩家可能不會注意到發生了什麼,除非他們恰好在看自己的排行榜。通過在 PointPart 被銷毀時創建粒子效果來修復這一點。
在玩家使用一個部分時添加反饋,例如聲音、震動或粒子,使玩家與物體互動更令人滿意。
創建粒子效果
當觸碰時,粒子效果將與該部分的顏色相同。由於顏色儲存在變量中,重用它們非常簡單。
在 givePoints() 的底部,創建一個新的 ParticleEmitter 實例。確保實例名稱拼寫與顯示的完全一致。
local particle = Instance.new("ParticleEmitter")endParticleEmitters 使用顏色序列來控制其 Color 屬性。創建一個新的 ColorSequence 並傳入當前部分顏色。
-- 銷毀部分pointPart:Destroy()-- 創建粒子local particle = Instance.new("ParticleEmitter")particle.Color = ColorSequence.new(currentColor)粒子需要被放置到觸碰它的玩家上。創建一個變量以獲取玩家的角色模型。然後,將粒子的父級設置為玩家的頭部。
local particle = Instance.new("ParticleEmitter")particle.Color = ColorSequence.new(currentColor)local playerCharacter = player.Characterparticle.Parent = playerCharacter:WaitForChild("Head")使用 task.wait() 等待一小段時間,然後銷毀這些粒子。
local particle = Instance.new("ParticleEmitter")particle.Color = ColorSequence.new(currentColor)local playerCharacter = player.Characterparticle.Parent = playerCharacter:WaitForChild("Head")task.wait(1)particle:Destroy()進行遊戲測試,確保在觸碰每種顏色後粒子會短暫地跟隨玩家。
故障排除提示
此時,如果粒子未按預期工作,請嘗試以下其中一項。
- 確保在創建新實例時,ParticleEmitter 被拼寫為 確切 如顯示並放在引號中。
- 在為粒子設置父級時,確保在 playerCharacter 和 WaitForChild() 之間使用 :,且之間沒有空格。
完整的 PointScript
以下是完整的腳本版本,可以參考。
local pointPart = script.Parent
--local storage = game:GetService("ServerStorage")
-- 給予一些分數
local blue = Color3.fromRGB(0, 0, 255)
-- 給予更多分數
local green = Color3.fromRGB(0, 255, 0)
-- 使玩家失去分數
local red = Color3.fromRGB(255, 0, 0)
-- 給予玩家的分數
local smallPoints = 10
local largePoints = 50
local losePoints = 100
local Players = game:GetService("Players")
local function givePoints(player)
local currentColor = pointPart.Color
local playerStats = player:WaitForChild("leaderstats")
local playerPoints = playerStats:WaitForChild("Points")
-- 根據部分的顏色給予玩家分數
if currentColor == blue then
playerPoints.Value += smallPoints
elseif currentColor == green then
playerPoints.Value += largePoints
else
playerPoints.Value -= losePoints
end
-- 銷毀部分,等待一秒,然後銷毀粒子
pointPart:Destroy()
-- 創建閃爍效果並銷毀它
local playerCharacter = player.Character
local particle = Instance.new("ParticleEmitter")
particle.Color = ColorSequence.new(currentColor)
particle.Parent = playerCharacter:WaitForChild("Head")
task.wait(1)
particle:Destroy()
end
local function partTouched(otherPart)
local player = Players:GetPlayerFromCharacter(otherPart.Parent)
if player then
givePoints(player)
end
end
pointPart.Touched:Connect(partTouched)
-- 根據變量改變部分的顏色。需要在腳本底部。
while true do
pointPart.Color = blue
task.wait(4)
pointPart.Color = green
task.wait(3)
pointPart.Color = red
task.wait(2)
end