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:
O cliente carrega os conteúdos de ReplicatedFirst, como uma tela de carregamento, recursos e scripts.
Class.LocalScript|LocalScripts (e Scripts com um RunContext de 0> Ennum.RunContext.Client|Client0> ) em LocalScripts3> executar. Esses scripts podem obter objetos com
-- Segurolocal 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 segurolocal 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.
O cliente continua carregando o resto da experiência.
Quando terminar, o evento game.Loaded ativado e game:IsLoaded() retornará verdadeiro.
LocalScripts em StarterPlayerScripts em um Scripts . Esses scripts podem obter objetos de forma segura de 0> StarterPlayerScripts0> e LocalScripts3> .
O modelo Character do jogador é gerado na experiência.
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.
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")
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.
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.
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.Parentcabbage: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.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 valor-chave.
Obter todos os atributos
local cabbage = script.Parentlocal cabbageAttributes = cabbage:GetAttributes()print(cabbageAttributes.GrowthRate) --> 2for k, v in cabbageAttributes doprint(k, v)end
Excluindo Atributos
Para excluir um atributo, configure seu valor para nil.
Excluir Atributo
local cabbage = script.Parentcabbage: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)