此项目使用条件语句创建一个部分,该部分根据触摸时部件的颜色以及其他条件在排行榜上提供或减去点数。 如果蓝色,那么它将向玩家提供一些点数。 如果绿色,那么它将向玩家提供很多点数。 最后,如果红色,那么它将向玩家收取点数。
设置项目
该点可以添加到任何有点相关的项目。例实例,玩家收集点的冒险游戏。
点跟踪
要设置此项目,您需要一个排行榜来跟踪积分,以及一个更改颜色的部分。代码为排行榜提供。
创建一个名为“Leaderboard”的新脚本在 ServerScriptService 中。复制并粘贴以下代码到脚本中。
--在 ServerScriptService 中,创建一个名为 PlayerSetup 的脚本,内容如下。local Players = game:GetService("Players")local function onPlayerJoin(player)local leaderstats = Instance.new("Folder")leaderstats.Name = "leaderstats"leaderstats.Parent = player-- 示例 IntValuelocal points = Instance.new("IntValue")points.Name = "Points"points.Value = 0points.Parent = leaderstatsend-- 在玩家添加事件触发时运行Players.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
添加玩家服务
要获得积分,您需要获得存储在“玩家”下玩家Explorer中的信息,这与角色对象分开。这是“排行榜统计”等信息的地方。
您可以通过将 玩家服务 添加到脚本中来这么做。 服务 是由 Roblox 工程师制作的额外预置函数集,以节省您的时间。
使用 玩家 服务,输入:
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() 来检查其他方块变量是否包含玩家。
-- 检查玩家是否触摸到零件local function partTouched(otherPart)local player = Players:GetPlayerFromCharacter(otherPart.Parent)end如果玩家触摸零件,它将被存储在玩家变量中。 如果没有,变量将保持为空。 请自拥有:
- 在函数中,检查玩家是否有值。如果有,请调用 givePoints(player) 。
- 在函数下,连接 partTouched() 到 pointPart 的触摸事件。
-- 检查玩家是否触摸到零件local function partTouched(otherPart)-- 如果有人触摸过零件,取得玩家local player = Players:GetPlayerFromCharacter(otherPart.Parent)if player thengivePoints(player)endendpointPart.Touched:Connect(partTouched)运行项目。 每当玩家触摸零件时,您应该看到输出窗口中的消息,说:"Giving player points" 调试提示:
- 检查 "Players" 在 game:GetService("Players") 是否都是大写,并且是否处于引用号。
- partTouched() 应该连接到 pointPart 的 Touched 事件。
创建循环颜色
要在颜色上循环,脚本将使用一个时间 = 循环,该脚本每几秒钟都会更改零件的颜色。该循环的条件为真,因此它可以无限运行。
在脚本结束时,创建一个新的 while 循环,其中条件是真的,即循环总是运行。
-- 检查玩家是否触摸到零件local function partTouched(otherPart)-- 如果有人触摸过零件,取得玩家local player = Players:GetPlayerFromCharacter(otherPart.Parent)if player thengivePoints(player)endendpointPart.Touched:Connect(partTouched)-- 通过颜色循环while true doend在您自拥有的代码一段时间真的是一个循环,将点部件变更为您创建的颜色变量。不要忘记使用 task.wait() 之间的颜色。当您完成时,检查您的代码与以下版本。
-- 通过 3 个颜色循环,在每个颜色之间等待while true dopointPart.Color = bluetask.wait(3)pointPart.Color = greentask.wait(2)pointPart.Color = redtask.wait(1)end测试并确保三个颜色的循环运行无停。
排查提示
如果颜色循环不如预期般工作,请尝试以下列中的一个。
- 检查在脚本的 底部 下,Touched事件下,循环是否在脚本的底部下。如果循环不在底部,它将使其他部分的脚本正常运行。
- 检查内部 Color3.fromRGB() 的每个颜色是否正确写入。必须在 0 和 255 之间有三个数字,例如 (255, 50, 0) 。
给玩家积分
玩家将根据触摸到零件当前颜色来获得积分。
寻找当前颜色
每当玩家触摸零件时,脚本需要知道零件当前的颜色,以便在后来奖励积分。
找到 givePoints() 。 将您的测试消息替换为点部件的当前颜色的变量。 此变量将确定玩家获得 (或失去) 的积分。
local function givePoints(player)local currentColor = pointPart.Colorend要影响玩家的积分,该函数需要访问玩家的排行榜。创建一个变量来存储它。
local function givePoints(player)local currentColor = pointPart.Colorlocal playerStats = player:WaitForChild("leaderstats")end现在添加一个变量来获取玩家的积分值,这是他们排行榜的子级。
local function givePoints(player)local currentColor = pointPart.Colorlocal playerStats = player:WaitForChild("leaderstats")local playerPoints = playerStats:WaitForChild("Points")end
给或减去积分
接下来,您使用 if 和 else 来根据零件的颜色添加或减去点数。请记住,蓝色提供小量,绿色提供多个,红色减去点数。
在 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要检查绿色,请在条件中添加另一个。如果绿色,请将 largePoints 变量添加到玩家的点。
if currentColor == blue thenplayerPoints.Value += smallPointselseif currentColor == green thenplayerPoints.Value += largePointsend使用另一个声明来减去点如果点Part 不是蓝色或绿色。
if currentColor == blue thenplayerPoints.Value += smallPointselseif currentColor == green thenplayerPoints.Value += largePointselseplayerPoints.Value -= losePointsend最后, destroy 零件后,以便脚本不能继续给出积分。
if currentColor == blue thenplayerPoints.Value += smallPointselseif currentColor == green thenplayerPoints.Value += largePointselseplayerPoints.Value -= losePointsendpointPart:Destroy()测试并确认每个颜色是否如期生成点。请确保测试所有 三个 条件。
向玩家提供反馈
点部分可以工作,但玩家可能不会注意到有什么事情发生,除非他们看到自己的排行榜。通过在点部分被摧毁时创建粒子来修复这一点。
当玩家使用零件,例如声音、震动或粒子,添加反馈时,与对象交互更加满意。
创建一个粒子效果
粒子效果将与零件的颜色相同。 由于颜色已存储在变量中,因此很容易重用它们。
在givePoints()下,创建一个新的 ParticleEmitter 实例。请确保实例名称与示例上的字母大小一致。
local particle = Instance.new("ParticleEmitter")end粒子发射器使用颜色顺序来控制其颜色属性。创建一个新颜色顺序并将其颜色值传入当前部分。
-- 摧毁部件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() 与 2>WaitForChild2> 之间使用 5>5> 。
完成 PointScript
脚本的完整版本可以在下面引用。
local pointPart = script.Parent
--本地存储 = 游戏: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