Mouvement Automatiques
Sur cette page tu trouveras comment faire:
- Mouvement automatique simple
- Mouvement automatique répeté
- S’accrocher à un objet en mouvement
- Choisit sa vitesse hors du script
Script Serveur: Animation Simple
Les mouvements sont gérées par le serveur (si on faisait un Script Joueur, seul 1 seul joueur verrait le mouvement de l’objet).
Il en existe 2 types: ceux fait par animation, qui peuvent se répéter, et les autres.
On commence par un exemple d’animation simple. Ici, si on touche le bloc, il se met à tomber.
Après 90 secondes, le bloc se teleporte ensuite de nouveau à sa place.
local CollectionService = game:GetService("CollectionService") --récupère les objets du jeu
local TweenService = game:GetService("TweenService") --gestion de création d'animation
local RunService = game:GetService("RunService") -- gestion du lecteur d'animation
-- info sur l'animation créé: Durée, Style (on touche pas celui la), la direction (et si on fait aller-retour),
-- le nombre de répétition (-1 = infini), si au retour on inverse la direction
local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Quad, Enum.EasingDirection.In, 0, false)
local control = false
local function ObjetTouchee(objet,other) -- la fonction qui se lancer quand il y a contact
if control == false then
control = true
local originalPosition = objet.Position --position de depart (pour le reset)
local tween = TweenService:Create(objet, tweenInfo, { -- creer les frames d'animation
CFrame = objet.CFrame * CFrame.new(0, -70, 0)
})
tween:Play() --lire l'animation
wait(10) -- Attente avant de réinitialiser
tween:Cancel() --stop l'animation
objet.Position = originalPosition -- Réinitialisation de la position
control = false
end
end
for _, object in pairs(CollectionService:GetTagged("chute")) do -- pour tout objet taggé
if object:IsA("BasePart") then -- si touché par un humanoid
object.Touched:Connect(function(otherPart)ObjetTouchee(object,otherPart) -- lancer la fonction
end)end
end
Script Serveur: Animation Répété
Les mouvements sont gérées par le serveur (si on faisait un Script Joueur, seul 1 seul joueur verrait le mouvement de l’objet).
Il en existe 2 types: ceux fait par animation, qui peuvent se répéter, et les autres.
Ici on a une animation répété. Elle utilise les
local TweenService = game:GetService("TweenService") --gestion de création d'animation
local RunService = game:GetService("RunService") -- gestion du lecteur d'animation
-- info sur l'animation créé: Durée, Style (on touche pas celui la), la direction (et si on fait aller-retour),
-- le nombre de répétition (-1 = infini), si au retour on inverse la direction
local tweenInfo = TweenInfo.new(10, Enum.EasingStyle.Quad, Enum.EasingDirection.InOut, -1, true)
local CollectionService = game:GetService("CollectionService")
local tag = "ascenceur" --le tag de l'objet multiple
-- constament en train de tourner, verifie les objets du jeu pour savoir si on en a raté un qui aurait le bon tag
for _, object in pairs(CollectionService:GetTagged(tag)) do
if object:IsA("BasePart") then
local tween = TweenService:Create(object, tweenInfo, { -- creer les frames d'animation
-- deplacer l'objet dans la direction Z, à vitesse -62
(il commencera donc par aller en arrière) CFrame = object.CFrame * CFrame.new(0, 0, -62)
})
tween:Play() --lire l'animation
end
end
S’accrocher à un objet animé
Lorsque l’on utilise le mouvement pour faire des plateformes ou des ascenceurs, il faut que le joueur se déplace avec la plateforme. Sinon elle part sans nous. On a 2 méthodes
Seats
Local Player Script
Cette méthode est garantie de marcher pour tous les joueurs, sans rien d’autre que le script:
local root = script.Parent.HumanoidRootPart --recupère le corps du joueur pour tester ce qui est touché
local CS = game:GetService("CollectionService") --liste des objets taggé du jeu
local thread -- pour lancer la glue plus tard
local function delaglue(platform) -- fonction pour se gluer
return function() -- si la fonction échoue, evite le crash
local lastCframe = nil -- variable pour récuperer les infos de l'animation de l'objet auquel on veut s'attacher
while true do
if lastCframe == nil then -- si on n'a pas d'info sur la 1er frame de l'animation
lastCframe = platform.CFrame -- enregistre la 1er frame de l'animation
end
local CF = platform.CFrame -- enregistre la frame actuelle de l'animation
local Rel = CF * lastCframe:inverse() --calcule la différence entre frame précédente et actuelle pour calculer le mouvement
lastCframe = platform.CFrame -- enregistre la frame actualle comme nouvelle "frame précedente"
root.CFrame = Rel * root.CFrame -- place le joueur à la position estimé de l'animation, grace au calcul
task.wait(0.001) --régule pour eviter les crashs
end
end
end
root.Touched:Connect(function(hit) --si on touche un objet
if CS:HasTag(hit,"ascenceur") then --si il a le tag qu'on veut
thread = task.spawn(delaglue(hit)) -- lancer la glue
end
end)
root.TouchEnded:Connect(function(hit) --si arrete de toucher un objet
if CS:HasTag(hit,"ascenceur") then --si il a le tag qu'on veut
task.cancel(thread) -- desactive la glue. Evite les bug si on retourne sur la plateforme + meilleurs performances
end
end)
Choisir sa vitesse hors script
On peut utiliser un attribut pour décider dans Roblox la vitesse de la plateforme (ce qui rend le script plus versatile)
Consulte la fiche des attributs pour voir comment les créer et change legèrement ton code:
CFrame = object.CFrame * CFrame.new(object:GetAttribute("vitesse"))