Os jogadores geralmente gostam de sentir que fazem parte da construção do espaço em que estão. O módulo SurfaceArt módulo do desenvolvedor permite que os jogadores deixem literalmente sua marca em uma experiência.
Uso do Módulo
Instalação
Para usar o módulo SurfaceArt em uma experiência:
No menu Janela do Studio ou na barra de ferramentas da aba Início, abra a Caixa de Ferramentas e selecione a aba Loja do Criador.

Certifique-se de que a ordenação Modelos esteja selecionada, e clique no botão Ver Todos para Categorias.

Localize e clique no bloco Pacotes.
Localize o módulo Arte de Superfície e clique nele, ou arraste-e-solte-o na vista 3D.

Na janela Explorador, mova todo o modelo SurfaceArt para ReplicatedStorage. Ao executar a experiência, o módulo começará a rodar.
Posicionando a Tela
O módulo vem com um modelo SurfaceCanvas que você pode posicionar no mundo 3D. Esse modelo é o que os jogadores interagirão para colocar arte em sua superfície.
Localize a malha SurfaceCanvas dentro da pasta Workspace da pasta principal do módulo.

Mova-o para a hierarquia de Workspace de nível superior e posicione-o onde desejar.

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

Mudando a Face da Tela
Por trás dos panos, o módulo usa um SurfaceGui para exibir itens de arte. Para configurar em qual superfície a arte aparecerá:
Selecione a malha SurfaceCanvas.
Na parte inferior da janela Propriedades, localize o atributo SurfaceCanvasFace com um valor padrão de Direita.

Clique no atributo e insira um dos seis valores que descrevem um Enum.NormalId.
| Valor do Atributo | ID Normal Correspondente |
|---|---|
| Frente | Enum.NormalId.Front |
| Costas | Enum.NormalId.Back |
| Direita | Enum.NormalId.Right |
| Esquerda | Enum.NormalId.Left |
| Cima | Enum.NormalId.Top |
| Baixo | Enum.NormalId.Bottom |
Usando Ativos de Arte Personalizados
Para se adequar 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 através da função configurar, chamada de um Script em ServerScriptService.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)local customAssets = {CustomAsset1 = {name = "Ativo Personalizado 1",assetId = "rbxassetid://7322508294",},CustomAsset2 = {name = "Ativo Personalizado 2",assetId = "rbxassetid://7322547665",},}SurfaceArt.configure({assets = customAssets,})
Limpando Todas as Telas
Para remover toda a arte existente de todas as telas no mundo, chame a função removeAllArt de um Script.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.removeAllArt()
Mostrando Efeitos Personalizados
Pode haver casos em que você deseja incluir efeitos visuais adicionais quando uma obra de arte é colocada. Este módulo expõe um evento chamado artChanged no cliente que você pode conectar e adicionar sua própria 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
-- Mostre alguns brilhos por 3 segundos
task.spawn(function()
local emitterAttachment = createParticleEmitter(canvas, spotPosition)
task.wait(3)
emitterAttachment:Destroy()
end)
end
end)
Referência da API
Tipos
SurfaceArtAsset
Imagens a serem usadas como arte para a tela são representadas por uma tabela com dois valores.
| Chave | Descrição |
|---|---|
| name | Nome de exibição da metadata. |
| assetId | ID do ativo da imagem a ser incluída. |
Funções
configure
configure(config: table)
Substitui opções de configuração padrão através das seguintes chaves/valores na tabela config. Esta função só pode ser chamada de um Script.
| Chave | Descrição | Padrão |
|---|---|---|
| enabled | Ativa ou desativa a funcionalidade do módulo. | true |
| assets | Lista de tipos SurfaceArtAsset. | (veja o código abaixo) |
| quotaPerPlayer | Número máximo de peças de arte que podem ser colocadas por cada jogador. | 2 |
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.configure({quotaPerPlayer = 4,promptKeyCode = Enum.KeyCode.T,promptMaxActivationDistance = 8,})
getCanvases
getCanvases(): table
Retorna todas as telas marcadas com a tag SurfaceCanvas.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)local canvases = SurfaceArt.getCanvases()
placeArt
Coloca uma peça de arte programaticamente em nome de um jogador. Observe que o objeto canvas deve estar marcado com a tag SurfaceCanvas quando o servidor for inicializado. É recomendado usar isso apenas com uma tela retornada de getCanvases.
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
local remoteEvent = ReplicatedStorage:WaitForChild("SurfaceArtRemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player)
-- Coloque o Prêmio Bloxy dos ativos de arte padrão na primeira tela
local canvases = SurfaceArt.getCanvases()
SurfaceArt.placeArt(player, canvases[1], "BloxyAward")
end)
removeAllArt
removeAllArt()
Remove toda a arte de todas as superfícies.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.removeAllArt()
Eventos
artChanged
Dispara quando uma obra de arte é alterada em um determinado local em uma tela. Quando uma obra de arte é removida, artId será nil. Observe que um valor Vector3 é passado como o terceiro parâmetro para o manipulador de eventos, para que você possa posicionar um efeito personalizado na posição exata onde a obra de arte é colocada. Este evento só pode ser conectado em um LocalScript.
| Parâmetros | |
|---|---|
| canvas: BasePart | Tela na qual a obra de arte foi alterada. |
| spot: Frame | Frame interno Frame que contém a ImageLabel da obra de arte. |
| spotPosition: Vector3 | Posição exata onde a obra de arte foi colocada. |
| artId: string | ID de ativo da nova obra de arte. |
| ownerUserId: number | ID de Usuário de UserId do jogador que colocou a arte. |
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.artChanged:Connect(function(canvas, spot, spotPosition, artId, ownerId)
print("Arte colocada em:", spotPosition)
print("ID do ativo da arte:", artId)
print("Arte colocada por:", ownerId)
end)
promptShown
Dispara quando um aviso de interação com a tela é exibido a um jogador. A função conectada recebe a tela na qual o aviso está sendo exibido. Este evento só pode ser conectado em um LocalScript.
| Parâmetros | |
|---|---|
| canvas: BasePart | Tela na qual o aviso está sendo exibido. |
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
Dispara quando um aviso de interação com a tela é ocultado. A função conectada recebe a tela na qual o aviso estava sendo exibido. Este evento só pode ser conectado em um LocalScript.
| Parâmetros | |
|---|---|
| canvas: BasePart | Tela na qual o aviso estava sendo exibido. |
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
Dispara quando a interface do seletor de arte de superfície é exibida a um jogador. Este evento só pode ser conectado em um LocalScript.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.selectorShown:Connect(function()
print(Players.LocalPlayer, "abriu o seletor de arte de superfície")
end)
selectorHidden
Dispara quando a interface do seletor de arte de superfície é ocultada para um jogador. Este evento só pode ser conectado em um LocalScript.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.selectorHidden:Connect(function()
print(Players.LocalPlayer, "fechou o seletor de arte de superfície")
end)