Menu
CoddyTech

Canavar Geliyor

Coddy'nin Roblox Oyunu: Karanlıktan Kaçış kursunda ders 9 / 25.

Şimdi canavara geçelim. ServerStorage.Shadow, Humanoid içeren uzun ve karanlık bir modeldir; bu yüzden her NPC gibi Humanoid:MoveTo ile yürür.

Settings.MonsterFrom (4) numaralı oda açıldığında, oyuncuların arkasından gelir: en yeni odadan iki önceki odanın girişinde. Odalar üzerinde döngü kurarak Number değerine göre odayı buluruz:

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

Modelin pivotu ortasında olduğundan, zeminde durması için girişin 3.1 stud üstüne çıkar. Humanoid'inin WalkSpeed değerini Settings.MonsterSpeed hızında tutar.

challenge icon

Görev

Orta

Canavar arkandan gelir.

  1. En üste local monster = nil ekle.
  2. addRoom fonksiyonunun üstüne spawnMonster() yaz: count - 2 numaralı odanın Entrance.CFrame + Vector3.new(0, 3.1, 0) konumunda ServerStorage.Shadow nesnesini klonlayıp monster değişkenine ata; Settings.MonsterSpeed değerini WalkSpeed olarak ayarla; üst nesnesini workspace yap.
  3. addRoom içinde, count == Settings.MonsterFrom olduğunda bu fonksiyonu çağır.

“Oyna”ya bas ve 3. odayı geç: Shadow iki oda arkanda durur. Ardından “Kontrol et”e bas.

Kendin dene

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 -- en yeni oda
local count = 0 -- şimdiye kadar oluşturulan odalar

-- Gece çöker: güneş yok, her yerde hafif bir ışık ve sis var
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")

-- Oyuncunun taşıdığı bir araç: elinde veya Backpack içinde
local function findTool(player, name)
	return (player.Character and player.Character:FindFirstChild(name)) or player.Backpack:FindFirstChild(name)
end

-- Kapıyı menteşesi üzerinde döndürerek aç
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

-- Ders 9: The Monster Comes buraya gelecek

local addRoom -- aşağıda yazıldı: bir kapı oda ekler, odanın da bir kapısı vardır

-- Oyuncu kapıyı açtığında kapının yaptığı şey
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)

-- Bir odaya girildiğinde: oda, oyuncunun Room değeri ve yeniden doğma noktası olur
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)

-- En yeni odanın çıkışında yeni bir oda
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)
	-- kilitli bir oda anahtarını içinde tutar
	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
	-- en yeni odayı ve arkasındaki KeepRooms kadar odayı tut
	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

-- Her oyuncu için: liderlik tablosunda Room ve her yeniden doğuşta bir el feneri
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)

Roblox Oyunu: Karanlıktan Kaçış bölümündeki tüm dersler

Kendi başına pratik yap: Roblox playground