Propriedades e Atributos

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.

Criar experiências interativas geralmente significa manipular propriedades e atributos de objetos:

  • Propriedades são parte da classe de objetos. Por exemplo, a propriedade BasePart.Anchored controla a física para a peça. Em uma experiência de rastreamento e campo, você pode ancorar um discíduz ou jabutina instantaneamente para que os jogadores tenham um indicador visual de quão longe ela viajou.

  • Os atributos são 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 pote 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 mecanismo 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 na Workspace. Ainda assim, alguns aspectos do processo são previsíveis:

  1. O cliente carrega os conteúdos de ReplicatedFirst, como uma tela de carregamento, recursos e scripts.

  2. Class.LocalScript|LocalScripts (e Scripts com um RunContext de 0> Ennum.RunContext.Client|Client0> ) em LocalScripts3> executar. Esses scripts podem obter objetos com


-- Seguro
local ReplicatedFirst = game:GetService("ReplicatedFirst")
local LoadingScreen = require(ReplicatedFirst.LoadingScreen)

Esses scripts não podem seguramente obter objetos de outros serviços, porque eles ainda não foram carregados:


-- Não seguro
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local PickupManager = require(ReplicatedStorage.PickupManager)

Você pode usar WaitForChild() nesses scripts para obter objetos de outros serviços, mas fazendo isso muito negativa os benefícios de usar ReplicatedFirst.

  1. O cliente continua carregando o resto da experiência.

  2. Quando terminar, o evento game.Loaded ativado e game:IsLoaded() retornará verdadeiro.

  3. LocalScripts em StarterPlayerScripts em um Scripts . Esses scripts podem obter objetos de forma segura de 0> StarterPlayerScripts0> e LocalScripts3> .

  4. O modelo Character do jogador é gerado na experiência.

  5. LocalScripts em StarterCharacterScripts executar.

Se sua experiência usar streaming de instância ( Workspace.StreamingEnabled ) alguns ou todos os objetos podem não ter sido carregados para o 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 1> Streaming In

Obtendo 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 uma filha do objeto no Explorer e usar script.Parent para referenciar o Objeto.

A script parented to a model in the Explorer.

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().

A Model within a Folder in ReplicatedStorage.

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

Modificando Propriedades

Propriedades são claras para acessar - apenas use um . depois da referência do objeto - embora se você estiver trabalhando com um modelo, você pode precisar escolher uma parte individual em vez do modelo em si.

A Model within ReplicatedStorage.

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local chair = ReplicatedStorage:WaitForChild("Chair")
chair.LeftArmRest.Size = Vector3.new(10, 1, 10)

Criando 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.

A script within a folder in ReplicatedStorage.

Para obter informações sobre a criação de atributos no Studio, see Atributos da Instância .

Configurando Atributos

Para modificar o valor de um atributo, chame Instance:SetAttribute() com um nome e um valor.

Criar ou Modificar Atributo

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

Se o atributo não já existe, este método cria-o.

Obtendo Valores de Atributo

Para obter o valor de um atributo existente, chame Instance:GetAttribute() na instância.

Obter Valor de Atributo

local cabbage = script.Parent
cabbage: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 valor-chave.

Obter todos os atributos

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

Excluindo Atributos

Para excluir um atributo, configure seu valor para nil.

Excluir Atributo

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

Detectando Alterações

Existem várias maneiras de ouvir por mudanças em propriedades e atributos:

  • O evento Instance.Changed ouve alterações em qualquer propriedade (incluindo atributos) e passa o nome da propriedade alterada como um parâmetro.

  • O evento Instance.AttributeChanged ouve as alterações em qualquer atributo e passa o nome do atributo alterado como um parâmetro.

  • O método Instance:GetPropertyChangedSignal() permite que você ouça por alterações em uma propriedade e não passe parâmetros.

  • O método Instance:GetAttributeChangedSignal() permite que você ouça por alterações em um atributo e não passe 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 por 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]) --> Cabbage1
end
end
local function onAnyAttributeChange(attribute)
print(attribute) --> Crescer, GrowthRate
print(cabbage:GetAttribute(attribute)) --> falso, 3
end
-- Ouça por mudanças e se conecte a funções locais
cabbage.Changed:Connect(onAnyPropertyChange)
cabbage.AttributeChanged:Connect(onAnyAttributeChange)
-- Ouça por mudanças e se conecte a funções anônimas
cabbage:GetPropertyChangedSignal("Name"):Connect(function()
print(cabbage.Name) --> Cabbage1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- Fires Alterados e GetPropertyChangedSignal()
cabbage.Name = "Cabbage1"
-- Fires Changed e AttributeChanged
cabbage:SetAttribute("Grow", false)
-- Fires Changed, AttributeChanged e GetAttributeChangedSignal()
cabbage:SetAttribute("GrowthRate", 3)