Gracze często lubią czuć, że są częścią konstrukcji przestrzeni, w której się znajdują. Moduł SurfaceArt dewelopera pozwala graczom dosłownie zostawić swój ślad w doświadczeniu.
Użycie modułu
Instalacja
Aby użyć modułu SurfaceArt w doświadczeniu:
Z menu Okno w Studio lub paska narzędzi w zakładce Strona Główna, otwórz Toolbox i wybierz zakładkę Sklep Twórcy.

Upewnij się, że wybrano sortowanie po Modelach, a następnie kliknij przycisk Zobacz Wszystko dla Kategorii.

Zlokalizuj i kliknij kafelek Pakiety.
Zlokalizuj moduł Sztuka na Powierzchni i kliknij go, lub przeciągnij go do widoku 3D.

W oknie Eksplorator przesuń cały model SurfaceArt do ReplicatedStorage. Po uruchomieniu doświadczenia moduł zacznie działać.
Pozycjonowanie Płótna
Moduł zawiera wyrób SurfaceCanvas, który możesz umiejscowić w 3D. Model ten jest tym, z czym będą się kontaktować gracze, aby umieszczać sztukę na jego powierzchni.
Zlokalizuj siatkę SurfaceCanvas w folderze Workspace głównego folderu modułu.

Przenieś ją do hierarchii głównej Workspace i umieść w żądanym miejscu.

Po opublikowaniu/uruchomieniu sesji testowej, gracze będą mogli interagować z obiektem za pomocą ProximityPrompt i umieszczać sztukę na zdefiniowanej powierzchni.

Zmienianie Strony Płótna
W tle moduł używa SurfaceGui do wyświetlania elementów sztuki. Aby skonfigurować, na której stronie sztuka się pojawia:
Wybierz siatkę SurfaceCanvas.
Na dole okna Właściwości zlokalizuj atrybut SurfaceCanvasFace z domyślną wartością Right.

Kliknij atrybut i wpisz jedną z sześciu wartości, które opisują Enum.NormalId.
| Wartość Atrybutu | Odpowiadający Normal ID |
|---|---|
| Front | Enum.NormalId.Front |
| Back | Enum.NormalId.Back |
| Right | Enum.NormalId.Right |
| Left | Enum.NormalId.Left |
| Top | Enum.NormalId.Top |
| Bottom | Enum.NormalId.Bottom |
Używanie Niestandardowych Aspektów Sztuki
Aby lepiej dopasować do tematu twojego doświadczenia, możesz używać własnego zestawu niestandardowych zasobów zamiast domyślnych. Można to zrobić za pomocą funkcji configure, wywoływanej z Script w ServerScriptService.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)local customAssets = {CustomAsset1 = {name = "Niestandardowy Zasób 1",assetId = "rbxassetid://7322508294",},CustomAsset2 = {name = "Niestandardowy Zasób 2",assetId = "rbxassetid://7322547665",},}SurfaceArt.configure({assets = customAssets,})
Czyszczenie Wszystkich Płócien
Aby usunąć wszystkie istniejące dzieła sztuki ze wszystkich płócien na świecie, wywołaj funkcję removeAllArt z Script.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.removeAllArt()
Pokazywanie Niestandardowych Efektów
Mogą być sytuacje, w których chciałbyś dodać dodatkowe efekty wizualne, gdy dzieło sztuki jest umieszczane. Ten moduł udostępnia zdarzenie o nazwie artChanged na kliencie, do którego możesz się podłączyć i dodać swoją logikę.
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
-- Pokaż trochę iskier przez 3 sekundy
task.spawn(function()
local emitterAttachment = createParticleEmitter(canvas, spotPosition)
task.wait(3)
emitterAttachment:Destroy()
end)
end
end)
Referencja API
Typy
SurfaceArtAsset
Obrazy, które będą używane jako sztuka dla płótna, są reprezentowane przez tabelę z dwoma wartościami.
| Klucz | Opis |
|---|---|
| name | Nazwa wyświetlana metadanych. |
| assetId | ID zasobu obrazu do dołączenia. |
Funkcje
configure
configure(config: table)
Nadpisuje domyślne opcje konfiguracji przez następujące klucze/wartości w tabeli config. Ta funkcja może być wywoływana tylko z Script.
| Klucz | Opis | Domyślna wartość |
|---|---|---|
| enabled | Włącza lub wyłącza funkcjonalność modułu. | true |
| assets | Lista typów SurfaceArtAsset. | (zobacz kod poniżej) |
| quotaPerPlayer | Maksymalna liczba dzieł sztuki, które może umieścić każdy gracz. | 2 |
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.configure({quotaPerPlayer = 4,promptKeyCode = Enum.KeyCode.T,promptMaxActivationDistance = 8,})
getCanvases
getCanvases(): table
Zwraca wszystkie płótna oznaczone tagiem SurfaceCanvas.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)local canvases = SurfaceArt.getCanvases()
placeArt
Umieszcza dzieło sztuki programowo w imieniu gracza. Zauważ, że obiekt canvas musi być oznaczony tagiem SurfaceCanvas, gdy serwer jest uruchamiany. Zaleca się używać tego tylko z płótnem zwróconym z getCanvases.
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
local remoteEvent = ReplicatedStorage:WaitForChild("SurfaceArtRemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player)
-- Umieść nagrodę Bloxy z domyślnych zasobów sztuki w pierwszym płótnie
local canvases = SurfaceArt.getCanvases()
SurfaceArt.placeArt(player, canvases[1], "BloxyAward")
end)
removeAllArt
removeAllArt()
Usuwa wszystkie dzieła sztuki ze wszystkich powierzchni.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.removeAllArt()
Zdarzenia
artChanged
Wydarza się, gdy dzieło sztuki zostaje zmienione w danym miejscu na płótnie. Gdy dzieło sztuki jest usuwane, artId będzie nil. Zauważ, że wartość Vector3 jest przekazywana jako trzeci parametr do handlera zdarzeń, aby można było umieścić niestandardowy efekt dokładnie w miejscu, w którym dzieło sztuki zostało umieszczone. To zdarzenie można połączyć tylko w LocalScript.
| Parametry | |
|---|---|
| canvas: BasePart | Płótno, na którym zostało zmienione dzieło sztuki. |
| spot: Frame | Wewnętrzny Frame, który zawiera dzieło sztuki ImageLabel. |
| spotPosition: Vector3 | Dokładna pozycja, w której dzieło sztuki zostało umieszczone. |
| artId: string | ID zasobu nowego dzieła sztuki. |
| ownerUserId: number | UserId gracza, który umieścił sztukę. |
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.artChanged:Connect(function(canvas, spot, spotPosition, artId, ownerId)
print("Sztuka umieszczona w:", spotPosition)
print("ID zasobu sztuki:", artId)
print("Sztuka umieszczona przez:", ownerId)
end)
promptShown
Wydarza się, gdy podpowiedź interakcji z płótnem jest pokazywana graczowi. Połączona funkcja otrzymuje płótno, na którym podpowiedź się wyświetla. To zdarzenie można połączyć tylko w LocalScript.
| Parametry | |
|---|---|
| canvas: BasePart | Płótno, na którym podpowiedź jest wyświetlana. |
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
Wydarza się, gdy podpowiedź interakcji z płótnem jest ukrywana. Połączona funkcja otrzymuje płótno, na którym podpowiedź była wyświetlana. To zdarzenie można połączyć tylko w LocalScript.
| Parametry | |
|---|---|
| canvas: BasePart | Płótno, na którym podpowiedź była wyświetlana. |
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
Wydarza się, gdy interfejs użytkownika selektora sztuki na powierzchni jest pokazywany graczowi. To zdarzenie można połączyć tylko w LocalScript.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.selectorShown:Connect(function()
print(Players.LocalPlayer, "otworzył selektor sztuki na powierzchni")
end)
selectorHidden
Wydarza się, gdy interfejs użytkownika selektora sztuki na powierzchni jest ukrywany dla gracza. To zdarzenie można połączyć tylko w LocalScript.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.selectorHidden:Connect(function()
print(Players.LocalPlayer, "zamknął selektor sztuki na powierzchni")
end)