Menu
CoddyTech

消失的台阶

Coddy Roblox 游戏:无尽高塔 课程的第 7 课,共 21 课。

标记为 Vanish 的玻璃台阶会在你踩上去后不久消失,然后再回来。关闭 CanCollide 的部件可以被穿过,而设置较高的 Transparency 后,它看起来就像消失了一样:

part.Transparency = 0.8
part.CanCollide = false

每个碰到台阶的肢体都会触发 Touched,你穿过台阶时它也会再次触发。如果没有检查,每次触碰都会启动自己的渐隐过程,等你离开很久后,台阶还会闪烁。防抖可以让只有第一次触碰生效:在台阶忙碌时给它做个标记,并忽略标记存在期间的触碰。

if part:GetAttribute("Gone") then
	return
end
part:SetAttribute("Gone", true)
-- 淡出,等待,再回来
part:SetAttribute("Gone", nil)

等待过程发生在 Touched 函数内部。Roblox 会独立运行这个函数,因此它不会阻塞游戏的其他部分。

challenge icon

挑战

中等

让玻璃台阶在你脚下消失。

  1. 编写 makeVanish(part):在 Touched 事件中,如果有角色碰到台阶且未设置属性 Gone,就将它设为 true。
  2. 等待 Settings.VanishDelay,将 Transparency 设为 0.8,并将 CanCollide 设为 false;等待 Settings.VanishTime,恢复这两个值,并将 Gone 设为 nil。
  3. 在 setupStage 中,对带有 Vanish 标签的部件调用它。

按“开始”,然后站在玻璃台阶上:它会逐渐消失,然后重新出现。接着按“检查”。

亲手试试

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local CollectionService = game:GetService("CollectionService")
local RunService = game:GetService("RunService")
local Settings = require(game.ReplicatedStorage.Settings)

local stages = ServerStorage.Stages
local tower = nil

print("Each tower has " .. Settings.StageCount .. " stages")

-- 每位玩家的排行榜上都有 Wins
Players.PlayerAdded:Connect(function(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local wins = Instance.new("IntValue")
	wins.Name = "Wins"
	wins.Parent = leaderstats
end)

-- 碰到带有 Kill 标签的物体就会失去一条命
local function killOnTouch(hit)
	local humanoid = hit.Parent:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Health = 0
	end
end

-- 第 7 课:消失的台阶写在这里

-- Spinners 每帧都会转动一点
RunService.Heartbeat:Connect(function(dt)
	for _, spinner in CollectionService:GetTagged("Spinner") do
		if spinner:IsDescendantOf(workspace) then
			spinner:PivotTo(spinner:GetPivot() * CFrame.Angles(0, math.rad(Settings.SpinSpeed) * dt, 0))
		end
	end
end)

-- 根据标签启用关卡中的所有障碍物
local function setupStage(stage)
	for _, part in stage:GetDescendants() do
		if part:HasTag("Kill") then
			part.Touched:Connect(killOnTouch)
		end
	end
end

-- 随机选一个关卡
local function pickStage()
	local all = stages:GetChildren()
	return all[math.random(1, #all)]
end

-- 将模型的副本放到塔顶,返回副本和新的塔顶高度
local function stack(template, bottom)
	local copy = template:Clone()
	local box, size = copy:GetBoundingBox()
	local lift = bottom - (box.Position.Y - size.Y / 2)
	copy:PivotTo(copy:GetPivot() + Vector3.new(0, lift, 0))
	copy.Parent = tower
	return copy, bottom + size.Y
end

-- 从下往上建造一座新的随机塔
local function buildTower()
	tower = Instance.new("Model")
	tower.Name = "Tower"
	tower.Parent = workspace
	local top = 0
	for i = 1, Settings.StageCount do
		local stage, newTop = stack(pickStage(), top)
		top = newTop
		setupStage(stage)
	end
	stack(ServerStorage.Finish, top)
end

buildTower()

Roblox 游戏:无尽高塔中的所有课

自己练习: Roblox 在线编辑器