使用条件语句练习积分

*此内容使用人工智能(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 值,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

添加玩家服务

要奖励积分,您需要访问玩家的信息,该信息存储在 Explorer 中的 Players 下,并且与角色对象是分开的。这就是可以找到排行榜统计信息的地方。

您可以通过将 Players 服务添加到脚本中来实现。Services 是罗布乐思工程师创建的一组额外的内置函数,以节省您的时间。

  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("给予玩家积分")
    end
  2. 在其下方,创建一个名为 partTouched() 的第二个函数,并添加一个名为 otherPart 的参数。


    -- 给与或扣除积分
    local function givePoints(player)
    print("给予玩家积分")
    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. 运行 项目。每当玩家触摸该部分时,您应该在输出窗口看到一条消息:“给予玩家积分”。

故障排除提示:

  • 检查 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 语句之后 销毁 部件,以便脚本无法继续给予积分。


    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 使用颜色序列来控制其颜色属性。创建一个新的 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
©2026 Roblox Corporation、Roblox、Roblox 标志及 Powering Imagination 是我们在美国及其他国家或地区的注册与未注册商标。