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:
Na aba Exibir, abra a Caixa de ferramentas e selecione a aba Mercado.
Verifique se a ordenação de Modelos está selecionada e, em seguida, clique no botão Exibir Tudo para Categorias.
Encontre e clique no painel DEV MODULES
Localize o módulo Arte de superfície e clique nele ou o arraste e solte na visualização 3D.
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.
Localize a malha SurfaceCanvas dentro da pasta Espaço de trabalho da pasta principal do módulo.
Mova-a para a hierarquia mais alta do Espaço de trabalho e posicione-a onde desejar.
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:
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 digite um dos seis valores que descrevem um Enum. NormalId.
Valor do atributo | Correspondência a um ID normal |
---|---|
Frente | Enum. NormalId. Front |
Voltar | Enum. NormalId. Back |
Direita | Enum.NormalId.Right |
Esquerda | Enum. NormalId. Left |
Cima | Enum. 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.
Chave | Descrição |
---|---|
name | Nome de exibição dos metadados. |
assetId | ID 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
Chave | Descrição | Padrão |
---|---|---|
enabled | Ativa ou desativa a funcionalidade do módulo. | true |
assets | Lista de tipos SurfaceArtAsset. | (ver código) |
quotaPerPlayer | Número máximo de obras de arte que podem ser colocadas por cada jogador. | 2 |
Aparência
Chave | Descrição | Padrão |
---|---|---|
rowsPerCanvas | Número de linhas na grade da tela. | 2 |
colsPerCanvas | Número de colunas na grade da tela. | 5 |
itemsPerPage | Número de itens a serem ignorados ao fazer a paginação para a esquerda e direita. | 3 |
canvasPaddingLeft | Preenchimento à esquerda para a tela de superfície (UDim). | (0, 8) |
canvasPaddingRight | Preenchimento à direita para a tela de superfície (UDim). | (0, 8) |
canvasPaddingTop | Preenchimento superior para a tela de superfície (UDim). | (0, 8) |
canvasPaddingBottom | Preenchimento 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" |
leftArrowPageImage | Imagem para a seta esquerda para virar para a página anterior. | "rbxassetid://6998633654" |
leftArrowItemImage | Imagem para a seta esquerda para selecionar o item de arte anterior. | "rbxassetid://8072765021" |
rightArrowPageImage | Imagem para a seta direita para virar para a página seguinte. | "rbxassetid://6998635824" |
rightArrowItemImage | Imagem para a seta direita para selecionar o item de arte seguinte. | "rbxassetid://8072764852" |
Interação
Chave | Descrição | Padrão |
---|---|---|
promptKeyCode | Atalho de teclado usado para ativar o aviso para acessar a seleção de arte (Enum. KeyCode). | E |
promptRequiresLineOfSight | Valor booleano que determina se o aviso de proximidade precisa estar na linha de visão entre o usuário e a tela. | true |
promptMaxActivationDistance | A distância máxima que o personagem de um jogador pode estar da tela para que o aviso apareça. | 10 |
promptExclusivity | Enum. ProximityPromptExclusivity especificando quais avisos podem ser mostrados ao mesmo tempo. | OnePerButton |
usePageHotkeys | Se 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 |
nextPageKey | Tecla usada para ir para a página seguinte de obras de arte (Enum. KeyCode). | E |
nextItemKey | Tecla usada para passar para o item seguinte de obras de arte (Enum. KeyCode). | Right |
prevPageKey | Tecla usada para ir para a página anterior de obras de arte (Enum. KeyCode). | Q |
prevItemKey | Tecla 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. BasePart | Tela na qual a obra de arte foi alterada. |
spot: Class. Frame | Class. Frame interno que contém a obra de arte Class. ImageLabel. |
spotPosition: Datatype. Vector3 | Posição exata em que a obra de arte foi colocada. |
artId: string | ID de ativo da nova obra de arte. |
ownerUserId: number | Class. 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. BasePart | Tela 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. BasePart | Tela 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)