Arte de superfície

Os jogadores geralmente gostam de sentir que fazem parte da construção do espaço em que estão. O módulo de desenvolvedor SurfaceArt permite que os jogadores literalmente deixem sua marca em uma experiência.

Uso do módulo

Instalação

Para usar o módulo SurfaceArt em uma experiência:

  1. Na aba Exibir, abra a Caixa de ferramentas e selecione a aba Mercado.

    Botão de ativação da Caixa de ferramentas no Studio.
  2. Verifique se a ordenação de Modelos está selecionada e, em seguida, clique no botão Exibir Tudo para Categorias.

  3. Encontre e clique no painel DEV MODULES

  4. Localize o módulo Arte de superfície e clique nele ou o arraste e solte na visualização 3D.

  5. Na janela do Explorador, mova o modelo SurfaceArt inteiro para o ServerScriptService. Ao executar a experiência, o módulo será distribuído para vários serviços e começará a ser executado.

Posicionando a tela

O módulo vem com um modelo SurfaceCanvas que você pode posicionar no mundo 3D. Esse modelo é o objeto com o qual os jogadores interagirão para colocar a arte na superfície.

  1. Localize a malha SurfaceCanvas dentro da pasta Espaço de trabalho da pasta principal do módulo.

  2. Mova-a para a hierarquia mais alta do Espaço de trabalho e posicione-a onde desejar.

  3. Ao publicar/executar uma sessão de teste, os jogadores poderão interagir com o objeto por meio de um Class. ProximityPrompt e colocar a arte na superfície definida.

Alterando a face da tela

Nos bastidores, o módulo usa um Class. SurfaceGui para exibir itens de arte. Para configurar em qual superfície a arte aparece:

  1. Selecione a malha SurfaceCanvas.

  2. Na parte inferior da janela Propriedades, localize o atributo SurfaceCanvasFace com um valor padrão de Direita.

  3. Clique no atributo e digite um dos seis valores que descrevem um Enum. NormalId.

Valor do atributoCorrespondência a um ID normal
FrenteEnum. NormalId. Front
VoltarEnum. NormalId. Back
DireitaEnum.NormalId.Right
EsquerdaEnum. NormalId. Left
CimaEnum. NormalId. Top
Baixo`Enum. NormalId.

Usando ativos de arte personalizados

Para se ajustar melhor ao tema da sua experiência, você pode usar seu próprio conjunto de ativos personalizados em vez dos padrões. Isso pode ser feito por meio da função configure, chamada de um Class. Script no 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,
})

Limpando todas as telas

Para remover toda a arte existente de todas as telas do mundo, chame a função removeAllArt de um Class. Script.

Script

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

Mostrando efeitos personalizados

Pode haver casos em que você quer incluir efeitos visuais adicionais quando uma obra de arte é colocada. Esse módulo expõe um evento chamado artChanged no cliente ao qual você pode se conectar e adicionar sua própria 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)

Referência de API

Tipos

SurfaceArtAsset

As imagens a serem usadas como arte para a tela são representadas por uma tabela com dois valores.

ChaveDescrição
nameNome de exibição dos metadados.
assetIdID de ativo da imagem a ser incluída.

Funções

configurar

configure(config:table):nil

Substitui as opções de configuração padrão por meio das chaves-valor na tabela config. Esta função só poder ser chamada de um Class. Script.

Geral

ChaveDescriçãoPadrão
enabledAtiva ou desativa a funcionalidade do módulo.true
assetsLista de tipos SurfaceArtAsset.(ver código)
quotaPerPlayerNúmero máximo de obras de arte que podem ser colocadas por cada jogador.2

Aparência

ChaveDescriçãoPadrão
rowsPerCanvasNúmero de linhas na grade da tela.2
colsPerCanvasNúmero de colunas na grade da tela.5
itemsPerPageNúmero de itens a serem ignorados ao fazer a paginação para a esquerda e direita.3
canvasPaddingLeftPreenchimento à esquerda para a tela de superfície (UDim).(0, 8)
canvasPaddingRightPreenchimento à direita para a tela de superfície (UDim).(0, 8)
canvasPaddingTopPreenchimento superior para a tela de superfície (UDim).(0, 8)
canvasPaddingBottomPreenchimento inferior para a tela de superfície (UDim).(0, 8)
promptImageÍcone mostrado no aviso de proximidade para entrar na visualização de seleção de arte."rbxassetid://8076723774"
leftArrowPageImageImagem para a seta esquerda para virar para a página anterior."rbxassetid://6998633654"
leftArrowItemImageImagem para a seta esquerda para selecionar o item de arte anterior."rbxassetid://8072765021"
rightArrowPageImageImagem para a seta direita para virar para a página seguinte."rbxassetid://6998635824"
rightArrowItemImageImagem para a seta direita para selecionar o item de arte seguinte."rbxassetid://8072764852"

Interação

ChaveDescriçãoPadrão
promptKeyCodeAtalho de teclado usado para ativar o aviso para acessar a seleção de arte (Enum. KeyCode).E
promptRequiresLineOfSightValor booleano que determina se o aviso de proximidade precisa estar na linha de visão entre o usuário e a tela.true
promptMaxActivationDistanceA distância máxima que o personagem de um jogador pode estar da tela para que o aviso apareça.10
promptExclusivityEnum. ProximityPromptExclusivity especificando quais avisos podem ser mostrados ao mesmo tempo.OnePerButton
usePageHotkeysSe as teclas de atalho da página são usadas. Quando marcado como verdadeiro, nextPageKey e prevPageKey são usadas para alternar entre as páginas.true
nextPageKeyTecla usada para ir para a página seguinte de obras de arte (Enum. KeyCode).E
nextItemKeyTecla usada para passar para o item seguinte de obras de arte (Enum. KeyCode).Right
prevPageKeyTecla usada para ir para a página anterior de obras de arte (Enum. KeyCode).Q
prevItemKeyTecla usada para passar para o item anterior de obras de arte (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

Retorna todas as telas marcadas com o marcador SurfaceCanvas.

Script

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

placeArt

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

Coloca uma obra de arte programaticamente em nome de um jogador. Observe que o objeto canvas deve ser marcado com um marcador SurfaceCanvas quando o servidor é inicializado. É recomendado usar isso somente com uma tela retornada do 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

Remove toda as obras de arte de todas as superfícies.

Script

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

Eventos

artChanged

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

É acionado quando uma obra de arte é alterada em um local específico em uma tela. Quando uma obra de arte é removida, artId será nil. Observe que um valor Datatype. Vector3 é passado como o terceiro parâmetro para o manipulador de eventos para que você possa posicionar um efeito personalizado na posição exata em que a obra de arte foi colocada. O evento só pode ser conectado a um Class. LocalScript.

Parâmetros
canvas: Class. BasePartTela na qual a obra de arte foi alterada.
spot: Class. FrameClass. Frame interno que contém a obra de arte Class. ImageLabel.
spotPosition: Datatype. Vector3Posição exata em que a obra de arte foi colocada.
artId: stringID de ativo da nova obra de arte.
ownerUserId: numberClass. Player. UserId|UserId do jogador que colocou a 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:Class. BasePart): RBXScriptSignal

É acionado quando um aviso de interação na tela é mostrado para um jogador. A função conectada recebe a tela na qual o aviso está sendo exibido. O evento só pode ser conectado a um Class. LocalScript.

Parâmetros
canvas: Class. BasePartTela na qual o aviso está sendo exibido.
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:Class. BasePart): RBXScriptSignal

É acionado quando um aviso de interação na tela é ocultado. A função conectada recebe a tela na qual o aviso estava sendo exibido. O evento só pode ser conectado a um Class. LocalScript.

Parâmetros
canvas: Class. BasePartTela na qual o aviso estava sendo exibido.
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

É acionado quando a IU do seletor de arte de superfície é exibida para um jogador. O evento só pode ser conectado a um Class. 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

É acionado quando a IU do seletor de arte de superfície é ocultada para um jogador. O evento só pode ser conectado a um Class. 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)