这个项目将使用条件语句创建一个部分,关于当部件被触摸时,基于其颜色在排行榜上给予或扣除积分。如果是蓝色,它将给予玩家一些积分。如果是绿色,它将给予很多积分。最后,如果是红色,它将扣除积分。
设置项目
给积分的部分可以添加到任何与积分相关的项目中。例如,一个冒险游戏,玩家在游戏中收集积分。
积分跟踪
为了设置这个项目,您将需要一个排行榜来跟踪积分,以及一个能够改变颜色的部分。排行榜的代码会提供。
在 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 值,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
添加玩家服务
要奖励积分,您需要访问玩家的信息,该信息存储在 Explorer 中的 Players 下,并且与角色对象是分开的。这就是可以找到排行榜统计信息的地方。
您可以通过将 Players 服务添加到脚本中来实现。Services 是罗布乐思工程师创建的一组额外的内置函数,以节省您的时间。
通过输入以下内容来获取 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("给予玩家积分")end在其下方,创建一个名为 partTouched() 的第二个函数,并添加一个名为 otherPart 的参数。
-- 给与或扣除积分local function givePoints(player)print("给予玩家积分")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)运行 项目。每当玩家触摸该部分时,您应该在输出窗口看到一条消息:“给予玩家积分”。
故障排除提示:
- 检查 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 语句之后 销毁 部件,以便脚本无法继续给予积分。
if currentColor == blue thenplayerPoints.Value += smallPointselseif currentColor == green thenplayerPoints.Value += largePointselseplayerPoints.Value -= losePointsendpointPart:Destroy()进行游戏测试,检查每种颜色是否按照预期给出积分。确保测试所有 三 种条件。
给玩家反馈
PointPart 工作正常,但玩家可能不会注意到发生了什么,除非他们恰好在看排行榜。通过在 PointPart 被销毁时创建粒子效果来解决这个问题。
在玩家使用某个部分时添加反馈,例如声音、震动或粒子,可以使与对象的交互对玩家而言更加令人满意。
创建粒子效果
粒子效果将与触摸时的部件颜色相同。由于颜色已存储在变量中,因此可以轻松重用它们。
在 givePoints() 的底部,创建一个新的 ParticleEmitter 实例。确保实例名称的拼写与所示完全相同。
local particle = Instance.new("ParticleEmitter")endParticleEmitters 使用颜色序列来控制其颜色属性。创建一个新的 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