Spieler haben oft Freude daran, ein Teil des Raums zu sein, in dem sie sich befinden. Das SurfaceArt Entwicklermodul ermöglicht es Spielern, buchstäblich ihren Eindruck in einer Erfahrung zu hinterlassen.
Modulnutzung
Installation
Um das SurfaceArt-Modul in einer Erfahrung zu verwenden:
Öffnen Sie im Studio-Menü Fenster oder im Start-Tab die Toolbox und wählen Sie den Tab Creator Store.

Stellen Sie sicher, dass die Sortierung auf Modelle eingestellt ist, und klicken Sie auf die Schaltfläche Alle anzeigen für Kategorien.

Suchen Sie die Kachel Pakete und klicken Sie darauf.
Suchen Sie das Surface Art-Modul und klicken Sie darauf oder ziehen Sie es in die 3D-Ansicht.

Verschieben Sie das gesamte SurfaceArt-Modell im Explorer-Fenster in ReplicatedStorage. Bei Ausführung der Erfahrung wird das Modul aktiviert.
Positionierung der Leinwand
Das Modul enthält ein SurfaceCanvas-Modell, das Sie in der 3D-Welt positionieren können. Dieses Modell ist es, mit dem Spieler interagieren werden, um Kunstwerke auf seiner Oberfläche zu platzieren.
Suchen Sie das SurfaceCanvas-Mesh im Workspace-Ordner des Hauptordners des Moduls.

Verschieben Sie es in die oberste Workspace-Hierarchie und positionieren Sie es nach Belieben.

Nach der Veröffentlichung/des Testlaufs können Spieler über einen ProximityPrompt mit dem Objekt interagieren und Kunstwerke auf der definierten Oberfläche platzieren.

Ändern der Leinwandfläche
Im Hintergrund verwendet das Modul eine SurfaceGui, um Kunstwerke anzuzeigen. Um zu konfigurieren, auf welcher Fläche die Kunst erscheint:
Wählen Sie das SurfaceCanvas-Mesh aus.
Suchen Sie unten im Fenster Eigenschaften das Attribut SurfaceCanvasFace mit dem Standardwert Rechts.

Klicken Sie auf das Attribut und geben Sie einen der sechs Werte ein, die einen Enum.NormalId beschreiben.
| Attributswert | Entsprechende Normal-ID |
|---|---|
| Vorne | Enum.NormalId.Front |
| Hinten | Enum.NormalId.Back |
| Rechts | Enum.NormalId.Right |
| Links | Enum.NormalId.Left |
| Oben | Enum.NormalId.Top |
| Unten | Enum.NormalId.Bottom |
Verwendung benutzerdefinierter Kunstzuweisungen
Um das Thema Ihrer Erfahrung besser anzupassen, können Sie anstelle der Standardassets Ihre eigenen benutzerdefinierten Assets verwenden. Dies kann über die konfigurieren-Funktion erfolgen, die aus einem Script im ServerScriptService aufgerufen wird.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)local customAssets = {CustomAsset1 = {name = "Benutzerdefiniertes Asset 1",assetId = "rbxassetid://7322508294",},CustomAsset2 = {name = "Benutzerdefiniertes Asset 2",assetId = "rbxassetid://7322547665",},}SurfaceArt.configure({assets = customAssets,})
Alle Leinwände löschen
Um alle vorhandenen Kunstwerke von allen Leinwänden in der Welt zu entfernen, rufen Sie die removeAllArt-Funktion aus einem Script auf.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.removeAllArt()
Benutzerdefinierte Effekte anzeigen
Es kann Fälle geben, in denen Sie zusätzliche visuelle Effekte einfügen möchten, wenn ein Kunstwerk platziert wird. Dieses Modul stellt ein Ereignis namens artChanged auf dem Client zur Verfügung, an das Sie anschließen und Ihre eigene Logik hinzufügen können.
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
-- Zeigen Sie einige Funken für 3 Sekunden
task.spawn(function()
local emitterAttachment = createParticleEmitter(canvas, spotPosition)
task.wait(3)
emitterAttachment:Destroy()
end)
end
end)
API-Referenz
Typen
SurfaceArtAsset
Bilder, die als Kunstwerke für die Leinwand verwendet werden, werden durch eine Tabelle mit zwei Werten repräsentiert.
| Schlüssel | Beschreibung |
|---|---|
| name | Anzeige-Name der Metadaten. |
| assetId | Asset-ID des einzuschließenden Bildes. |
Funktionen
configure
configure(config: table)
Überschreibt die Standardkonfigurationsoptionen über die folgenden Schlüssel/Werte in der config-Tabelle. Diese Funktion kann nur aus einem Script aufgerufen werden.
| Schlüssel | Beschreibung | Standard |
|---|---|---|
| enabled | Schaltet die Funktionalität des Moduls ein oder aus. | true |
| assets | Liste von SurfaceArtAsset-Typen. | (siehe untenstehenden Code) |
| quotaPerPlayer | Maximale Anzahl von Kunstwerken, die jeder Spieler platzieren kann. | 2 |
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.configure({quotaPerPlayer = 4,promptKeyCode = Enum.KeyCode.T,promptMaxActivationDistance = 8,})
getCanvases
getCanvases(): table
Gibt alle Leinwände zurück, die mit dem SurfaceCanvas-Tag ausgezeichnet sind.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)local canvases = SurfaceArt.getCanvases()
placeArt
Platziert ein Kunstwerk programmgesteuert im Namen eines Spielers. Beachten Sie, dass das canvas-Objekt mit dem SurfaceCanvas-Tag ausgezeichnet sein muss, wenn der Server initialisiert wird. Es wird empfohlen, dies nur mit einer Leinwand zu verwenden, die von getCanvases zurückgegeben wird.
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
local remoteEvent = ReplicatedStorage:WaitForChild("SurfaceArtRemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player)
-- Platziere den Bloxy Award aus den Standardkunstassets in der ersten Leinwand
local canvases = SurfaceArt.getCanvases()
SurfaceArt.placeArt(player, canvases[1], "BloxyAward")
end)
removeAllArt
removeAllArt()
Entfernt alle Kunstwerke von allen Oberflächen.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.removeAllArt()
Ereignisse
artChanged
Wird ausgelöst, wenn ein Kunstwerk an einem bestimmten Ort auf einer Leinwand geändert wird. Wenn ein Kunstwerk entfernt wird, ist artId nil. Beachten Sie, dass ein Wert vom Typ Vector3 als dritter Parameter an den Ereignishandler übergeben wird, damit Sie einen benutzerdefinierten Effekt an der genauen Position positionieren können, an der das Kunstwerk platziert wurde. Dieses Ereignis kann nur in einem LocalScript verbunden werden.
| Parameter | |
|---|---|
| canvas: BasePart | Leinwand, auf der das Kunstwerk geändert wurde. |
| spot: Frame | Internes Frame, das das Kunstwerk ImageLabel enthält. |
| spotPosition: Vector3 | Genauer Ort, an dem das Kunstwerk platziert wurde. |
| artId: string | Asset-ID des neuen Kunstwerks. |
| ownerUserId: number | UserId des Spielers, der die Kunst platziert hat. |
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.artChanged:Connect(function(canvas, spot, spotPosition, artId, ownerId)
print("Kunst platziert bei:", spotPosition)
print("Kunst Asset-ID:", artId)
print("Kunst platziert von:", ownerId)
end)
promptShown
Wird ausgelöst, wenn eine Leinwandsinteraktionsaufforderung einem Spieler angezeigt wird. Die verbundene Funktion erhält die Leinwand, auf der die Aufforderung angezeigt wird. Dieses Ereignis kann nur in einem LocalScript verbunden werden.
| Parameter | |
|---|---|
| canvas: BasePart | Leinwand, auf der die Aufforderung angezeigt wird. |
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
Wird ausgelöst, wenn eine Leinwandsinteraktionsaufforderung ausgeblendet wird. Die verbundene Funktion erhält die Leinwand, auf der die Aufforderung angezeigt wurde. Dieses Ereignis kann nur in einem LocalScript verbunden werden.
| Parameter | |
|---|---|
| canvas: BasePart | Leinwand, auf der die Aufforderung angezeigt wurde. |
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
Wird ausgelöst, wenn die Oberfläche Kunstauswahl-UI einem Spieler angezeigt wird. Dieses Ereignis kann nur in einem LocalScript verbunden werden.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.selectorShown:Connect(function()
print(Players.LocalPlayer, "hat die Oberfläche Kunstauswahl geöffnet")
end)
selectorHidden
Wird ausgelöst, wenn die Oberfläche Kunstauswahl-UI für einen Spieler verborgen ist. Dieses Ereignis kann nur in einem LocalScript verbunden werden.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.selectorHidden:Connect(function()
print(Players.LocalPlayer, "hat die Oberfläche Kunstauswahl geschlossen")
end)