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:
En la pestaña Ver, abre la Caja de herramientas y selecciona la pestaña Mercado.
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.
Busca y haz clic en el mosaico MÓDULOS DE DESARROLLO.
Busca el módulo Arte de superficie y haz clic en él o arrástralo y suéltalo en la vista 3D.
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.
Localiza la malla SurfaceCanvas dentro de la carpeta Workspace de la carpeta principal del módulo.
Muévela a la jerarquía de Workspace de nivel superior y colócala donde desees.
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:
Selecciona la malla SurfaceCanvas.
En la parte inferior de la ventana Propiedades, busca 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 | Identificación normal correspondiente |
---|---|
Frente | Enum.NormalId.Front |
Regresar | Enum.NormalId.Back |
Derecha | Enum.NormalId.Right |
Izquierda | Enum.NormalId.Left |
Arriba | Enum.NormalId.Top |
Abajo | Enum.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.
Clave | Descripción |
---|---|
name | Nombre de visualización de los metadatos. |
assetId | Identificació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
Clave | Descripción | Predeterminado |
---|---|---|
enabled | Activa o desactiva la funcionalidad del módulo. | true |
assets | Lista de tipos de SurfaceArtAsset. | (ver código) |
quotaPerPlayer | Número máximo de piezas de arte que puede colocar cada jugador. | 2 |
Apariencia
Clave | Descripción | Predeterminado |
---|---|---|
rowsPerCanvas | Número de filas en la cuadrícula del lienzo. | 2 |
colsPerCanvas | Número de columnas en la cuadrícula del lienzo. | 5 |
itemsPerPage | Número de objetos que se deben omitir al paginar a la izquierda y la derecha. | 3 |
canvasPaddingLeft | Relleno izquierdo para el lienzo de superficie (UDim). | (0, 8) |
canvasPaddingRight | Relleno derecho para el lienzo de superficie (UDim). | (0, 8) |
canvasPaddingTop | Relleno superior para el lienzo de superficie (UDim). | (0, 8) |
canvasPaddingBottom | Relleno inferior para el lienzo de superficie (UDim). | (0, 8) |
promptImage | Icono mostrado en el indicador de proximidad para entrar en la vista de selección de arte. | "rbxassetid://8076723774" |
leftArrowPageImage | Imagen de la flecha izquierda para pasar a la página anterior. | "rbxassetid://6998633654" |
leftArrowItemImage | Imagen de la flecha izquierda para seleccionar el objeto de arte anterior. | "rbxassetid://8072765021" |
rightArrowPageImage | Imagen de la flecha derecha para pasar a la página siguiente. | "rbxassetid://6998635824" |
rightArrowItemImage | Imagen de la flecha derecha para seleccionar el siguiente objeto de arte. | "rbxassetid://8072764852" |
Interacción
Clave | Descripción | Predeterminado |
---|---|---|
promptKeyCode | Atajo de teclado que se usa para activar el mensaje para ingresar a la selección de arte (Enum.KeyCode). | E |
promptRequiresLineOfSight | Valor booleano que determina si el indicador de proximidad tiene que estar en línea de visión entre el usuario y el lienzo. | true |
promptMaxActivationDistance | Distancia máxima a la que el personaje de un jugador puede estar desde el lienzo para que aparezca el mensaje. | 10 |
promptExclusivity | Enum.ProximityPromptExclusivity especificando qué indicadores se pueden mostrar al mismo tiempo. | OnePerButton |
usePageHotkeys | Si 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 |
nextPageKey | Tecla que permite pasar a la siguiente página de la obra (Enum.KeyCode). | E |
nextItemKey | Tecla que permite pasar al siguiente objeto de la obra (Enum.KeyCode). | Right |
prevPageKey | Tecla que permite pasar a la página anterior de la obra (Enum.KeyCode). | Q |
prevItemKey | Tecla 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: BasePart | Lienzo sobre el que se cambió la obra de arte. |
spot: Frame | interno Frame que contiene la obra de arte ImageLabel. |
spotPosition: Vector3 | Posición exacta donde se colocó la obra de arte. |
artId: string | Identificación del recurso 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: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: BasePart | Lienzo 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: BasePart | Lienzo 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)