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:
El cliente carga los contenidos de ReplicatedFirst, como una pantalla de carga, recursos y scripts.
Class.LocalScript|LocalScripts (y Scripts con un RunContext de 0> Enums.RunContext.Client|Client0>) en LocalScripts3> ejecutar. Estos scripts pueden obtener objet
-- Segurolocal 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 segurolocal 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() .
El cliente continúa cargando el resto de la experiencia.
Cuando termina, el evento game.Loaded y Class.DataModel:IsLoaded()|game:IsLoaded() devuelve verdadero.
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
El modelo Character del jugador se genera en la experiencia.
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.
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() .
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.
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.
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.Parentcabbage: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.Parentcabbage: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.Parentlocal cabbageAttributes = cabbage:GetAttributes()print(cabbageAttributes.GrowthRate) --> 2for k, v in cabbageAttributes doprint(k, v)end
Eliminando atributos
Para eliminar un atributo, establece su valor en nulo.
Eliminar atributo
local cabbage = script.Parentcabbage: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)