Rendre les jeux interactifs signifie souvent manipuler les propriétés et attributs des objets :
Les propriétés font partie de la classe de l'objet. Par exemple, la propriété BasePart.Anchored contrôle la physique de la pièce. Dans un jeu d'athlétisme, vous pourriez vouloir ancrer un disque ou un javelot au moment où il atterrit afin que les joueurs aient un indicateur visuel de la distance parcourue.
Les attributs sont essentiellement des propriétés personnalisées que vous définissez. Par exemple, le projet de référence Plant utilise des attributs pour définir le prix d'achat des graines et la taille maximale qu'un pot peut contenir.
Ordre de réplication
Avant de commencer à récupérer et à manipuler des objets, vous devez comprendre l'ordre de réplication.
Le moteur Roblox ne garantit pas l'ordre dans lequel les objets (et les changements aux objets) sont répliqués du serveur au client, ce qui rend la méthode Instance:WaitForChild() essentielle pour accéder aux objets dans les scripts client, en particulier les objets dans Workspace.
Par exemple, si un script serveur modifie une propriété d'une instance dans l'espace de travail puis appelle RemoteEvent:FireAllClients(), le changement de propriété peut se répliquer au client avant ou après que RemoteEvent.OnClientEvent se déclenche. Utilisez les méthodes et événements disponibles pour détecter les changements plutôt que de supposer qu'un changement a été répliqué. Les changements du même type, tels que deux changements d'attributs, arrivent généralement bien dans l'ordre.
Lorsque les clients lancent un jeu pour la première fois, certains aspects de la réplication et de l'exécution des scripts sont prévisibles :
Le client charge le contenu de ReplicatedFirst, tel qu'un écran de chargement, des actifs et des scripts.
Les LocalScripts (et Scripts avec un RunContext de Client) dans ReplicatedFirst s'exécutent. Ces scripts peuvent obtenir en toute sécurité des objets de ReplicatedFirst sans utiliser Instance:WaitForChild() :
-- Sûrlocal ReplicatedFirst = game:GetService("ReplicatedFirst")local LoadingScreen = require(ReplicatedFirst.LoadingScreen)Ces scripts ne peuvent pas obtenir en toute sécurité des objets d'autres services, car ils pourraient ne pas encore être chargés :
-- Pas sûrlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local PickupManager = require(ReplicatedStorage.PickupManager)Vous pouvez utiliser WaitForChild() dans ces scripts pour obtenir des objets d'autres services, mais cela annule les avantages de l'utilisation de ReplicatedFirst.
Le client continue de charger le reste du jeu.
Lorsqu'il a terminé, l'événement Loaded se déclenche et IsLoaded() retourne vrai.
Les LocalScripts dans Players.[Player].PlayerScripts (copiés depuis StarterPlayerScripts) s'exécutent, ainsi que les clients Scripts dans ReplicatedStorage. Ces scripts peuvent obtenir en toute sécurité des objets de ReplicatedStorage sans utiliser WaitForChild().
Le modèle Character du joueur apparaît dans le jeu.
Les LocalScripts dans Workspace.[Character] (copiés depuis StarterCharacterScripts) s'exécutent.
Si votre jeu utilise le streaming d'instance (Workspace.StreamingEnabled), certains ou la plupart des objets pourraient ne pas avoir été chargés dans l'espace de travail, donc utiliser WaitForChild() pour accéder aux objets de l'espace de travail devient une mesure de sécurité encore plus importante. En particulier, voyez stream in et contrôles de streaming par modèle pour plus d'informations sur le chargement et le réglage du comportement de streaming.
Obtenir des objets
La première étape pour modifier les propriétés et attributs des objets est d'obtenir une référence à l'objet. La solution la plus simple est de faire en sorte que le script soit un enfant de l'objet dans l'Explorateur et d'utiliser script.Parent pour référencer l'objet.

local sign = script.Parent
La solution plus universelle est d'obtenir l'objet depuis un service en utilisant des méthodes comme Instance:FindFirstChild() ou Instance:WaitForChild().

local ReplicatedStorage = game:GetService("ReplicatedStorage")local signsFolder = ReplicatedStorage:WaitForChild("Signs")local sign = signsFolder:WaitForChild("InteractiveSign")
Modifier des propriétés
Les propriétés sont faciles d'accès — utilisez simplement un . après la référence de l'objet — bien que si vous travaillez avec un modèle, vous pourriez avoir besoin de choisir une pièce individuelle plutôt que le modèle lui-même.

local ReplicatedStorage = game:GetService("ReplicatedStorage")local chair = ReplicatedStorage:WaitForChild("Chair")chair.LeftArmRest.Size = Vector3.new(10, 1, 10)
Créer des attributs
Bien que vous puissiez créer des attributs par programme, la solution plus courante est de les créer avec des valeurs par défaut dans l'interface utilisateur de Studio. Ensuite, vous pouvez utiliser des scripts pour modifier leurs valeurs en réponse aux actions des joueurs.

Pour des informations sur la création d'attributs dans Studio, consultez les attributs d'instance.
Définir des attributs
Pour modifier la valeur d'un attribut, appelez Instance:SetAttribute() avec un nom et une valeur.
Créer ou Modifier un Attributlocal cabbage = script.Parentcabbage:SetAttribute("Harvestable", true)
Si l'attribut n'existe pas déjà, cette méthode le crée.
Obtenir les valeurs d'attributs
Pour obtenir la valeur d'un attribut existant, appelez Instance:GetAttribute() sur l'instance.
Obtenir la Valeur de l'Attributlocal cabbage = script.Parentcabbage:SetAttribute("Harvestable", true)local isHarvestable = cabbage:GetAttribute("Harvestable")print(isHarvestable) --> true
De même, vous pouvez obtenir tous les attributs en appelant Instance:GetAttributes(). Cette méthode retourne un dictionnaire de paires clé-valeur.
Obtenir Tous les Attributslocal cabbage = script.Parentlocal cabbageAttributes = cabbage:GetAttributes()print(cabbageAttributes.GrowthRate) --> 2for k, v in cabbageAttributes doprint(k, v)end
Supprimer des attributs
Pour supprimer un attribut, définissez sa valeur sur nil.
Supprimer un Attributlocal cabbage = script.Parentcabbage:SetAttribute("GrowthRate", nil)
Détecter des changements
Il existe plusieurs façons d'écouter les changements de propriétés et d'attributs :
- L'événement Instance.AttributeChanged écoute les changements d'attributs et passe le nom de l'attribut modifié en paramètre.
- La méthode Instance:GetPropertyChangedSignal() vous permet d'écouter les changements d'une propriété et ne passe aucun paramètre.
- La méthode Instance:GetAttributeChangedSignal() vous permet d'écouter les changements d'un attribut et ne passe aucun paramètre.
En raison des informations minimales que ces événements et méthodes passent en tant que paramètres, tous sont bien adaptés aux fonctions anonymes, en particulier Instance:GetPropertyChangedSignal() et Instance:GetAttributeChangedSignal(). Pour en savoir plus sur les fonctions anonymes et la gestion des événements, consultez Événements.
Écouter les Changements
local cabbage = script.Parent
-- Fonctions locales
local function onAnyPropertyChange(property)
-- Ignorer les changements d'attributs
if property ~= "Attributes" then
print(property) --> Nom
print(cabbage[property]) --> Cabbage1
end
end
local function onAnyAttributeChange(attribute)
print(attribute) --> Grow, GrowthRate
print(cabbage:GetAttribute(attribute)) --> false, 3
end
-- Écouter les changements et se connecter aux fonctions locales
cabbage.Changed:Connect(onAnyPropertyChange)
cabbage.AttributeChanged:Connect(onAnyAttributeChange)
-- Écouter les changements et se connecter à des fonctions anonymes
cabbage:GetPropertyChangedSignal("Name"):Connect(function()
print(cabbage.Name) --> Cabbage1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- Déclenche Changed et GetPropertyChangedSignal()
cabbage.Name = "Cabbage1"
-- Déclenche Changed et AttributeChanged
cabbage:SetAttribute("Grow", false)
-- Déclenche Changed, AttributeChanged et GetAttributeChangedSignal()
cabbage:SetAttribute("GrowthRate", 3)