Collisions

Sur cette page tu trouveras comment faire:

  • Une collision depuis un script local Joueur
  • Une collision avec un script Serveur, pour un type d’objet

Script Local Joueur

Il s’agit de la version la plus simple d’un tel script, par contre elle à un inconvenient majeur:

La collision étant gérée par le joueur, a moins de la signaler au serveur, les autres joueurs ne la verront pas, ni ses conséquences.  Regarde la fiche Variable Serveur pour plus de détails sur comment gerer ça!

local humanoid = script.Parent:WaitForChild("Humanoid") --recupère le corps du joueur pour tester ce qui est touché
local CS = game:GetService("CollectionService") --liste des objets taggé du jeu
 
humanoid.Touched:Connect(function(hit) --si on touche un objet
    if CS:HasTag(hit,"TAG OBJET") then --si il a le tag qu'on veut
--Ici on met tous le code qui doit se faire quand on touche l'objet!
 
    end
end)

Script Serveur

Cette version est un peu plus compliqué car elle est géré par le serveur. Il doit donc detecter pour chaque objet si ce dernier est touché.

Par contre cela veut dire qu’on a pas à s’embetter avec l’envoi des infos! Le serveur sait déjà qu’il y a eu collision vu que c’est lui qui gère!

local CollectionService = game:GetService("CollectionService") -- liste de tous les objets en jeu
local players = game:GetService("Players") -- liste de tous les joueurs en jeu
local control = false -- empèche la fonction de point de se lancer plusieurs fois
local function ObjetTouchee(objet,other) -- la fonction de collision, objet c'est notre objet touché, et other c'est ce qu'il l'a touché
    local player = players:GetPlayerFromCharacter(other.Parent) -- on essai de récuperer les infos "joueur" de ce qui a touché la pièce
    if player and control == false then -- si c'est bien un joueur, et que la fonction ne s'était pas déjà lancée
        control = true --on active control pour empecher la fonction de se relancer avant d'avoir fini le reste
        -- ICI ON MET LE CODE QU'ON VEUT FAIRE QUAND ON TOUCHE. augmenter un score, ouvrir une porte etc...
        wait(0.1) -- on attends un peu, pour que tous le code ais le temps de se finir proprement
        control = false -- on désactive le control pour que la prochaine collision puisse avoir lieu
    end
end
-- constament en train de tourner pour vérifier si un objet est touché
for _, object in pairs(CollectionService:GetTagged("TAG OBJET")) do
    if object:IsA("BasePart") then -- si on touche un objet de base (et pas un sous-morceau)
        object.Touched:Connect(function(otherPart)ObjetTouchee(object,otherPart) --lancer la fonction de collision écrite au dessus
        end)end
end
Retour en haut