Menu
CoddyTech

Quái vật xuất hiện

Bài học 9 trên 25 trong khóa học Trò chơi Roblox: thoát khỏi bóng tối của Coddy.

Giờ đến con quái vật. ServerStorage.Shadow là một mô hình cao, tối màu có Humanoid, nên nó đi bộ bằng Humanoid:MoveTo như mọi NPC.

Khi phòng Settings.MonsterFrom (4) mở ra, nó xuất hiện phía sau người chơi: tại lối vào của căn phòng nằm trước phòng mới nhất hai phòng. Một vòng lặp qua các phòng sẽ tìm căn phòng đó bằng Number:

for _, room in rooms:GetChildren() do
	if room:GetAttribute("Number") == count - 2 then
		behind = room
	end
end

Điểm pivot của mô hình nằm ở chính giữa, nên nó di chuyển đến vị trí cao hơn lối vào 3.1 studs để đứng trên sàn. Tốc độ của nó được đặt theo Settings.MonsterSpeed trong WalkSpeed của Humanoid.

challenge icon

Thử thách

Trung bình

Quái vật xuất hiện phía sau bạn.

  1. Thêm local monster = nil ở đầu.
  2. Phía trên addRoom, viết spawnMonster(): sao chép ServerStorage.Shadow vào monster tại Entrance.CFrame + Vector3.new(0, 3.1, 0) của căn phòng count - 2; đặt WalkSpeed thành Settings.MonsterSpeed; đặt nó làm con của workspace.
  3. Trong addRoom, gọi hàm này khi count == Settings.MonsterFrom.

Nhấn Chơi và đi qua phòng 3: Shadow đứng cách bạn hai phòng về phía sau. Sau đó nhấn Kiểm tra.

Tự làm thử

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Lighting = game:GetService("Lighting")
local TweenService = game:GetService("TweenService")
local Settings = require(game.ReplicatedStorage.Settings)

local rooms = workspace.Rooms
local lastRoom = rooms.Lobby -- phòng mới nhất
local count = 0 -- số phòng đã tạo đến lúc này

-- Đêm xuống: không có ánh mặt trời, khắp nơi có chút ánh sáng và sương mù
Lighting.ClockTime = Settings.ClockTime
Lighting.Ambient = Settings.Ambient
Lighting.OutdoorAmbient = Settings.Ambient
Lighting.FogColor = Color3.new(0, 0, 0)
Lighting.FogEnd = Settings.FogEnd
print("Lights out")

-- Vật dụng người chơi mang theo: trên tay hoặc trong Backpack
local function findTool(player, name)
	return (player.Character and player.Character:FindFirstChild(name)) or player.Backpack:FindFirstChild(name)
end

-- Mở cửa bằng cách xoay quanh bản lề
local function openDoor(door)
	door:SetAttribute("Open", true)
	door.Panel.Prompt.Enabled = false
	local hinge, panel = door.Hinge, door.Panel
	local goal = hinge.CFrame * CFrame.Angles(0, math.rad(90), 0) * hinge.CFrame:ToObjectSpace(panel.CFrame)
	TweenService:Create(panel, TweenInfo.new(0.6), { CFrame = goal }):Play()
end

-- Bài học 9: Quái vật xuất hiện nằm ở đây

local addRoom -- viết bên dưới: cửa tạo thêm phòng, và phòng có cửa

-- Cửa hoạt động thế nào khi người chơi mở cửa
local function setupDoor(door)
	door.Panel.Prompt.Triggered:Connect(function(player)
		if door:GetAttribute("Open") then
			return
		end
		if door:GetAttribute("Locked") then
			local key = findTool(player, "Key")
			if not key then
				return
			end
			key:Destroy()
			door:SetAttribute("Locked", nil)
		end
		if door.Parent == lastRoom then
			addRoom()
		end
		openDoor(door)
	end)
end
setupDoor(workspace.Rooms.Lobby.Door)

-- Khi người chơi bước vào phòng: phòng đó trở thành Room và điểm hồi sinh của họ
local function setupEntry(room)
	room.Entry.Touched:Connect(function(hit)
		local player = Players:GetPlayerFromCharacter(hit.Parent)
		if player then
			local number = room:GetAttribute("Number")
			player.leaderstats.Room.Value = number
			player.RespawnLocation = room.Checkpoint
		end
	end)
end
setupEntry(workspace.Rooms.Lobby)

-- Phòng mới ở lối ra của phòng mới nhất
function addRoom()
	count += 1
	local name = Settings.Order[(count - 1) % #Settings.Order + 1]
	if count >= Settings.RoomsToEscape then
		name = "Exit"
	end
	local room = ServerStorage.Rooms[name]:Clone()
	room:PivotTo(lastRoom.Exit.CFrame)
	room:SetAttribute("Number", count)
	room.Sign.SurfaceGui.Number.Text = "Room " .. count
	room.Parent = rooms
	lastRoom = room
	setupDoor(room.Door)
	setupEntry(room)
	-- phòng bị khóa giữ chìa khóa bên trong
	local keySpot = room:FindFirstChild("KeySpot")
	if keySpot then
		local key = ServerStorage.Key:Clone()
		key.Handle.CFrame = keySpot.CFrame
		key.Parent = room
		key.Handle.Prompt.Triggered:Connect(function(player)
			key.Handle.Prompt.Enabled = false
			key.Parent = player.Backpack
		end)
	end
	-- giữ phòng mới nhất và KeepRooms phòng phía sau
	for _, old in rooms:GetChildren() do
		local number = old:GetAttribute("Number")
		if number < count - Settings.KeepRooms then
			print("Room " .. number .. " is gone")
			old:Destroy()
		end
	end
	return room
end

-- Mỗi người chơi: Room trên bảng xếp hạng và một chiếc đèn pin sau mỗi lần hồi sinh
Players.PlayerAdded:Connect(function(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local room = Instance.new("IntValue")
	room.Name = "Room"
	room.Parent = leaderstats

	player.CharacterAdded:Connect(function()
		local flashlight = ServerStorage.Flashlight:Clone()
		flashlight.Parent = player.Backpack
		local beam = flashlight.Handle.Beam
		flashlight.Activated:Connect(function()
			beam.Enabled = not beam.Enabled
		end)
	end)
end)

Tất cả bài học trong Trò chơi Roblox: thoát khỏi bóng tối

Tự luyện tập: Playground Roblox