Menu
CoddyTech

Monster Datang

Pelajaran 9 dari 25 dalam kursus Game Roblox: Kabur dari Kegelapan di Coddy.

Sekarang monsternya. ServerStorage.Shadow adalah model gelap yang tinggi dengan Humanoid, jadi ia berjalan menggunakan Humanoid:MoveTo seperti NPC lainnya.

Saat ruangan Settings.MonsterFrom (4) terbuka, monster itu masuk dari belakang para pemain: di pintu masuk ruangan yang letaknya dua ruangan sebelum ruangan terbaru. Perulangan pada ruangan menemukan ruangan itu melalui Number:

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

Titik pivot model berada di tengahnya, jadi model bergerak ke titik 3.1 stud di atas pintu masuk agar berdiri di lantai. Kecepatannya diatur menggunakan nilai Settings.MonsterSpeed pada WalkSpeed milik Humanoid-nya.

challenge icon

Tantangan

Sedang

Monster muncul di belakangmu.

  1. Tambahkan local monster = nil di bagian atas.
  2. Di atas addRoom, tulis spawnMonster(): klon ServerStorage.Shadow ke dalam monster di Entrance.CFrame + Vector3.new(0, 3.1, 0) dari ruangan count - 2; WalkSpeed Settings.MonsterSpeed; jadikan workspace sebagai parent-nya.
  3. Di addRoom, panggil fungsi itu saat count == Settings.MonsterFrom.

Tekan tombol “Main” dan lewati ruangan 3: Shadow berdiri dua ruangan di belakangmu. Lalu tekan tombol “Periksa”.

Coba sendiri

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 -- ruangan terbaru
local count = 0 -- jumlah ruangan yang sudah dibuat

-- Malam tiba: tanpa matahari, sedikit cahaya di mana-mana, dan kabut
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")

-- Alat yang dibawa pemain: di tangan atau di Backpack
local function findTool(player, name)
	return (player.Character and player.Character:FindFirstChild(name)) or player.Backpack:FindFirstChild(name)
end

-- Ayunkan pintu hingga terbuka pada engselnya
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

-- Pelajaran 9: The Monster Comes ditempatkan di sini

local addRoom -- ditulis di bawah: pintu menambahkan ruangan, dan setiap ruangan memiliki pintu

-- Apa yang dilakukan pintu saat pemain membukanya
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)

-- Saat pemain memasuki ruangan, ruangan itu menjadi Room dan titik respawn pemain
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)

-- Ruangan baru di pintu keluar ruangan terbaru
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)
	-- ruangan terkunci menyimpan kuncinya di dalam
	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
	-- pertahankan ruangan terbaru dan KeepRooms ruangan di belakangnya
	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

-- Setiap pemain: Room di papan peringkat dan senter setiap kali hidup kembali
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)

Semua pelajaran di Game Roblox: Kabur dari Kegelapan

Latihan sendiri: Playground Roblox