Art de surface

Les joueurs apprécient souvent d'avoir le sentiment de participer à la construction de l'espace dans lequel ils évoluent. Le module développeur SurfaceArt permet littéralement aux joueurs de marquer une expérience de leur empreinte.

Utilisation du module

Installation

Pour utiliser le module SurfaceArt dans une expérience :

  1. Dans l'onglet Voir, ouvrez la Boîte à outils et sélectionnez l'onglet Marketplace.

    Bouton activer/désactiver la Boîte à outils dans Studio
  2. Assurez-vous que le filtre Modèles est sélectionné, puis cliquez sur le bouton Voir tout pour afficher les catégories.

  3. Localisez et cliquez sur la vignette MODULES DEV.

  4. Localisez le module Surface Art et cliquez dessus, ou faites-le glisser dans la visualisation 3D.

  5. Dans la fenêtre Explorateur, déplacez l'intégralité du modèle SurfaceArt dans ServerScriptService. Lors de l'exécution de l'expérience, le module se distribuera lui-même vers divers services et commencera à s'exécuter.

Positionner la toile

Le module comprend un modèle SurfaceCanvas que vous pouvez positionner dans le monde 3D. C'est avec ce modèle que les joueurs interagiront pour placer des œuvres d'art sur sa surface.

  1. Localisez le maillage SurfaceCanvas dans le dossier Espace de travail du dossier principal du module.

  2. Déplacez-le dans la hiérarchie de l'Espace de travail du premier niveau et positionnez-le où vous le souhaitez.

  3. Lors de la publication ou de l'exécution d'une session de test, les joueurs pourront interagir avec l'objet par l'intermédiaire d'une ProximityPrompt et poser des œuvres d'art sur la surface définie.

Modifier la face de la toile

Le module utilise une SurfaceGui pour afficher les objets d'art. Pour configurer la surface sur laquelle l'œuvre d'art apparaît :

  1. Sélectionnez le maillage SurfaceCanvas.

  2. En bas de la fenêtre Propriétés, repérez l'attribut SurfaceCanvasFace dont la valeur par défaut est Droite.

  3. Cliquez sur l'attribut et saisissez l'une des six valeurs qui décrivent un Enum.NormalId.

Valeur d'attributID normal correspondant
AvantEnum.NormalId.Front
PrécédentEnum.NormalId.Back
DroiteEnum.NormalId.Right
GaucheEnum.NormalId.Left
HautEnum.NormalId.Top
BasEnum.NormalId.bottom

Utiliser les objets d'art personnalisés

Vous pouvez utiliser votre propre ensemble de ressources personnalisées au lieu des valeurs par défaut afin de mieux correspondre au thème de votre expérience client. Cela peut se faire par l'intermédiaire de la fonction configurer, appelée à partir d'un Script dans 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,
})

Effacer toutes les toiles

Pour supprimer toutes les œuvres d'art de toutes les toiles du monde, appelez la fonction removeAllArt à partir d'un Script.

Script

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

Afficher les effets personnalisés

Dans certains cas, vous voudrez peut-être inclure des effets visuels supplémentaires lorsqu'une œuvre d'art est placée. Ce module expose un événement appelé artChanged sur le client auquel vous pouvez vous connecter et ajouter votre propre logique.

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)

Référence API

Types

SurfaceArtAsset

Les images à utiliser pour la toile sont représentées par un tableau à deux valeurs.

CléDescription
nomNom d'affichage des métadonnées.
idcontenuID de l'élément de l'image à inclure.

Fonctions

configurer

configure(config:table):nil

Remplace les options de configuration par défaut par le biais des clés/valeurs suivantes dans le tableau config. Cette fonction peut uniquement être appelée à partir d'un Script.

Généralités

CléDescriptionPar défaut
activéActive ou désactive la fonctionnalité du module.vrai
contenusListe des types de SurfaceArtAsset.(voir le code)
quotaPerPlayerNombre maximum d'œuvres d'art pouvant être placées par chaque joueur.2

Apparence

CléDescriptionPar défaut
'rangsParToile'Nombre de lignes dans la grille de la toile.2
'colsParToile'Nombre de colonnes dans la grille de la toile.5
'itemsParPage'Nombre d'objets à ignorer lors de la pagination vers la gauche et vers la droite.3
'toileEncadrementGauche'Rembourrage sur la gauche pour la toile de surface (UDim).(0, 8)
'toileEncadrementDroite'Rembourrage sur la droite pour la toile de surface (UDim).(0, 8)
'toileEncadrementHaut'Rembourrage sur le haut pour la toile de surface (UDim).(0, 8)
'toileEncadrementBas'Rembourrage sur le bas pour la toile de surface (UDim).(0, 8)
promptImageIcône affichée dans l'invite de proximité pour entrer dans la vue de sélection des œuvres d'art."rbxassetid://8076723774"
'gaucheFlèchePageImage'Image de la flèche gauche pour revenir à la page précédente."rbxassetid://6998633654"
'gaucheFlècheItemImage'Image de la flèche gauche pour sélectionner l'objet d'art précédent."rbxassetid://8072765021"
'droiteFlèchePageImage'Image de la flèche droite pour passer à la page suivante."rbxassetid://6998635824"
'droiteflècheItemImage'Image de la flèche droite pour sélectionner l'objet d'art suivant."rbxassetid://8072764852"

4000

CléDescriptionPar défaut
promptKeyCodeRaccourci clavier utilisé pour activer l'invite à passer à la sélection de l'art (Enum.KeyCode).E
promptRequiresLineOfSightValeur booléenne qui détermine si l'invite de proximité doit être dans la ligne de mire de l'utilisateur et de la toile.vrai
promptMaxActivationDistanceDistance maximale entre le personnage d'un joueur et la toile pour que l'invite apparaisse.10
promptExclusivityEnum.ProximityPromptExclusivityspécifie les invites qui peuvent être affichées en même temps.UnParBouton
usePageHotkeysIndique si les touches de raccourci des pages sont utilisées. Si c'est le cas, les touches nextPageKey et prevPageKey sont utilisées pour passer d'une page à l'autre.vrai
nextPageKeyTouche permettant de passer à la page suivante de l'œuvre d'art (Enum.KeyCode).E
nextItemKeyTouche permettant de passer à l'objet suivant de l'œuvre d'art (Enum.KeyCode).Droite
prevPageKeyTouche permettant de revenir à la page précédente de l'œuvre d'art (Enum.KeyCode).Q
prevItemKeyTouche permettant de revenir à l'objet précédent de l'œuvre d'art (Enum.KeyCode).Gauche
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

Renvoie toutes les toiles étiquetées avec la balise SurfaceCanvas.

Script

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

placeArt

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

Place une œuvre d'art de manière programmatique pour le compte d'un lecteur. Veuillez noter que l'objet canvas doit être étiqueté avec la balise SurfaceCanvas lors de l'initialisation du serveur. Nous vous recommandons d'utiliser cette fonction uniquement avec une toile renvoyée par 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

Supprime toutes les œuvres d'art de toutes les surfaces.

Script

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

Événements

artChanged

artChanged(canvas:BasePart, spot :Klasse.Frame<InlineCode>, spotPosition :</InlineCode>Datatype.Vector3<InlineCode>, artId :</InlineCode>Library.string<InlineCode>, ownerUserId :</InlineCode>nombre<InlineCode>):</InlineCode> DatoDatatype.RBXScriptSignal

Se déclenche lorsqu'une œuvre d'art est modifiée à un endroit particulier de la toile. Lorsqu'une œuvre d'art est supprimée, artId est nil. Veuillez noter qu'une valeur Vector3 est transmise en tant que troisième paramètre au gestionnaire d'événement afin que vous puissiez positionner un effet personnalisé à l'endroit exact où l'œuvre d'art est placée. Cet événement peut uniquement être lié dans un LocalScript.

Paramètres
toile : BasePartToile sur laquelle l'œuvre d'art a été modifiée.
spot :FrameFrame interne contenant l'œuvre d'art ImageLabel.
spotPosition : Vector3Position exacte où l'œuvre a été placée.
artId : stringID de l'élément de la nouvelle œuvre d'art.
ownerUserId : numberUserId du joueur qui a placé l'œuvre d'art.
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): DatoDatatype.RBXScriptSignal`

Se déclenche lorsqu'une invite d'interaction sur la toile est affichée à un joueur. La fonction connectée reçoit la toile sur laquelle l'invite est affichée. Cet événement peut uniquement être lié dans un LocalScript.

Paramètres
toile : BasePartToile sur laquelle le prompt apparaît.
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): DatoDatatype.RBXScriptSignal`

Se déclenche lorsqu'une invite d'interaction sur la toile est masquée. La fonction connectée reçoit la toile sur laquelle l'invite a été affichée. Cet événement peut uniquement être lié dans un LocalScript.

Paramètres
toile : BasePartToile sur laquelle le prompt s'affichait.
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() : DatoDatatype.RBXScriptSignal`

Se déclenche lorsque l'UI du sélecteur d'art de surface est présentée à un joueur. Cet événement peut uniquement être lié dans 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() : DatoDatatype.RBXScriptSignal`

Se déclenche lorsque l'UI du sélecteur d'art de la surface est masquée pour un joueur. Cet événement peut uniquement être lié dans 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)