Los jugadores a menudo disfrutan sentirse parte de la construcción del espacio en el que se encuentran. El módulo SurfaceArt developer module permite a los jugadores dejar literalmente su huella en una experiencia.
Uso del Módulo
Instalación
Para usar el módulo SurfaceArt en una experiencia:
Desde el menú Ventana de Studio o la barra de herramientas de la pestaña Inicio, abre el Toolbox y selecciona la pestaña Creator Store.

Asegúrate de que la clasificación Modelos esté seleccionada, luego haz clic en el botón Ver Todo para Categorías.

Localiza y haz clic en el mosaico Paquetes.
Localiza el módulo Arte de Superficie y haz clic en él, o arrástralo y suéltalo en la vista 3D.

En la ventana Explorer, mueve todo el modelo SurfaceArt a ReplicatedStorage. Al ejecutar la experiencia, el módulo comenzará a funcionar.
Posicionando el Lienzo
El módulo viene con un modelo SurfaceCanvas que puedes posicionar en el mundo 3D. Este modelo es con el que los jugadores interactuarán para colocar arte en su superficie.
Localiza la malla SurfaceCanvas dentro de la carpeta Workspace de la carpeta principal del módulo.

Mueve el modelo a la jerarquía de Workspace de nivel superior y colócalo donde desees.

Al publicar/ejecutar una sesión de prueba, los jugadores podrán interactuar con el objeto a través de un ProximityPrompt y colocar arte en la superficie definida.

Cambio de la Cara del Lienzo
Bajo el capó, el módulo utiliza un SurfaceGui para mostrar elementos de arte. Para configurar sobre qué superficie aparece el arte:
Selecciona la malla SurfaceCanvas.
En la parte inferior de la ventana Propiedades, localiza el atributo SurfaceCanvasFace con un valor predeterminado de Derecha.

Haz clic en el atributo e ingresa uno de los seis valores que describen un Enum.NormalId.
| Valor del Atributo | ID Normal Correspondiente |
|---|---|
| Frente | Enum.NormalId.Front |
| Atrás | Enum.NormalId.Back |
| Derecha | Enum.NormalId.Right |
| Izquierda | Enum.NormalId.Left |
| Arriba | Enum.NormalId.Top |
| Abajo | Enum.NormalId.Bottom |
Uso de Activos de Arte Personalizados
Para adaptarse mejor al tema de tu experiencia, puedes usar tu propio conjunto de activos personalizados en lugar de los predeterminados. Esto se puede hacer a través de la función configurar, llamada desde un Script en ServerScriptService.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)local customAssets = {CustomAsset1 = {name = "Activo Personalizado 1",assetId = "rbxassetid://7322508294",},CustomAsset2 = {name = "Activo Personalizado 2",assetId = "rbxassetid://7322547665",},}SurfaceArt.configure({assets = customAssets,})
Limpiar Todos los Lienzos
Para eliminar todo el arte existente de todos los lienzos en el mundo, llama a la función removeAllArt desde un Script.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.removeAllArt()
Mostrar Efectos Personalizados
Puede haber casos en los que desees incluir efectos visuales adicionales al colocar una obra de arte. Este módulo expone un evento llamado artChanged en el cliente al que puedes conectar y agregar tu propia lógica.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
local function createParticleEmitter(canvas, position)
local attachment = Instance.new("Attachment")
attachment.Position = canvas.CFrame:PointToObjectSpace(position)
attachment.Axis = Vector3.new(0, 0, 1)
attachment.SecondaryAxis = Vector3.new(1, 0, 0)
attachment.Parent = canvas
local particleEmitter = Instance.new("ParticleEmitter")
particleEmitter.Speed = NumberRange.new(50)
particleEmitter.Rate = 50
particleEmitter.Color = ColorSequence.new(Color3.fromRGB(128, 254, 7))
particleEmitter.SpreadAngle = Vector2.new(35, 35)
particleEmitter.Parent = attachment
return attachment
end
SurfaceArt.artChanged:Connect(function(canvas, spot, spotPosition, artId, ownerId)
if artId then
-- Mostrar algunas chispas durante 3 segundos
task.spawn(function()
local emitterAttachment = createParticleEmitter(canvas, spotPosition)
task.wait(3)
emitterAttachment:Destroy()
end)
end
end)
Referencia de API
Tipos
SurfaceArtAsset
Las imágenes que se usarán como arte para el lienzo se representan mediante una tabla con dos valores.
| Clave | Descripción |
|---|---|
| name | Nombre de visualización de metadatos. |
| assetId | ID de activo de la imagen a incluir. |
Funciones
configurar
configure(config: table)
Sobrescribe las opciones de configuración predeterminadas a través de las siguientes claves/valores en la tabla config. Esta función solo puede ser llamada desde un Script.
| Clave | Descripción | Predeterminado |
|---|---|---|
| enabled | Activa o desactiva la funcionalidad del módulo. | true |
| assets | Lista de tipos de SurfaceArtAsset. | (ver código debajo) |
| quotaPerPlayer | Número máximo de piezas de arte que puede colocar cada jugador. | 2 |
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.configure({quotaPerPlayer = 4,promptKeyCode = Enum.KeyCode.T,promptMaxActivationDistance = 8,})
getCanvases
getCanvases(): table
Devuelve todos los lienzos etiquetados con la etiqueta SurfaceCanvas.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)local canvases = SurfaceArt.getCanvases()
placeArt
Coloca una pieza de arte programáticamente en nombre de un jugador. Ten en cuenta que el objeto canvas debe estar etiquetado con la etiqueta SurfaceCanvas cuando se inicializa el servidor. Se recomienda usar esto solo con un lienzo devuelto desde getCanvases.
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
local remoteEvent = ReplicatedStorage:WaitForChild("SurfaceArtRemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player)
-- Colocar el premio Bloxy de los activos de arte predeterminados en el primer lienzo
local canvases = SurfaceArt.getCanvases()
SurfaceArt.placeArt(player, canvases[1], "BloxyAward")
end)
removeAllArt
removeAllArt()
Elimina todas las obras de arte de todas las superficies.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.removeAllArt()
Eventos
artChanged
Se activa cuando se cambia una obra de arte en un lugar particular de un lienzo. Cuando se elimina una obra de arte, artId será nil. Ten en cuenta que se pasa un valor Vector3 como tercer parámetro al controlador de eventos para que puedas posicionar un efecto personalizado en la posición exacta donde se coloca la obra de arte. Este evento solo puede ser conectado en un LocalScript.
| Parámetros | |
|---|---|
| canvas: BasePart | Lienzo sobre el cual se cambió la obra de arte. |
| spot: Frame | Frame interno que contiene la obra de arte ImageLabel. |
| spotPosition: Vector3 | Posición exacta donde se colocó la obra de arte. |
| artId: string | ID de activo de la nueva obra de arte. |
| ownerUserId: number | UserId del jugador que colocó el arte. |
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.artChanged:Connect(function(canvas, spot, spotPosition, artId, ownerId)
print("Arte colocado en:", spotPosition)
print("ID del activo de arte:", artId)
print("Arte colocado por:", ownerId)
end)
promptShown
Se activa cuando se muestra un aviso de interacción con el lienzo a un jugador. La función conectada recibe el lienzo sobre el cual se está mostrando el aviso. Este evento solo puede ser conectado en un LocalScript.
| Parámetros | |
|---|---|
| canvas: BasePart | Lienzo sobre el cual se muestra el aviso. |
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.promptShown:Connect(function(canvas)
print(Players.LocalPlayer, canvas)
end)
promptHidden
Se activa cuando se oculta un aviso de interacción con el lienzo. La función conectada recibe el lienzo sobre el cual se estaba mostrando el aviso. Este evento solo puede ser conectado en un LocalScript.
| Parámetros | |
|---|---|
| canvas: BasePart | Lienzo sobre el cual se estaba mostrando el aviso. |
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.promptClosed:Connect(function(canvas)
print(Players.LocalPlayer, canvas)
end)
selectorShown
Se activa cuando se muestra la interfaz de usuario del selector de arte de superficie a un jugador. Este evento solo puede ser conectado en un LocalScript.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.selectorShown:Connect(function()
print(Players.LocalPlayer, "abrió el selector de arte de superficie")
end)
selectorHidden
Se activa cuando se oculta la interfaz de usuario del selector de arte de superficie para un jugador. Este evento solo puede ser conectado en un LocalScript.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.selectorHidden:Connect(function()
print(Players.LocalPlayer, "cerró el selector de arte de superficie")
end)