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

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

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

Di jendela Explorer, pindahkan seluruh model SurfaceArt ke dalam ReplicatedStorage. Setelah menjalankan permainan, 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 hierarki Workspace tingkat atas dan posisikan di tempat yang diinginkan.

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

Mengubah Sisi Kanvas
Di balik layar, modul ini menggunakan SurfaceGui untuk menampilkan item seni. Untuk mengonfigurasi sisi mana seni muncul:
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 menggambarkan 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 sesuai dengan tema permainan Anda, Anda dapat menggunakan set aset kustom Anda sendiri alih-alih yang default. Ini dapat dilakukan melalui fungsi configure, yang dipanggil dari Script di ServerScriptService.
local 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 seni yang ada dari semua kanvas di dunia, panggil fungsi removeAllArt dari Script.
local 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 saat sebuah karya seni ditempatkan. Modul ini mengekspos sebuah event yang disebut artChanged di klien yang dapat Anda sambungkan dan tambahkan logika Anda sendiri.
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 percikan selama 3 detik
task.spawn(function()
local emitterAttachment = createParticleEmitter(canvas, spotPosition)
task.wait(3)
emitterAttachment:Destroy()
end)
end
end)Referensi API
Tipe
SurfaceArtAsset
Gambar yang digunakan sebagai seni untuk kanvas diwakili oleh sebuah 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 dalam tabel config. Fungsi ini hanya dapat dipanggil dari Script.
| Kunci | Deskripsi | Default |
|---|---|---|
| enabled | Menyalakan atau mematikan fungsionalitas modul. | true |
| assets | Daftar tipe SurfaceArtAsset. | (lihat kode di bawah) |
| quotaPerPlayer | Jumlah maksimum karya seni yang dapat ditempatkan oleh setiap pemain. | 2 |
local 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 ditandai dengan tag SurfaceCanvas.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
local canvases = SurfaceArt.getCanvases()placeArt
Menempatkan sebuah karya seni secara programatis atas nama seorang pemain. Perhatikan bahwa objek canvas harus ditandai dengan tag SurfaceCanvas saat server diinisialisasi. Disarankan untuk menggunakan ini hanya dengan kanvas yang dikembalikan dari getCanvases.
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.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.removeAllArt()Events
artChanged
Ditembakkan ketika sebuah karya seni diubah di lokasi tertentu pada kanvas. Ketika sebuah karya seni dihapus, artId akan menjadi nil. Perhatikan bahwa nilai Vector3 diteruskan sebagai parameter ketiga ke handler event sehingga Anda dapat menempatkan efek kustom di posisi tepat di mana karya seni ditempatkan. Event ini hanya dapat disambungkan dalam LocalScript.
| Parameter | |
|---|---|
| canvas: BasePart | Kanvas di mana karya seni diubah. |
| spot: Frame | Frame internal yang berisi ImageLabel karya seni. |
| spotPosition: Vector3 | Posisi tepat di mana karya seni ditempatkan. |
| artId: string | ID Aset dari karya seni baru. |
| ownerUserId: number | UserId dari pemain yang menempatkan seni. |
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
Ditembakkan ketika prompt interaksi kanvas ditampilkan kepada pemain. Fungsi yang terhubung menerima kanvas di mana prompt ditampilkan. Event ini hanya dapat disambungkan dalam LocalScript.
| Parameter | |
|---|---|
| canvas: BasePart | Kanvas di mana prompt ditampilkan. |
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
Ditembakkan ketika prompt interaksi kanvas disembunyikan. Fungsi yang terhubung menerima kanvas di mana prompt ditampilkan. Event ini hanya dapat disambungkan dalam LocalScript.
| Parameter | |
|---|---|
| canvas: BasePart | Kanvas di mana prompt ditampilkan. |
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
Ditembakkan ketika UI pemilih seni permukaan ditampilkan kepada pemain. Event ini hanya dapat disambungkan dalam 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
Ditembakkan ketika UI pemilih seni permukaan disembunyikan untuk pemain. Event ini hanya dapat disambungkan dalam 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)