Arte in superficie

Ai giocatori spesso piace contribuire a costruire lo spazio di gioco in cui si trovano. Il modulo sviluppatore SurfaceArt consente ai giocatori di lasciare letteralmente il segno all'interno di un'esperienza.

Utilizzo del modulo

Installazione

Per utilizzare il modulo SurfaceArt in un'esperienza:

  1. Dalla scheda Visualizza, aprire il Pannello degli strumenti e selezionare la scheda Marketplace.

    attiva il pulsante degli Strumenti in Studio
  2. Assicurarsi che la selezione dei modelli sia selezionata, quindi fare clic sul pulsante Vedi tutto per le Categorie.

  3. Individuare e fare clic sulla piastrella DEV MODULES.

  4. Individuare il modulo Arte in superficie e fare clic su di esso, o trascinarlo e rilasciarlo nella visualizzazione 3D.

  5. Nella finestra Explorer, spostare l'intero modello SurfaceArt in ServerScriptService. Dopo aver avviato l'esperienza, il modulo si distribuirà a vari servizi e inizierà a funzionare.

Posizionamento della tela

Il modulo viene fornito con un modello SurfaceCanvas che puoi posizionare nel mondo 3D. Questo modello è quello con cui i giocatori interagiranno al fine di posizionare le loro opere d'arte sulla sua superficie.

  1. Individua la rete SurfaceCanvas all'interno della cartella Spazio di lavoro, nella cartella principale del modulo.

  2. Spostarla nel livello alto della gerarchia dello Spazio di lavoro e posizionarla dove si desidera.

  3. Dopo aver pubblicato/eseguito una sessione di test, i giocatori saranno in grado di interagire con l'oggetto tramite un ProximityPrompt e di posizionare l'arte sulla superficie prescelta.

Modificare l'aspetto della tela

Sotto il cappuccio, il modulo utilizza un SurfaceGui per visualizzare gli oggetti d'arte. Per configurare la superficie su cui appare l'arte:

  1. Seleziona la maglia SurfaceCanvas.

  2. Nella parte inferiore della finestra Proprietà, individuare l'attributo SurfaceCanvasFace con un valore predefinito di Destra.

  3. Fai clic sull'attributo e inserisci uno dei sei valori che descrivono un Enum.NormalId.

Valore AttributoID normale corrispondente
DavantiEnum.NormalId.Front
IndietroEnum.NormalId.Back
DestraEnum.NormalId.Right
SinistraEnum.NormalId.Left
Superiore귀여운Enum.NormalId.Top`
**InferioreEnum.NormalId.bottom

Utilizzo di risorse artistiche personalizzate

Per adattarsi meglio al tema della tua esperienza, puoi utilizzare il tuo set di risorse personalizzate invece dei valori predefiniti. Questo può essere fatto tramite la funzione di configurazione, chiamata da un Script in 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,
})

Cancellazione di tutte le tele

Per rimuovere tutte le opere artistiche esistenti da tutte le tele nel mondo, chiamare la funzione removeAllArt da un Script.

Script

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

Visualizzazione degli effetti personalizzati

In alcuni casi potresti voler includere effetti visivi aggiuntivi quando un'opera d'arte viene posizionata. Questo modulo espone un evento denominato artChanged sul client a cui puoi connetterti e inserire la tua logica.

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)

Riferimento API

Tipi

SuperficieArtAsset

Immagini da visualizzare come arte per le tele, così come sono rappresentate da una tabella a due valori.

ChiaveDescrizione
nomeNome visualizzato dei metadati.
assetIdID risorsa dell'immagine da includere.

Funzioni

Configurare

configure(config:table):nil

Sovrascrive la configurazione predefinita attraverso le seguenti chiavi/valori nella configtabella. Questa funzione può essere chiamata solo da un Script.

Generale

ChiaveDescrizionePredefinito
attivatoImposta la funzionalità del modulo su on o su off.vero
risorseElenco dei SurfaceArtAssettipi.(vedi codice)
quotaPerPlayerNumero massimo di opere d'arte che possono essere posizionate da ciascun giocatore2

Aspetto

ChiaveDescrizionePredefinito
rowsPerCanvasNumero di righe della griglia della tela.2
colsPerCanvasNumero di colonne all'interno della griglia della tela.5
itemsPerPageNumero di articoli da saltare quando si accede a sinistra e a destra.3
canvasPaddingLeftImbottitura sinistra per la tela superficiale (UDim).(0, 8)
canvasPaddingRightImbottitura destra per la tela superficiale (UDim).(0, 8)
canvasPaddingTopImbottitura superiore per la tela superficiale (UDim).(0, 8)
canvasPaddingBottomImbottitura inferiore per la tela superficiale (UDim).(0, 8)
promptImageIcona visualizzata nel prompt di prossimità per entrare nella visualizzazione della selezione artistica."rbxassetid://8076723774"
leftArrowPageImageImmagine utile per andare alla pagina precedente con la freccia sinistra."rbxassetid://6998633654"
leftArrow ItemImageImmagine utile per selezionare l'oggetto artistico precedente con la freccia sinistra."rbxassetid://8072765021"
rightArrowPageImageImmagine utile per andare alla pagina successiva con la freccia destra."rbxassetid://6998635824"
rightArrowItemImageImmagine utile per andare selezionare l'oggetto artistico precedente con la freccia destra."rbxassetid://8072764852"

Interazione

ChiaveDescrizionePredefinito
promptKeyCodeScorciatoia tastiera utilizzata per attivare il prompt al fine di inserire una selezione artistica (Enum.KeyCode).E
promptRequiresLineOfSightValore booleano che determina se il prompt di prossimità deve essere nella linea visiva tra l'utente e la tela.vero
promptMaxActivationDistanceDistanza massima cui il personaggio di un giocatore può trovarsi rispetto alla tela, affinché il prompt appaia.10
promptExclusivityEnum.ProximityPromptExclusivityspecifica quali prompt possono essere visualizzati contemporaneamente.OnePerButton
usePageHotkeysSe sono usati i tasti di scelta rapida della pagina. Se vero, nextPageKey e prevPageKey vengono utilizzati per navigare tra le pagine.vero
nextPageKeyChiave utilizzata per navigare alla pagina d'arte successiva (Enum.KeyCode).E
nextItemKeyChiave utilizzata per navigare verso il successivo oggetto artistico (Enum.KeyCode).Destra
prevPageKeyChiave utilizzata per tornare alla precedente pagina di oggetti d'arte (Enum.KeyCode).Q
prevItemKeyChiave utilizzata per navigare verso l'oggetto artistico precedente (Enum.KeyCode).Sinistra
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

Restituisce tutte le tele contrassegnate con il tag SurfaceCanvas.

Script

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

placeArt

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

Posiziona un'opera d'arte programmaticamente per conto di un giocatore. Si noti che l'canvasoggetto deve essere contrassegnato dal tag SurfaceCanvas quando il server viene inizializzato. Si consiglia di utilizzare questa funzione solo con una tela restituita da 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)

rimuoviTuttoArt

rimuoviTuttaL'Arte():nil

Rimuove tutte le opere d'arte da tutte le superfici.

Script

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

Eventi

arteCambiato

arteCambiata(tela:BasePart, spot:Frame, spotPosizione:Vector3, artId:string, ownerUserId:number): RBXScriptSignal

Si accende quando un'opera d'arte viene modificata in una particolare posizione su una tela. Quando un'opera d'arte viene rimossa, artId sarà nil. Si noti che un Vector3 valore viene trasferito come terzo parametro al gestore dell'evento, in modo da poter posizionare un effetto personalizzato nella posizione esatta in cui l'opera d'arte è posizionata. Questo evento può essere collegato solo in un LocalScript.

Parametri
tele: BasePartTela su cui è stata modificata l'opera d'arte.
spot:FrameFrame interno che contiene l'opera d'ImageLabelarte.
spotPosizione: 귀여운Datatype.Vector3`Posizione esatta in cui l'opera d'arte è stata posizionata.
artId: stringID risorsa della nuova opera d'arte.
ownerUserId: numberUserId del giocatore che ha posizionato l'opera d'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(tela:BasePart): RBXScriptSignal

Si accende quando in prompt di interazione tra tele viene visualizzato da un giocatore. La funzione collegata riceve la tela su cui viene visualizzato il prompt. Questo evento può essere collegato solo in un LocalScript.

Parametri
tele: BasePartTela su cui viene visualizzato il prompt.
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(tela:BasePart): RBXScriptSignal

Si accende quando un prompt di interazione è nascosto. La funzione collegata riceve la tela su cui veniva visualizzato il prompt. Questo evento può essere collegato solo in un LocalScript.

Parametri
tele: BasePartTela su cui veniva visualizzato il prompt.
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

Si accende quando l'UI di selezione della superficie dell'opera d'arte viene visualizzata da un giocatore. Questo evento può essere collegato solo in 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)

selettoreHidden

selettoreHidden(): RBXScriptSignal

Si accende quando l'UI di selezione della superficie di un'opera d'arte è nascosta per un giocatore. Questo evento può essere collegato solo in 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)