在致命熔岩中,你学习了如何基于用户行为触发代码。本教程将向你展示如何制作一个在用户踩上去时会渐渐消失的平台。
设置
如果你跟随了致命熔岩,你可以将渐隐平台放置在用户无法跳过的熔岩地面上方。
插入一个部分并将其移动到你世界中的位置。将其命名为FadingPlatform。
调整大小以便用户可以跳上去。
确保它是固定的。

在该部分中插入一个脚本,将其重命名为FadeOnTouch,并删除默认代码。

为平台创建一个变量,并连接到平台的Touched事件的一个空函数。
local platform = script.Parentlocal function fade()endplatform.Touched:Connect(fade)
渐隐平台
平台瞬间消失会让用户无法跨越鸿沟,因此不太好。所以,平台应该在用户坠落之前渐渐消失,给他们一个跳开去的机会。
你可以通过不断改变Transparency属性并等待很短的时间来实现这个效果,但渐渐消失需要至少在0到1之间进行10次变化。这将导致20行重复的代码。
通过使用for循环可以更有效地实现这个效果,循环代码的次数是具体的。每次循环称为一个迭代。for循环由三部分组成,逗号分隔:

- 控制变量 - 用于计数循环的变量。在本例中,它为count,起始值为1。
- 结束值 - 跳出循环所需达到的值。在本例中,它为10。
- 步进增量(可选) - 决定每次循环时控制变量增加多少。如果省略,默认值为1,因此在本例中没有必要。
在FadeOnTouch中:
在函数中创建一个从1开始的for循环,迭代10次。
在for循环中,将Transparency属性设置为控制变量除以10。
调用task.wait()函数,时间为0.1。
local platform = script.Parentlocal function fade()for count = 1, 10 doplatform.Transparency = count / 10task.wait(0.1)endendplatform.Touched:Connect(fade)
当循环运行时,count会在每次迭代中增加1。这意味着平台的Transparency将每隔0.1秒增加0.1,1秒后将达到完全透明。
重新出现
在平台消失之后,用户应该会掉下去。平台应该在消失几秒后再次出现,否则用户在失败后将永远无法再尝试跳跃。CanCollide属性控制用户是否能够穿过某个部分。
在for循环后将平台的CanCollide属性设置为false。
使用task.wait()函数等待几秒钟。
将CanCollide属性设置回true。
将Transparency属性设置回0。
local platform = script.Parentlocal function fade()for count = 1, 10 doplatform.Transparency = count / 10task.wait(0.1)endplatform.CanCollide = falsetask.wait(3)platform.CanCollide = trueplatform.Transparency = 0endplatform.Touched:Connect(fade)
防抖变量
在致命熔岩中,你了解了每次用户身体的一部分与某部分接触时,Touched事件都会运行。当用户在渐隐平台上奔跑时,这种行为会导致问题:函数会多次运行,每次都重置循环。
为了让代码正常工作,函数应该在用户第一次接触平台时只运行一次。确保某个动作在本该执行多次的情况下只被触发一次被称为防抖。
要防抖一个函数,可以使用一个布尔值变量来跟踪平台是否已经被触碰过。布尔值只能包含true和false。创建一个名为isTouched的变量并初始化为false。
local platform = script.Parent
local isTouched = false
local function fade()
for count = 1, 10 do
platform.Transparency = count / 10
task.wait(0.1)
end
platform.CanCollide = false
task.wait(3)
platform.CanCollide = true
platform.Transparency = 0
end
platform.Touched:Connect(fade)
检查变量
可以使用if语句来仅在isTouched防抖变量为false时运行fade函数中的代码。用if语句将fade函数的主体包裹起来,条件为not isTouched。
local platform = script.Parent
local isTouched = false
local function fade()
if not isTouched then
for count = 1, 10 do
platform.Transparency = count / 10
task.wait(0.1)
end
platform.CanCollide = false
task.wait(3)
platform.CanCollide = true
platform.Transparency = 0
end
end
platform.Touched:Connect(fade)
Luau的not运算符会反转跟随它的值。在条件意义上,这意味着第一个if语句的行为将与后面的语句相同。
if not isTouched thenendif isTouched == false thenendif isTouched == nil thenend
切换防抖
目前,fade函数中的代码总是会运行,因为isTouched为false,而not isTouched为true。要完成防抖程序,你需要在两个地方切换变量的值。
- 在if语句内,在平台开始渐变之前设置isTouched为true。
- 在平台再次出现后把它设回false。
local function fade()
if not isTouched then
isTouched = true
for count = 1, 10 do
platform.Transparency = count / 10
task.wait(0.1)
end
platform.CanCollide = false
task.wait(3)
platform.CanCollide = true
platform.Transparency = 0
isTouched = false
end
end
platform.Touched:Connect(fade)
就这样!现在测试你的代码,你应该会发现,当用户跳上去时平台会渐渐消失,几秒钟后又会重新出现。
你可以在较大的间隙中复制这个平台来创建一个具有挑战性的障碍,并改变它们渐隐的速度来平衡难度。
最终代码
local platform = script.Parent
local isTouched = false
local function fade()
if not isTouched then
isTouched = true
for count = 1, 10 do
platform.Transparency = count / 10
task.wait(0.1)
end
platform.CanCollide = false
task.wait(3)
platform.CanCollide = true
platform.Transparency = 0
isTouched = false
end
end
platform.Touched:Connect(fade)