Fazer experiências interativas frequentemente significa manipular propriedades e atributos de objetos:
Propriedades fazem parte da classe de objeto.Por exemplo, os controles de propriedade BasePart.Anchored controlam a física para a peça.Em uma experiência de pista e campo, você pode querer ancorar um disco ou jabalina no momento em que ele pousa para que os jogadores tenham um indicador visual de quão longe ele viajou.
Atributos são essencialmente propriedades personalizadas que você define.Por exemplo, o projeto de referência Planta usa atributos para definir o preço de compra das sementes e o tamanho máximo da planta que um vaso pode conter.
Ordem de replicação
Antes de começar a recuperar e manipular objetos, você deve ter uma compreensão da ordem de replicação.
O motor do Roblox não garante a ordem em que os objetos são replicados do servidor para o cliente, o que torna o método Instance:WaitForChild() essencial para acessar objetos em scripts de cliente, especialmente objetos no Workspace.Ainda assim, alguns aspectos do processo são previsíveis:
O cliente carrega o conteúdo de ReplicatedFirst, como uma tela de carregamento, recursos e scripts.
LocalScripts (e Scripts com um RunContext de Client ) na executarReplicatedFirst .Esses scripts podem obter objetos com segurança de ReplicatedFirst sem usar WaitForChild():
-- Seguralocal ReplicatedFirst = game:GetService("ReplicatedFirst")local LoadingScreen = require(ReplicatedFirst.LoadingScreen)Esses scripts não podem obter objetos de outros serviços de forma segura, porque eles podem não ter sido carregados ainda:
-- Não segurolocal ReplicatedStorage = game:GetService("ReplicatedStorage")local PickupManager = require(ReplicatedStorage.PickupManager)Você pode usar em esses scripts para obter objetos de outros serviços, mas fazendo isso anula os benefícios de usar .
O cliente continua carregando o resto da experiência.
Quando terminar, o evento game.Loaded ocorre e game:IsLoaded() retorna verdadeiro.
LocalScripts em Players.Player.PlayerScripts (copiado de StarterPlayerScripts ) executar, bem como o cliente Scripts em ReplicatedStorage .Esses scripts podem obter objetos com segurança de ReplicatedStorage sem usar WaitForChild().
O modelo do jogador Character aparece na experiência.
LocalScripts em Workspace.Character (copiado de StarterCharacterScripts ) executar.
Se a sua experiência usa streaming de instância ( Workspace.StreamingEnabled ), alguns ou a maioria dos objetos pode não ter sido carregada no espaço de trabalho, então usar WaitForChild() para acessar objetos do espaço de trabalho se torna uma medida de segurança ainda mais importante.Em particular, veja Stream in e controles de streaming por modelo adicionais para informações adicionais sobre carregamento e ajuste do comportamento de streaming.
Obter objetos
O primeiro passo para modificar propriedades e atributos de objetos é obter uma referência ao Objeto.A solução mais simples é fazer do script um filho do objeto no Explorer e usar script.Parent para referenciar o Objeto.

local sign = script.Parent
A solução mais universal é obter o objeto de um serviço usando métodos como Instance:FindFirstChild() ou Instance:WaitForChild() .

local ReplicatedStorage = game:GetService("ReplicatedStorage")local signsFolder = ReplicatedStorage:WaitForChild("Signs")local sign = signsFolder:WaitForChild("InteractiveSign")
Modificar propriedades
As propriedades são fáceis de acessar — basta usar um . após a referência do objeto — embora se você estiver trabalhando com um modelo, talvez precise escolher uma parte individual em vez do próprio modelo.

local ReplicatedStorage = game:GetService("ReplicatedStorage")local chair = ReplicatedStorage:WaitForChild("Chair")chair.LeftArmRest.Size = Vector3.new(10, 1, 10)
Crie atributos
Embora você possa criar atributos programaticamente, a solução mais comum é criá-los com valores padrão na interface do usuário do Studio.Então você pode usar scripts para modificar seus valores em resposta às ações do jogador.

Para obter informações sobre a criação de atributos no Studio, veja Atributos de instância.
Defina os atributos
Para modificar o valor de um atributo, chame Instance:SetAttribute() com um nome e um valor.
Criar ou Modificar Atributo
local cabbage = script.Parentcabbage:SetAttribute("Harvestable", true)
Se o atributo ainda não existe, este método cria-o.
Obter valores de atributo
Para obter o valor de um atributo existente, chame Instance:GetAttribute() na instância.
Obter o valor do atributo
local cabbage = script.Parentcabbage:SetAttribute("Harvestable", true)local isHarvestable = cabbage:GetAttribute("Harvestable")print(isHarvestable) --> true
Da mesma forma, você pode obter todos os atributos chamando Instance:GetAttributes(). Este método retorna um dicionário de pares de chave-valor.
Obtenha todos os atributos
local cabbage = script.Parentlocal cabbageAttributes = cabbage:GetAttributes()print(cabbageAttributes.GrowthRate) --> 2for k, v in cabbageAttributes doprint(k, v)end
Atributos de exclusão
Para excluir um atributo, defina seu valor para nil .
Excluir atributo
local cabbage = script.Parentcabbage:SetAttribute("GrowthRate", nil)
Detectar alterações
Existem várias maneiras de ouvir mudanças em propriedades e atributos:
- A lista de eventos Instance.AttributeChanged ouve mudanças em qualquer atributo e passa o nome do atributo modificado como um parâmetro.
- O método Instance:GetPropertyChangedSignal() deixa você ouvir mudanças em uma propriedade e não passa parâmetros.
- O método Instance:GetAttributeChangedSignal() deixa você ouvir mudanças em um atributo e não passa parâmetros.
Devido às informações mínimas que esses eventos e métodos passam como parâmetros, todos eles são uma boa opção para funções anônimas, especialmente Instance:GetPropertyChangedSignal() e Instance:GetAttributeChangedSignal().Para aprender mais sobre funções anônimas e trabalhar com eventos, veja Eventos.
Ouça as mudanças
local cabbage = script.Parent
-- Funções locais
local function onAnyPropertyChange(property)
-- Ignorar alterações em atributos
if property ~= "Attributes" then
print(property) -->Nome
print(cabbage[property]) --> Repolho1
end
end
local function onAnyAttributeChange(attribute)
print(attribute) --> Crescer, Taxa de Crescimento
print(cabbage:GetAttribute(attribute)) --> falso, 3
end
-- Ouça mudanças e conecte-se a funções locais
cabbage.Changed:Connect(onAnyPropertyChange)
cabbage.AttributeChanged:Connect(onAnyAttributeChange)
-- Ouça mudanças e conecte-se a funções anônimas
cabbage:GetPropertyChangedSignal("Name"):Connect(function()
print(cabbage.Name) --> Repolho1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- Incêndios Alterados e GetPropertyChangedSignal()
cabbage.Name = "Cabbage1"
-- Incêndios Alterados e Atributo Mudado
cabbage:SetAttribute("Grow", false)
-- Incêndios alterados, AttributeChanged e GetAttributeChangedSignal()
cabbage:SetAttribute("GrowthRate", 3)