Propiedades y atributos

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

Hacer que las experiencias interactivas a menudo signifique manipular propiedades y atributos de objetos:

  • Las propiedades son parte de la clase de objetos. Por ejemplo, la propiedad BasePart.Anchored controla la física para la parte. En una experiencia de pista y campo, puede que quieras anclar un descúido o una jabalina el instantáneo que aterriza para que los jugadores tengan un indicador visual de cuánto viajó.

  • Los atributos son esencialmente propiedades personalizadas que defines. Por ejemplo, el proyecto de referencia Planta usa atributos para establecer el precio de compra de las semillas y el tamaño máximo de la planta que puede contener un frasco.

Orden de Replicación

Antes de comenzar a recuperar y manipular objetos, debes tener una comprensión de la orden de replicación.

El motor de Roblox no garantiza el orden en que se replican los objetos del servidor al cliente, lo que hace que el método Instance:WaitForChild() sea esencial para acceder a los objetos en los scripts del cliente, especialmente los objetos en el Workspace . Sin embargo, algunos aspectos del proceso son predecibles:

  1. El cliente carga los contenidos de ReplicatedFirst, como una pantalla de carga, recursos y scripts.

  2. Class.LocalScript|LocalScripts (y Scripts con un RunContext de 0> Enums.RunContext.Client|Client0>) en LocalScripts3> ejecutar. Estos scripts pueden obtener objet


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

Estos scripts no pueden obtener objetos de otros servicios, porque aún no se han cargado:


-- No es seguro
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local PickupManager = require(ReplicatedStorage.PickupManager)

Puede usar WaitForChild() en estos scripts para obtener objetos de otros servicios, pero hacerlo en gran medida niega los beneficios de usar WaitForChild() .

  1. El cliente continúa cargando el resto de la experiencia.

  2. Cuando termina, el evento game.Loaded y Class.DataModel:IsLoaded()|game:IsLoaded() devuelve verdadero.

  3. LocalScripts en StarterPlayerScripts ejecutar, así como cliente Scripts en 0> Class.ReplicatedStorage0> . Estos scripts pueden obtener objetos con seguridad de 3> StarterPlayerScripts3> y LocalScripts6> sin usar

  4. El modelo Character del jugador se genera en la experiencia.

  5. LocalScripts en StarterCharacterScripts ejecutar.

Si tu experiencia usa streaming de instancia ( Workspace.StreamingEnabled ) algunos o todos los objetos pueden no haberse cargado en el espacio de trabajo, por lo que usar WaitForChild() para acceder a los objetos del espacio de trabajo se convierte en una medida de seguridad aún más importante. En particular, véase 1> Streaming In

Obtener objetos

El primer paso para modificar propiedades y atributos del objeto es obtener una referencia al objeto. La solución más sencilla es hacer que el script sea un hijo del objeto en el Explorador y usar script.Parent para hacer una referencia al objeto.

A script parented to a model in the Explorer.

local sign = script.Parent

La solución más universal es obtener el objeto de un servicio usando métodos como Instance:FindFirstChild() o 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 Propiedades

Las propiedades son fáciles de acceder, solo usa un . después de la referencia del objeto — sin embargo, si estás trabajando con un aplicación de modelado, es posible que deba elegir una parte individual en lugar del modelo en sí mismo.

A Model within ReplicatedStorage.

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

Creando Atributos

Aunque puede crear atributos programáticamente, la solución más común es crearlos con valores predeterminados en la interfaz de usuario de Studio. Luego puede usar scripts para modificar sus valores en respuesta a las acciones del jugador.

A script within a folder in ReplicatedStorage.

Para obtener información sobre la creación de atributos en Studio, see Atributos de la instancia .

Configurando Atributos

Para modificar el valor de un atributo, llama a Instance:SetAttribute() con un nombre y un valor.

Crear o Modificar Atributo

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

Si el atributo no existe, este método lo crea.

Obteniendo valores de atributo

Para obtener el valor de un atributo existente, llama a Instance:GetAttribute() en la instancia.

Obtener el valor de atributo

local cabbage = script.Parent
cabbage:SetAttribute("Harvestable", true)
local isHarvestable = cabbage:GetAttribute("Harvestable")
print(isHarvestable) --> true

Del mismo modo, puede obtener todos los atributos al llamar Instance:GetAttributes() . Este método devuelve un diccionario de pares de valores clave.

Obtener todos los atributos

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

Eliminando atributos

Para eliminar un atributo, establece su valor en nulo.

Eliminar atributo

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

Detectando cambios

Hay varias formas de escuchar las actualizaciones de propiedades y atributos:

  • La lista de eventos Instance.Changed escucha cambios en cualquier propiedad (incluidos los atributos) y pasa el nombre de la propiedad cambiada como parámetro.

  • La lista de eventos Instance.AttributeChanged escucha cambios en cualquier atributo y pasa el nombre del atributo cambiado como parámetro.

  • El método Instance:GetPropertyChangedSignal() le permite escuchar cambios en una propiedad y no pasa parámetros.

  • El método Instance:GetAttributeChangedSignal() le permite escuchar cambios en un atributo y no pasa parámetros.

Debido a la información mínima que estos eventos y métodos se pasan como parámetros, todos ellos son adecuados para funciones anónimas, particularmente Instance:GetPropertyChangedSignal() y Instance:GetAttributeChangedSignal() . Para aprender más sobre funciones anónimas y trabajar con eventos, consulte Eventos .

Escuchar por cambios

local cabbage = script.Parent
-- Funciones locales
local function onAnyPropertyChange(property)
-- Ignorar cambios a atributos
if property ~= "Attributes" then
print(property) --> Nombre
print(cabbage[property]) --> Cabbage1
end
end
local function onAnyAttributeChange(attribute)
print(attribute) --> Crecimiento, tasa de crecimiento
print(cabbage:GetAttribute(attribute)) --> falso, 3
end
-- Escúchame para obtener cambios y conectar a funciones locales
cabbage.Changed:Connect(onAnyPropertyChange)
cabbage.AttributeChanged:Connect(onAnyAttributeChange)
-- Escúchame para cambios y conéctate a funciones anónimas
cabbage:GetPropertyChangedSignal("Name"):Connect(function()
print(cabbage.Name) --> Cabbage1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- Dispara cambiado y obtener Propiedad cambiado señal
cabbage.Name = "Cabbage1"
-- Fires Changed y AttributeChanged
cabbage:SetAttribute("Grow", false)
-- Fires Changed, AttributeChanged y GetAttributeChangedSignal()
cabbage:SetAttribute("GrowthRate", 3)