使用 Else/if 的給點練習

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

這個專案將使用條件語句創建一個部件,根據觸碰時的顏色在排行榜上給予或減少分數。如果是藍色,將給玩家幾分。如果是綠色,則將給很多分。最後,如果是紅色,則會扣除分數。

設置專案

給分的部分可以添加到任何與分數相關的專案中。例如,一個冒險遊戲,玩家在其中收集分數。

分數追蹤

要設置這個專案,您需要一個排行榜來追蹤分數和一個會變色的部分。排行榜的代碼將會提供。

  1. 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 = 0
    points.Parent = leaderstats
    end
    -- 當 PlayerAdded 事件觸發時運行 onPlayerJoin
    Players.PlayerAdded:Connect(onPlayerJoin)

顏色改變部分

該腳本將為部分循環三種不同的顏色。每種顏色將有一個變量來儲存它的 RGB 值,這是一種包含三個數字(紅色、綠色、藍色)的數據類型,這些數字用於創建顏色。

  1. 創建一個名為 PointPart 的部分,並附加名為 PointScript 的腳本。

  2. 在 PointScript 中,使用 script.Parent 來引用該部分。


    local pointPart = script.Parent
  3. 創建變量來儲存不同的顏色。每個變量應設置為 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)
  4. 添加變量以表示少量分數、大量分數以及扣除分數的數量。


    -- 顏色
    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

添加玩家服務

要給予分數,您需要獲取玩家的資訊,該資訊儲存在瀏覽器的 Players 中,並且與角色物件是分開的。這是可以找到排行榜統計信息的地方。

您可以通過將 Players 服務添加到您的腳本來實現。服務是由 Roblox 工程師製作的額外可預構建函數集,以節省您的時間。

  1. 通過輸入以下內容獲取 Players 服務:

    local Players = game:GetService("Players")


    -- 分數值
    local smallPoints = 10
    local largePoints = 50
    local losePoints = 100
    -- 需要的服務
    local Players = game:GetService("Players")

函數和事件

PointsScript 將需要兩個函數。第一個函數將給予和減去分數。第二個函數將檢查玩家是否觸碰了該部分。這些函數將然後與觸碰事件相連,每當該部分被觸碰時將運行。

  1. 創建一個名為 givePoints() 的新函數和一個名為 player 的參數。在裡面添加一個用於測試的打印語句。


    local Players = game:GetService("Players")
    -- 給予或減去分數
    local function givePoints(player)
    print("Giving player points")
    end
  2. 在下面創建第二個名為 partTouched() 的函數,並添加一個名為 otherPart 的參數。


    -- 給予或減去分數
    local function givePoints(player)
    print("Giving player points")
    end
    -- 檢查玩家是否觸碰了該部分
    local function partTouched(otherPart)
    end
  3. 在該函數內部,使用函數 GetPlayerFromCharacter() 檢查 otherPart 變量中是否有玩家。


    -- 檢查玩家是否觸碰了該部分
    local function partTouched(otherPart)
    local player = Players:GetPlayerFromCharacter(otherPart.Parent)
    end
  4. 如果玩家觸碰了該部分,它將被儲存在目前的 player 變量中。如果沒有,則該變量將保持空白。請自己完成:

    • 在函數內部檢查玩家是否有值。如果有,則調用 givePoints(player)
    • 在函數下方,將 partTouched() 連接到 pointPart 的 Touched 事件。

    -- 檢查玩家是否觸碰了該部分
    local function partTouched(otherPart)
    -- 獲得觸碰該部分的玩家
    local player = Players:GetPlayerFromCharacter(otherPart.Parent)
    if player then
    givePoints(player)
    end
    end
    pointPart.Touched:Connect(partTouched)
  5. 運行該專案。每當玩家觸碰該部分時,您應該在輸出窗口看到一條消息,內容為:“Giving player points”

故障排除提示:

  • 檢查 game:GetService("Players") 中的 "Players" 是否大寫且在引號中。
  • partTouched() 應連接到 pointPart 的 Touched 事件。

創建循環顏色

要循環顏色,腳本將使用一個條件為真的 while 循環,每幾秒改變部分的顏色。此循環的條件將為真,因此它可以不斷運行。

  1. 在腳本的末尾,創建一個新的 while 循環,條件為真,這意味著循環始終運行。


    -- 檢查玩家是否觸碰了該部分
    local function partTouched(otherPart)
    -- 獲得觸碰該部分的玩家
    local player = Players:GetPlayerFromCharacter(otherPart.Parent)
    if player then
    givePoints(player)
    end
    end
    pointPart.Touched:Connect(partTouched)
    -- 循環顏色
    while true do
    end
  2. 請自己編寫一個 while true do 循環,將 pointPart 的顏色更改為您創建的顏色變量。在顏色之間別忘了使用 task.wait()。完成後,檢查您的代碼是否與以下版本一致。


    -- 循環 3 種顏色,每種顏色之間等待
    while true do
    pointPart.Color = blue
    task.wait(3)
    pointPart.Color = green
    task.wait(2)
    pointPart.Color = red
    task.wait(1)
    end
  3. 進行遊戲測試,檢查這三種顏色是否不斷循環而不停止。

故障排除提示

此時,如果顏色循環未按預期工作,請嘗試以下其中一項。

  • 檢查 while 循環是否位於 腳本的底部,在 Touched 事件之下。如果循環不在底部,將會阻止腳本的其他部分正確運行。
  • 檢查 Color3.fromRGB() 中的每個顏色是否正確書寫。必須有三個用逗號分隔的數字,範圍在 0 到 255 之間,例如 (255, 50, 0)

給玩家加分

玩家將根據他們觸碰該部分時的當前顏色獲得分數。

找到當前顏色

每當玩家觸碰該部分時,腳本需要知道該部分的當前顏色,以便稍後給予分數。

  1. 找到 givePoints()。用 pointPart 的當前顏色變量替換您的測試消息。該變量將決定玩家獲得(或失去)的分數。


    local function givePoints(player)
    local currentColor = pointPart.Color
    end
  2. 為了影響玩家的分數,該函數需要訪問玩家的排行榜。創建一個變量以儲存它。


    local function givePoints(player)
    local currentColor = pointPart.Color
    local playerStats = player:WaitForChild("leaderstats")
    end
  3. 現在添加一個變量以獲取玩家的 Points 值,該值是他們排行榜的子項。


    local function givePoints(player)
    local currentColor = pointPart.Color
    local playerStats = player:WaitForChild("leaderstats")
    local playerPoints = playerStats:WaitForChild("Points")
    end

給予或減去分數

接下來,您將使用 if 和 elseif 根據觸碰時的部分顏色給予或減去分數。請記住,藍色提供少量,綠色提供大量,而紅色則扣除分數。

  1. givePoints() 中,在變量的下面,使用 if 語句檢查當前顏色是否為藍色,如果是,則將 smallPoints 加到玩家的當前分數值中。


    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
    end
    end
  2. 要檢查綠色,請添加一個 else if 條件。如果是綠色,則將 largePoints 變量加到玩家的分數中。


    if currentColor == blue then
    playerPoints.Value += smallPoints
    elseif currentColor == green then
    playerPoints.Value += largePoints
    end
  3. 使用 else 語句在 pointsPart 不為藍色或綠色時減去分數。


    if currentColor == blue then
    playerPoints.Value += smallPoints
    elseif currentColor == green then
    playerPoints.Value += largePoints
    else
    playerPoints.Value -= losePoints
    end
  4. 最後,銷毀該部分,以便腳本無法不斷給予分數。


    if currentColor == blue then
    playerPoints.Value += smallPoints
    elseif currentColor == green then
    playerPoints.Value += largePoints
    else
    playerPoints.Value -= losePoints
    end
    pointPart:Destroy()
  5. 進行遊戲測試,檢查每種顏色是否如預期給予分數。請確保測試所有 三個 條件。

給玩家反饋

PointPart 可以運作,但玩家可能不會注意到發生了什麼,除非他們恰好在看自己的排行榜。通過在 PointPart 被銷毀時創建粒子效果來修復這一點。

在玩家使用一個部分時添加反饋,例如聲音、震動或粒子,使玩家與物體互動更令人滿意。

創建粒子效果

當觸碰時,粒子效果將與該部分的顏色相同。由於顏色儲存在變量中,重用它們非常簡單。

  1. givePoints() 的底部,創建一個新的 ParticleEmitter 實例。確保實例名稱拼寫與顯示的完全一致。


    local particle = Instance.new("ParticleEmitter")
    end
  2. ParticleEmitters 使用顏色序列來控制其 Color 屬性。創建一個新的 ColorSequence 並傳入當前部分顏色。


    -- 銷毀部分
    pointPart:Destroy()
    -- 創建粒子
    local particle = Instance.new("ParticleEmitter")
    particle.Color = ColorSequence.new(currentColor)
  3. 粒子需要被放置到觸碰它的玩家上。創建一個變量以獲取玩家的角色模型。然後,將粒子的父級設置為玩家的頭部。


    local particle = Instance.new("ParticleEmitter")
    particle.Color = ColorSequence.new(currentColor)
    local playerCharacter = player.Character
    particle.Parent = playerCharacter:WaitForChild("Head")
  4. 使用 task.wait() 等待一小段時間,然後銷毀這些粒子。


    local particle = Instance.new("ParticleEmitter")
    particle.Color = ColorSequence.new(currentColor)
    local playerCharacter = player.Character
    particle.Parent = playerCharacter:WaitForChild("Head")
    task.wait(1)
    particle:Destroy()
  5. 進行遊戲測試,確保在觸碰每種顏色後粒子會短暫地跟隨玩家。

故障排除提示

此時,如果粒子未按預期工作,請嘗試以下其中一項。

  • 確保在創建新實例時,ParticleEmitter 被拼寫為 確切 如顯示並放在引號中。
  • 在為粒子設置父級時,確保在 playerCharacterWaitForChild() 之間使用 :,且之間沒有空格。

完整的 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