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

Pour s’accrocher à la plateforme, on va créer un seat. Le player, assis, sera embarqué par la plateforme jusqu’a ce qu’il se lève. Cette méthode ne necessite pas de code, par contre si il y a beaucoup de joueur tous ne pourront pas s’accrocher.

Par contre pour que cela fonctionne il faut que le seat soit attaché à la plateforme par un « Weld » ou « Soudure » et qu’il ne soit pas « anchor » (ancré)
 
On trouve l’outil Soudure dans l’onglet « Modèle »

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"))
Retour en haut