Arte de superficie

Los jugadores a menudo disfrutan sentir que son parte de la construcción del espacio en el que se encuentran. El módulo de desarrolladores Arte de la superficie permite a los jugadores dejar literalmente su marca en una experiencia.

Uso del módulo

Instalación

Sigue estos pasos para usar el módulo SurfaceArt en una experiencia:

  1. En la pestaña Ver, abre la Caja de herramientas y selecciona la pestaña Mercado.

    Botón de activación de Caja de herramientas en Studio
  2. Asegúrate de que la clasificación de Modelos esté seleccionada y, a continuación, haz clic en el botón Ver todo para las Categorías.

  3. Busca y haz clic en el mosaico MÓDULOS DE DESARROLLO.

  4. Busca el módulo Arte de superficie y haz clic en él o arrástralo y suéltalo en la vista 3D.

  5. En la ventana del Explorador, mueve todo el modelo de SurfaceArt a ServerScriptService. Al ejecutar la experiencia, el módulo se distribuirá a varios servicios y comenzará a ejecutarse.

Posicionar el lienzo

El módulo viene con un modelo de SurfaceCanvas que puedes posicionar en el mundo 3D. Este modelo es con el que los jugadores interactuarán para colocar arte en su superficie.

  1. Localiza la malla SurfaceCanvas dentro de la carpeta Workspace de la carpeta principal del módulo.

  2. Muévela a la jerarquía de Workspace de nivel superior y colócala donde desees.

  3. Al publicar o 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.

Cambiar la cara del lienzo

Bajo la capucha, el módulo usa un SurfaceGui para mostrar objetos artísticos. Sigue estos pasos para configurar en qué superficie aparece el arte:

  1. Selecciona la malla SurfaceCanvas.

  2. En la parte inferior de la ventana Propiedades, busca el atributo SurfaceCanvasFace con un valor predeterminado de Derecha.

  3. Haz clic en el atributo e ingresa uno de los seis valores que describen un Enum.NormalId.

Valor del atributoIdentificación normal correspondiente
FrenteEnum.NormalId.Front
RegresarEnum.NormalId.Back
DerechaEnum.NormalId.Right
IzquierdaEnum.NormalId.Left
ArribaEnum.NormalId.Top
AbajoEnum.NormalId.Bottom

Uso de recursos de arte personalizados

Para adaptarse mejor al tema de tu experiencia, puedes usar tu propio conjunto de recursos personalizados en lugar de los predeterminados. Esto se puede hacer a través de la función de configuración, llamada desde un Script en ServerScriptService.

Script

local ReplicatedStorage = game: GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))
local customAssets = {
CustomAsset1 = {
name = "Custom Asset 1",
assetId = "rbxassetid://7322508294",
},
CustomAsset2 = {
name = "Custom Asset 2",
assetId = "rbxassetid://7322547665",
},
}
SurfaceArt.configure({
assets = customAssets,
})

Borrar todos los lienzos

Para eliminar todo el arte existente de todos los lienzos del mundo, llama a la función removeAllArt desde un Script.

Script

local ReplicatedStorage = game: GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))
SurfaceArt.removeAllArt()

Mostrar efectos personalizados

Puede haber casos en los desees incluir efectos visuales adicionales cuando se coloca una obra de arte. Este módulo expone un evento llamado artChanged en el cliente al que puedes conectarte y añadir tu propia lógica.

LocalScript

local ReplicatedStorage = game: GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage:WaitForChild("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
-- Show some sparkles for 3 seconds
task.spawn(function()
local emitterAttachment = createParticleEmitter(canvas, spotPosition)
task.wait(3)
emitterAttachment: Destroy()
end)
end
end)

Referencia API

Tipos

SurfaceArtAsset

Las imágenes que se van a usar como arte para el lienzo se representan mediante una tabla con dos valores.

ClaveDescripción
nameNombre de visualización de los metadatos.
assetIdIdentificación del recurso de la imagen que se va a incluir.

Funciones

configure

configure(config:table):nil

Reemplaza las opciones de configuración predeterminadas a través de las siguientes claves o valores en la tabla config. A esta función solo se puede acceder desde un Script.

General

ClaveDescripciónPredeterminado
enabledActiva o desactiva la funcionalidad del módulo.true
assetsLista de tipos de SurfaceArtAsset.(ver código)
quotaPerPlayerNúmero máximo de piezas de arte que puede colocar cada jugador.2

Apariencia

ClaveDescripciónPredeterminado
rowsPerCanvasNúmero de filas en la cuadrícula del lienzo.2
colsPerCanvasNúmero de columnas en la cuadrícula del lienzo.5
itemsPerPageNúmero de objetos que se deben omitir al paginar a la izquierda y la derecha.3
canvasPaddingLeftRelleno izquierdo para el lienzo de superficie (UDim).(0, 8)
canvasPaddingRightRelleno derecho para el lienzo de superficie (UDim).(0, 8)
canvasPaddingTopRelleno superior para el lienzo de superficie (UDim).(0, 8)
canvasPaddingBottomRelleno inferior para el lienzo de superficie (UDim).(0, 8)
promptImageIcono mostrado en el indicador de proximidad para entrar en la vista de selección de arte."rbxassetid://8076723774"
leftArrowPageImageImagen de la flecha izquierda para pasar a la página anterior."rbxassetid://6998633654"
leftArrowItemImageImagen de la flecha izquierda para seleccionar el objeto de arte anterior."rbxassetid://8072765021"
rightArrowPageImageImagen de la flecha derecha para pasar a la página siguiente."rbxassetid://6998635824"
rightArrowItemImageImagen de la flecha derecha para seleccionar el siguiente objeto de arte."rbxassetid://8072764852"

Interacción

ClaveDescripciónPredeterminado
promptKeyCodeAtajo de teclado que se usa para activar el mensaje para ingresar a la selección de arte (Enum.KeyCode).E
promptRequiresLineOfSightValor booleano que determina si el indicador de proximidad tiene que estar en línea de visión entre el usuario y el lienzo.true
promptMaxActivationDistanceDistancia máxima a la que el personaje de un jugador puede estar desde el lienzo para que aparezca el mensaje.10
promptExclusivityEnum.ProximityPromptExclusivity especificando qué indicadores se pueden mostrar al mismo tiempo.OnePerButton
usePageHotkeysSi se usan las teclas de acceso rápido de la página. Si es verdadero, nextPageKey y prevPageKey se usan para pasar de una página a otra.true
nextPageKeyTecla que permite pasar a la siguiente página de la obra (Enum.KeyCode).E
nextItemKeyTecla que permite pasar al siguiente objeto de la obra (Enum.KeyCode).Right
prevPageKeyTecla que permite pasar a la página anterior de la obra (Enum.KeyCode).Q
prevItemKeyTecla que permite pasar al objeto de la obra anterior (Enum.KeyCode).Left
Script

local ReplicatedStorage = game: GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))
SurfaceArt.configure({
quotaPerPlayer = 4,
promptKeyCode = Enum. KeyCode.T,
promptMaxActivationDistance = 8,
})

getCanvases

getCanvases():table

Devuelve todos los lienzos etiquetados con la etiqueta SurfaceCanvas.

Script

local ReplicatedStorage = game: GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))
local canvases = SurfaceArt.getCanvases()

placeArt

placeArt(player:Player, canvas:BasePart):nil

Coloca una obra de arte mediante programación en nombre de un jugador. Ten en cuenta que el objeto canvas se debe etiquetar 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:WaitForChild("SurfaceArt"))
local remoteEvent = ReplicatedStorage: WaitForChild("SurfaceArtRemoteEvent")
remoteEvent. OnServerEvent:Connect(function(player)
-- Place the Bloxy Award from default art assets into the first canvas
local canvases = SurfaceArt.getCanvases()
SurfaceArt.placeArt(player, canvases[1], "BloxyAward")
end)

removeAllArt

removeAllArt():nil

Elimina todas las obras de arte de todas las superficies.

Script

local ReplicatedStorage = game: GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))
SurfaceArt.removeAllArt()

Eventos

artChanged

artChanged(canvas:BasePart, spot:Frame, spotPosition:Vector3, artId:string, ownerUserId:number): RBXScriptSignal

Se activa cuando se cambia una obra de arte en una ubicación particular del lienzo. Cuando se elimina una obra de arte, artId se mostrará 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 en la que se coloca la ilustración. Este evento solo se puede conectar en un LocalScript.

Parámetros
canvas: BasePartLienzo sobre el que se cambió la obra de arte.
spot: Frameinterno Frame que contiene la obra de arte ImageLabel.
spotPosition: Vector3Posición exacta donde se colocó la obra de arte.
artId: stringIdentificación del recurso de la nueva obra de arte.
ownerUserId: numberUserId del jugador que colocó el arte.
LocalScript

local ReplicatedStorage = game: GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))
SurfaceArt.artChanged:Connect(function(canvas, spot, spotPosition, artId, ownerId)
print("Art placed at:", spotPosition)
print("Art asset ID:", artId)
print("Art placed by:", ownerId)
end)

promptShown

promptShown(canvas:BasePart): RBXScriptSignal

Se activa cuando se muestra un mensaje de interacción del lienzo a un jugador. La función conectada recibe el lienzo en el que se muestra el mensaje. Este evento solo se puede conectar en un LocalScript.

Parámetros
canvas: BasePartLienzo en el que se muestra el mensaje.
LocalScript

local ReplicatedStorage = game: GetService("ReplicatedStorage")
local Players = game: GetService("Players")
local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))
SurfaceArt.promptShown:Connect(function(canvas)
print(Players.LocalPlayer, canvas)
end)

promptHidden

promptHidden(canvas:BasePart): RBXScriptSignal

Se activa cuando se oculta un mensaje de interacción del lienzo. La función conectada recibe el lienzo en el que se mostraba el mensaje. Este evento solo se puede conectar en un LocalScript.

Parámetros
canvas: BasePartLienzo en el que se mostraba el mensaje.
LocalScript

local ReplicatedStorage = game: GetService("ReplicatedStorage")
local Players = game: GetService("Players")
local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))
SurfaceArt.promptClosed:Connect(function(canvas)
print(Players.LocalPlayer, canvas)
end)

selectorShown

selectorShown(): RBXScriptSignal

Se activa cuando la interfaz de usuario del selector de arte de superficie se muestra a un jugador. Este evento solo se puede conectar en un LocalScript.

LocalScript

local ReplicatedStorage = game: GetService("ReplicatedStorage")
local Players = game: GetService("Players")
local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))
SurfaceArt.selectorShown:Connect(function()
print(Players.LocalPlayer, "opened surface art selector")
end)

selectorHidden

selectorHidden(): RBXScriptSignal

Se activa cuando la interfaz de usuario del selector de arte de superficie está oculta para un jugador. Este evento solo se puede conectar en un LocalScript.

LocalScript

local ReplicatedStorage = game: GetService("ReplicatedStorage")
local Players = game: GetService("Players")
local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))
SurfaceArt.selectorHidden:Connect(function()
print(Players.LocalPlayer, "closed surface art selector")
end)