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! endend)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 jeulocal players = game:GetService("Players") -- liste de tous les joueurs en jeulocal control = false -- empèche la fonction de point de se lancer plusieurs foislocal 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 endend-- 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)endend