Autour des murs
Leçon 10 sur 20 du cours Jeu Roblox : Échapper aux ténèbres de Coddy.
Tiens-toi dans une pièce, près de sa porte, et le monstre fonce dans le mur : MoveTo se déplace en ligne droite. Deux changements en font un chasseur.
D’abord, il ne chasse que dans la zone définie par Settings.MonsterSight. Ensuite, lorsqu’un mur lui barre la route, il emprunte un chemin. workspace:Raycast envoie un rayon de lui jusqu’à toi : si rien n’est touché (ou si c’est toi qui es touché), la voie est libre. Sinon, PathfindingService trouve un chemin pour contourner les murs et passer par les portes, et le monstre se dirige vers le prochain point du chemin, puis vérifie à nouveau un quart de seconde plus tard :
path:ComputeAsync(root.Position, goal)
local points = path:GetWaypoints()
if path.Status == Enum.PathStatus.Success and points[2] then
shadow.Humanoid:MoveTo(points[2].Position)
endDéfi
Moyen- Récupère PathfindingService et attribue un chemin à chaque monstre :
local path = PathfindingService:CreatePath()dans runMonster. - Définis la distance minimale de
nearestCharactersurSettings.MonsterSight. - Écris
walkToward(shadow, goal, path): effectue un raycast (en excluant le monstre) ; si le chemin est dégagé, avance tout droit ; si un mur se trouve sur le chemin, avance jusqu’au prochain point du chemin. - Poursuis avec
walkToward; si personne n’est à portée, reste immobile.
Appuie sur Play, puis sur Check.
Essayez vous-même
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 -- la salle la plus récente
local count = 0 -- les salles créées jusqu’ici
local monster = nil
-- La nuit tombe : plus de soleil, un peu de lumière partout et du brouillard
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")
-- Un outil que transporte un joueur : dans sa main ou dans son Backpack
local function findTool(player, name)
return (player.Character and player.Character:FindFirstChild(name)) or player.Backpack:FindFirstChild(name)
end
-- Faire pivoter une porte sur ses gonds pour l’ouvrir
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
-- Le joueur vivant le plus proche et sa distance
local function nearestCharacter(position)
local best, bestDistance = nil, math.huge
for _, player in Players:GetPlayers() do
local character = player.Character
local root = character and character:FindFirstChild("HumanoidRootPart")
if root and character.Humanoid.Health > 0 then
local distance = (root.Position - position).Magnitude
if distance < bestDistance then
best, bestDistance = character, distance
end
end
end
return best, bestDistance
end
-- Le comportement du monstre : toutes les quarts de seconde, il poursuit quelqu’un
local function runMonster(shadow)
local humanoid = shadow.Humanoid
local root = shadow.HumanoidRootPart
while shadow.Parent do
local character = nearestCharacter(root.Position)
if character then
humanoid:MoveTo(character.HumanoidRootPart.Position)
end
task.wait(0.25)
end
end
-- Le monstre arrive derrière vous : à l’entrée de la salle située deux salles avant la plus récente
local function spawnMonster()
local behind = nil
for _, room in rooms:GetChildren() do
if room:GetAttribute("Number") == count - 2 then
behind = room
end
end
if not behind then
return
end
monster = ServerStorage.Shadow:Clone()
monster:PivotTo(behind.Entrance.CFrame + Vector3.new(0, 3.1, 0))
monster.Humanoid.WalkSpeed = Settings.MonsterSpeed
monster.Parent = workspace
task.spawn(runMonster, monster)
end
local addRoom -- défini plus bas : une porte ajoute une salle, et une salle a une porte
-- Ce qui se passe lorsqu’un joueur ouvre une porte
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)
-- Entrer dans une salle : elle devient la Room du joueur et son point de réapparition
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)
-- Une nouvelle salle à la sortie de la plus récente
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)
-- une salle verrouillée garde sa clé à l’intérieur
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
-- conserver la salle la plus récente et KeepRooms salles derrière elle
for _, old in rooms:GetChildren() do
if old:GetAttribute("Number") < count - Settings.KeepRooms then
old:Destroy()
end
end
if count == Settings.MonsterFrom then
spawnMonster()
end
return room
end
-- Chaque joueur : Room dans le classement et une lampe de poche à chaque nouvelle vie
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)
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.