Les joueurs aiment souvent se sentir comme s'ils faisaient partie de la construction de l'espace dans lequel ils se trouvent. Le module SurfaceArt développeur permet aux joueurs de laisser littéralement leur marque dans une expérience.
Utilisation du Module
Installation
Pour utiliser le module SurfaceArt dans une expérience :
Dans le menu Fenêtre de Studio ou la barre d'outils de l'onglet Accueil, ouvrez le Toolbox et sélectionnez l'onglet Boutique Créateur.

Assurez-vous que le tri Modèles est sélectionné, puis cliquez sur le bouton Voir Tout pour Catégories.

Localisez et cliquez sur le carreau Packages.
Localisez le module Art de Surface et cliquez dessus, ou faites-le glisser dans la vue 3D.

Dans la fenêtre Explorateur, déplacez le modèle SurfaceArt entier dans ReplicatedStorage. Lorsque l'expérience sera exécutée, le module commencera à fonctionner.
Positionnement de la Toile
Le module est livré avec un modèle SurfaceCanvas que vous pouvez positionner dans le monde 3D. Ce modèle est celui avec lequel les joueurs interagiront pour placer de l'art sur sa surface.
Localisez le maillage SurfaceCanvas dans le dossier Workspace du dossier principal du module.

Déplacez-le dans la hiérarchie Workspace de premier niveau et positionnez-le où vous le souhaitez.

Lors de la publication/de l'exécution d'une session de test, les joueurs pourront interagir avec l'objet via un ProximityPrompt et placer de l'art sur la surface définie.

Changement de la Face de la Toile
Sur le plan technique, le module utilise un SurfaceGui pour afficher les éléments d'art. Pour configurer quelle surface l'art apparaît :
Sélectionnez le maillage SurfaceCanvas.
En bas de la fenêtre Propriétés, localisez l'attribut SurfaceCanvasFace avec une valeur par défaut de Droite.

Cliquez sur l'attribut et entrez l'une des six valeurs qui décrivent un Enum.NormalId.
| Valeur d'Attribut | ID Normal Correspondant |
|---|---|
| Avant | Enum.NormalId.Front |
| Arrière | Enum.NormalId.Back |
| Droite | Enum.NormalId.Right |
| Gauche | Enum.NormalId.Left |
| Haut | Enum.NormalId.Top |
| Bas | Enum.NormalId.Bottom |
Utilisation d'Actifs d'Art Personnalisés
Pour mieux s'adapter au thème de votre expérience, vous pouvez utiliser votre propre ensemble d'actifs personnalisés au lieu des valeurs par défaut. Cela peut être fait via la fonction configurer, appelée depuis un Script dans ServerScriptService.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)local customAssets = {CustomAsset1 = {name = "Actif Personnalisé 1",assetId = "rbxassetid://7322508294",},CustomAsset2 = {name = "Actif Personnalisé 2",assetId = "rbxassetid://7322547665",},}SurfaceArt.configure({assets = customAssets,})
Effacer Tous les Toiles
Pour retirer tout l'art existant de toutes les toiles dans le monde, appelez la fonction removeAllArt depuis un Script.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.removeAllArt()
Affichage d'Effets Personnalisés
Il peut y avoir des cas où vous souhaitez 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 que vous pouvez connecter et ajouter votre propre logique.
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
-- Montre quelques étincelles pendant 3 secondes
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 comme art pour la toile sont représentées par une table avec deux valeurs.
| Clé | Description |
|---|---|
| name | Nom d'affichage des métadonnées. |
| assetId | ID d'actif de l'image à inclure. |
Fonctions
configurer
configurer(config: table)
Remplace les options de configuration par défaut à travers les différentes clés/valeurs dans la table config. Cette fonction ne peut être appelée que depuis un Script.
| Clé | Description | Par défaut |
|---|---|---|
| enabled | Active ou désactive la fonctionnalité du module. | true |
| assets | Liste des types SurfaceArtAsset. | (voir code ci-dessous) |
| quotaPerPlayer | Nombre maximum de pièces d'art pouvant être placées par chaque joueur. | 2 |
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.configure({quotaPerPlayer = 4,promptKeyCode = Enum.KeyCode.T,promptMaxActivationDistance = 8,})
getCanvases
getCanvases(): table
Renvoie toutes les toiles marquées avec l'étiquette SurfaceCanvas.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)local canvases = SurfaceArt.getCanvases()
placeArt
Place une pièce d'art par programmation au nom d'un joueur. Notez que l'objet canvas doit être marqué avec l'étiquette SurfaceCanvas lors de l'initialisation du serveur. Il est recommandé de n'utiliser cela qu'avec une toile retournée par getCanvases.
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
local remoteEvent = ReplicatedStorage:WaitForChild("SurfaceArtRemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player)
-- Place le Bloxy Award des actifs d'art par défaut dans la première toile
local canvases = SurfaceArt.getCanvases()
SurfaceArt.placeArt(player, canvases[1], "BloxyAward")
end)
removeAllArt
removeAllArt()
Supprime toutes les œuvres d'art de toutes les surfaces.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.removeAllArt()
Événements
artChanged
Se déclenche lorsqu'une œuvre d'art est changée à un endroit particulier sur une toile. Lorsqu'une œuvre d'art est supprimée, artId sera nil. Notez qu'une valeur Vector3 est passée comme troisième paramètre au gestionnaire d'événements 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 connecté dans un LocalScript.
| Paramètres | |
|---|---|
| canvas: BasePart | Toile sur laquelle l'œuvre d'art a été changée. |
| spot: Frame | Frame interne qui contient le ImageLabel de l'œuvre d'art. |
| spotPosition: Vector3 | Position exacte où l'œuvre d'art a été placée. |
| artId: string | ID d'actif de la nouvelle œuvre d'art. |
| ownerUserId: number | UserId du joueur qui a placé l'art. |
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.artChanged:Connect(function(canvas, spot, spotPosition, artId, ownerId)
print("Art placé à:", spotPosition)
print("ID d'art d'actif:", artId)
print("Art placé par:", ownerId)
end)
promptShown
Se déclenche lorsqu'une invite d'interaction de la toile est montrée à un joueur. La fonction connectée reçoit la toile sur laquelle l'invite est affichée. Cet événement ne peut être connecté que dans un LocalScript.
| Paramètres | |
|---|---|
| canvas: BasePart | Toile sur laquelle l'invite est affichée. |
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
Se déclenche lorsqu'une invite d'interaction de la toile est masquée. La fonction connectée reçoit la toile sur laquelle l'invite était affichée. Cet événement ne peut être connecté que dans un LocalScript.
| Paramètres | |
|---|---|
| canvas: BasePart | Toile sur laquelle l'invite était affichée. |
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
Se déclenche lorsque l'interface utilisateur du sélecteur d'art de surface est montrée à un joueur. Cet événement peut seulement être connecté dans un LocalScript.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.selectorShown:Connect(function()
print(Players.LocalPlayer, "ouvert sélecteur d'art de surface")
end)
selectorHidden
Se déclenche lorsque l'interface utilisateur du sélecteur d'art de surface est masquée pour un joueur. Cet événement peut seulement être connecté dans un LocalScript.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.selectorHidden:Connect(function()
print(Players.LocalPlayer, "fermé sélecteur d'art de surface")
end)