Pemain sering kali menikmati merasa bahwa mereka adalah bagian dari pembangunan ruang yang mereka masuki. Modul SurfaceArt pengembang memungkinkan pemain meninggalkan jejak mereka di dalam pengalaman.
Penggunaan Modul
Instalasi
Untuk menggunakan modul SurfaceArt dalam sebuah pengalaman:
Dari menu Window Studio atau toolbar tab Home, buka Toolbox dan pilih tab Creator Store.

Pastikan pemfilteran Models dipilih, lalu klik tombol See All untuk Categories.

Temukan dan klik ubin Packages.
Temukan modul Seni Permukaan dan kliknya, atau seret-dan-lepas ke dalam tampilan 3D.

Di jendela Explorer, pindahkan seluruh model SurfaceArt ke ReplicatedStorage. Saat pengalaman dijalankan, modul akan mulai berjalan.
Memposisikan Kanvas
Modul ini dilengkapi dengan satu model SurfaceCanvas yang dapat Anda posisikan di dunia 3D. Model ini adalah yang akan berinteraksi dengan pemain untuk menempatkan seni di permukaannya.
Temukan mesh SurfaceCanvas di dalam folder Workspace dari folder utama modul.

Pindahkan ke hirarki Workspace tingkat atas dan posisikan di tempat yang diinginkan.

Setelah menerbitkan/melakukan sesi pengujian, pemain akan dapat berinteraksi dengan objek melalui ProximityPrompt dan menempatkan seni di permukaan yang telah ditentukan.

Mengubah Wajah Kanvas
Di balik layar, modul ini menggunakan SurfaceGui untuk menampilkan item seni. Untuk mengonfigurasi permukaan mana yang akan muncul seni:
Pilih mesh SurfaceCanvas.
Di bagian bawah jendela Properties, temukan atribut SurfaceCanvasFace dengan nilai default Right.

Klik atribut dan masukkan salah satu dari enam nilai yang mendeskripsikan Enum.NormalId.
| Nilai Atribut | ID Normal yang Sesuai |
|---|---|
| Front | Enum.NormalId.Front |
| Back | Enum.NormalId.Back |
| Right | Enum.NormalId.Right |
| Left | Enum.NormalId.Left |
| Top | Enum.NormalId.Top |
| Bottom | Enum.NormalId.Bottom |
Menggunakan Aset Seni Kustom
Untuk lebih mencocokkan tema pengalaman Anda, Anda dapat menggunakan kumpulan aset kustom Anda sendiri alih-alih yang default. Ini dapat dilakukan melalui fungsi configure, yang dipanggil dari Script di ServerScriptService.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)local customAssets = {CustomAsset1 = {name = "Aset Kustom 1",assetId = "rbxassetid://7322508294",},CustomAsset2 = {name = "Aset Kustom 2",assetId = "rbxassetid://7322547665",},}SurfaceArt.configure({assets = customAssets,})
Menghapus Semua Kanvas
Untuk menghapus semua karya seni yang ada dari semua kanvas di dunia, panggil fungsi removeAllArt dari Script.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.removeAllArt()
Menampilkan Efek Kustom
Mungkin ada kasus di mana Anda ingin menyertakan efek visual tambahan ketika sebuah karya seni ditempatkan. Modul ini mengekspos sebuah acara yang disebut artChanged di klien yang dapat Anda sambungkan dan tambahkan logika Anda sendiri.
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
-- Tampilkan beberapa kilauan selama 3 detik
task.spawn(function()
local emitterAttachment = createParticleEmitter(canvas, spotPosition)
task.wait(3)
emitterAttachment:Destroy()
end)
end
end)
Referensi API
Jenis
SurfaceArtAsset
Gambar yang digunakan sebagai seni untuk kanvas diwakili oleh tabel dengan dua nilai.
| Kunci | Deskripsi |
|---|---|
| name | Nama tampilan metadata. |
| assetId | ID Aset dari gambar yang akan disertakan. |
Fungsi
configure
configure(config: table)
Mengganti opsi konfigurasi default melalui kunci/nilai berikut di tabel config. Fungsi ini hanya dapat dipanggil dari Script.
| Kunci | Deskripsi | Default |
|---|---|---|
| enabled | Mengaktifkan atau menonaktifkan fungsionalitas modul. | true |
| assets | Daftar jenis SurfaceArtAsset. | (lihat kode di bawah) |
| quotaPerPlayer | Jumlah maksimal karya seni yang dapat ditempatkan oleh setiap pemain. | 2 |
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.configure({quotaPerPlayer = 4,promptKeyCode = Enum.KeyCode.T,promptMaxActivationDistance = 8,})
getCanvases
getCanvases(): table
Mengembalikan semua kanvas yang diberi tag dengan tag SurfaceCanvas.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)local canvases = SurfaceArt.getCanvases()
placeArt
Menempatkan satu karya seni secara programatik atas nama seorang pemain. Perhatikan bahwa objek canvas harus diberi tag dengan tag SurfaceCanvas saat server diinisialisasi. Disarankan untuk menggunakan ini hanya dengan kanvas yang dikembalikan dari getCanvases.
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
local remoteEvent = ReplicatedStorage:WaitForChild("SurfaceArtRemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player)
-- Tempatkan Penghargaan Bloxy dari aset seni default ke kanvas pertama
local canvases = SurfaceArt.getCanvases()
SurfaceArt.placeArt(player, canvases[1], "BloxyAward")
end)
removeAllArt
removeAllArt()
Menghapus semua karya seni dari semua permukaan.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.removeAllArt()
Acara
artChanged
Ditembak saat sebuah karya seni diubah pada lokasi tertentu di kanvas. Ketika sebuah karya seni dihapus, artId akan nil. Perhatikan bahwa nilai Vector3 diteruskan sebagai parameter ketiga ke handler acara sehingga Anda dapat menempatkan efek kustom di posisi tepat di mana karya seni tersebut ditempatkan. Acara ini hanya dapat dihubungkan di dalam LocalScript.
| Parameter | |
|---|---|
| canvas: BasePart | Kanvas tempat karya seni diubah. |
| spot: Frame | Internal Frame yang berisi ImageLabel karya seni. |
| spotPosition: Vector3 | Posisi tepat di mana karya seni ditempatkan. |
| artId: string | ID Aset dari karya seni baru. |
| ownerUserId: number | ID Pengguna dari pemain yang menempatkan seni. |
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.artChanged:Connect(function(canvas, spot, spotPosition, artId, ownerId)
print("Seni ditempatkan di:", spotPosition)
print("ID aset seni:", artId)
print("Seni ditempatkan oleh:", ownerId)
end)
promptShown
Ditembak saat prompt interaksi kanvas ditampilkan kepada pemain. Fungsi yang terhubung menerima kanvas tempat prompt ditampilkan. Acara ini hanya dapat dihubungkan di dalam LocalScript.
| Parameter | |
|---|---|
| canvas: BasePart | Kanvas tempat prompt ditampilkan. |
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
Ditembak saat prompt interaksi kanvas disembunyikan. Fungsi yang terhubung menerima kanvas tempat prompt ditampilkan. Acara ini hanya dapat dihubungkan di dalam LocalScript.
| Parameter | |
|---|---|
| canvas: BasePart | Kanvas tempat prompt ditampilkan. |
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
Ditembak saat UI pemilih seni permukaan ditampilkan kepada pemain. Acara ini hanya dapat dihubungkan di dalam LocalScript.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.selectorShown:Connect(function()
print(Players.LocalPlayer, "membuka pemilih seni permukaan")
end)
selectorHidden
Ditembak saat UI pemilih seni permukaan disembunyikan untuk pemain. Acara ini hanya dapat dihubungkan di dalam LocalScript.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.selectorHidden:Connect(function()
print(Players.LocalPlayer, "menutup pemilih seni permukaan")
end)