Propriétés et attributs

*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.

Rendre les expériences interactives souvent signifie manipuler les propriétés et les attributs des objets :

  • Les propriétés font partie de la classe d'objet.Par exemple, la propriété BasePart.Anchored contrôle la physique pour la partie.Dans une expérience sur piste et terrain, vous voudrez peut-être ancrer un disque ou un javelot dès qu'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 Plante utilise des attributs pour définir le prix d'achat des graines et la taille maximale de la plante que le pot peut contenir.

Ordre de réplication

Avant de commencer à récupérer et à manipuler des objets, vous devez avoir une compréhension de l'ordre de réplication.

Le moteur Roblox ne garantit pas l'ordre dans lequel les 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 du client, notamment les objets dans le Workspace.Pourtant, certains aspects du processus sont prévisibles :

  1. Le client charge le contenu de ReplicatedFirst, comme un écran de chargement, des ressources et des scripts.

  2. LocalScripts (et Scripts avec un RunContext de Client ) dans ReplicatedFirst lancer.Ces scripts peuvent obtenir en toute sécurité des objets de ReplicatedFirst sans utiliser WaitForChild() :


    -- Sûr
    local 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 n'ont peut-être pas encore été chargés:


    -- Pas sûr
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local PickupManager = require(ReplicatedStorage.PickupManager)

    Vous pouvez utiliser WaitForChild() dans ces scripts pour obtenir des objets d'autres services, mais le faire annule les avantages de l'utilisation de ReplicatedFirst .

  3. Le client continue de charger le reste de l'expérience.

  4. Lorsqu'il est terminé, l'événement game.Loaded se déclenche et game:IsLoaded() retourne vrai.

  5. LocalScripts dans Players.Player.PlayerScripts (copié de StarterPlayerScripts ) lancer, ainsi que le client Scripts dans ReplicatedStorage .Ces scripts peuvent obtenir en toute sécurité des objets de ReplicatedStorage sans utiliser WaitForChild().

  6. Le modèle du joueur Character apparaît dans l'expérience.

  7. LocalScripts dans Workspace.Character (copié de StarterCharacterScripts ) lancer.

Si votre expérience utilise le streaming d'instance ( Workspace.StreamingEnabled ), certains ou la plupart des objets peuvent ne pas avoir été chargés dans l'espace de travail, de sorte que l'utilisation de WaitForChild() pour accéder aux objets de l'espace de travail devient une mesure de sécurité encore plus importante.En particulier, voir Stream in et contrôles de streaming par modèle pour plus d'informations sur le chargement et le paramétrage du comportement de streaming.

Obtenir des objets

La première étape pour modifier les propriétés et les attributs d'un objet est d'obtenir une référence à l'objet.La solution la plus simple consiste à faire du script un enfant de l'objet dans l'Explorateur et à utiliser script.Parent pour référencer l'objet.

A script parented to a model in the Explorer.

local sign = script.Parent

La solution plus universelle consiste à obtenir l'objet d'un service en utilisant des méthodes comme Instance:FindFirstChild() ou Instance:WaitForChild() .

A Model within a Folder in ReplicatedStorage.

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local signsFolder = ReplicatedStorage:WaitForChild("Signs")
local sign = signsFolder:WaitForChild("InteractiveSign")

Modifier les propriétés

Les propriétés sont faciles d'accès — utilisez simplement un . après la référence à l'objet — bien que si vous travaillez avec un modèlisation, vous deviez choisir une partie individuelle plutôt que le modèle lui-même.

A Model within ReplicatedStorage.

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 de manière programmatique, la solution la plus courante consiste à les créer avec des valeurs par défaut dans l'interface utilisateur Studio.Vous pouvez ensuite utiliser des scripts pour modifier leurs valeurs en réponse aux actions du joueur.

A script within a folder in ReplicatedStorage.

Pour obtenir des informations sur la création d'attributs dans Studio, voir 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 l'attribut

local cabbage = script.Parent
cabbage:SetAttribute("Harvestable", true)

Si l'attribut n'existe pas déjà, cette méthode le crée.

Obtenir les valeurs d'attribut

Pour obtenir la valeur d'un attribut existant, appelez Instance:GetAttribute() sur l'instance.

Obtenir la valeur d'attribut

local cabbage = script.Parent
cabbage: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 renvoie un dictionnaire de paires clé-valeur.

Obtenir tous les attributs

local cabbage = script.Parent
local cabbageAttributes = cabbage:GetAttributes()
print(cabbageAttributes.GrowthRate) --> 2
for k, v in cabbageAttributes do
print(k, v)
end

Supprimer les attributs

Pour supprimer un attribut, définissez sa valeur à nil.

Supprimer l'attribut

local cabbage = script.Parent
cabbage:SetAttribute("GrowthRate", nil)

Détecter les changements

Il existe plusieurs façons d'écouter les modifications des propriétés et des attributs :

En raison de l'information minimale que ces événements et méthodes passent en tant que paramètres, tous sont une bonne option pour les fonctions anonymes, notamment Instance:GetPropertyChangedSignal() et Instance:GetAttributeChangedSignal().Pour en savoir plus sur les fonctions anonymes et le travail avec les événements, voir Événements.

Écouter les changements

local cabbage = script.Parent
-- Fonctions locales
local function onAnyPropertyChange(property)
-- Ignorer les modifications des attributs
if property ~= "Attributes" then
print(property) --> Nom
print(cabbage[property]) --> Chou1
end
end
local function onAnyAttributeChange(attribute)
print(attribute) --> Croissance, taux de croissance
print(cabbage:GetAttribute(attribute)) --> faux, 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) --> Chou1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- Feux modifiés et GetPropertyChangedSignal()
cabbage.Name = "Cabbage1"
-- Feux modifiés et attribut modifié
cabbage:SetAttribute("Grow", false)
-- Feux modifiés, AttributeChanged et GetAttributeChangedSignal()
cabbage:SetAttribute("GrowthRate", 3)