Người chơi thường thích cảm giác như họ là một phần trong việc xây dựng không gian mà họ đang ở. Mô-đun SurfaceArt mô-đun nhà phát triển cho phép người chơi để lại dấu ấn của họ trong một trải nghiệm.
Cách Sử Dụng Mô-đun
Cài Đặt
Để sử dụng mô-đun SurfaceArt trong một trải nghiệm:
Từ menu Cửa Sổ của Studio hoặc thanh công cụ tab Trang Chủ, mở Toolbox và chọn tab Creator Store.

Đảm bảo rằng phân loại Models đã được chọn, sau đó nhấp vào nút Xem Tất Cả cho Categories.

Tìm và nhấp vào ô Packages.
Tìm mô-đun Nghệ Thuật Bề Mặt và nhấp vào nó, hoặc kéo và thả nó vào chế độ xem 3D.

Trong cửa sổ Explorer, di chuyển toàn bộ mô hình SurfaceArt vào ReplicatedStorage. Khi chạy trải nghiệm, mô-đun sẽ bắt đầu hoạt động.
Định Vị Bảng Vẽ
Mô-đun đi kèm với một mô hình SurfaceCanvas mà bạn có thể định vị trong thế giới 3D. Mô hình này là thứ mà người chơi sẽ tương tác để đặt tác phẩm nghệ thuật lên bề mặt của nó.
Tìm lưới SurfaceCanvas bên trong thư mục Workspace của thư mục chính của mô-đun.

Di chuyển nó vào hệ thống phân cấp Workspace cấp cao nhất và định vị nó ở nơi mong muốn.

Khi xuất bản/chạy một phiên thử nghiệm, người chơi sẽ có thể tương tác với đối tượng thông qua một ProximityPrompt và đặt tác phẩm nghệ thuật lên bề mặt được xác định.

Thay Đổi Mặt Bảng Vẽ
Dưới đây, mô-đun sử dụng SurfaceGui để hiển thị các đối tượng nghệ thuật. Để cấu hình bề mặt mà nghệ thuật xuất hiện trên:
Chọn lưới SurfaceCanvas.
Ở dưới cùng của cửa sổ Thuộc Tính, tìm thuộc tính SurfaceCanvasFace với giá trị mặc định là Right.

Nhấp vào thuộc tính và nhập một trong sáu giá trị mô tả Enum.NormalId.
| Giá Trị Thuộc Tính | ID Bình Thường Tương Ứng |
|---|---|
| Mặt Trước | Enum.NormalId.Front |
| Mặt Sau | Enum.NormalId.Back |
| Mặt Phải | Enum.NormalId.Right |
| Mặt Trái | Enum.NormalId.Left |
| Mặt Trên | Enum.NormalId.Top |
| Mặt Dưới | Enum.NormalId.Bottom |
Sử Dụng Tài Nguyên Nghệ Thuật Tùy Chỉnh
Để phù hợp hơn với chủ đề của trải nghiệm của bạn, bạn có thể sử dụng bộ tài nguyên tùy chỉnh của riêng mình thay vì các tài nguyên mặc định. Điều này có thể được thực hiện thông qua hàm cấu hình, được gọi từ một Script trong ServerScriptService.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)local customAssets = {CustomAsset1 = {name = "Tài Nguyên Tùy Chỉnh 1",assetId = "rbxassetid://7322508294",},CustomAsset2 = {name = "Tài Nguyên Tùy Chỉnh 2",assetId = "rbxassetid://7322547665",},}SurfaceArt.configure({assets = customAssets,})
Xóa Tất Cả Bảng Vẽ
Để xóa tất cả nghệ thuật hiện có trên tất cả các bảng vẽ trong thế giới, gọi hàm removeAllArt từ một Script.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.removeAllArt()
Hiển Thị Hiệu Ứng Tùy Chỉnh
Có thể có trường hợp bạn muốn bao gồm hiệu ứng hình ảnh bổ sung khi một tác phẩm nghệ thuật được đặt. Mô-đun này cung cấp một sự kiện gọi là artChanged trên client mà bạn có thể kết nối và thêm logic của riêng bạn.
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
-- Hiện một số tia lửa trong 3 giây
task.spawn(function()
local emitterAttachment = createParticleEmitter(canvas, spotPosition)
task.wait(3)
emitterAttachment:Destroy()
end)
end
end)
Tài Liệu API
Loại
SurfaceArtAsset
Hình ảnh được sử dụng làm nghệ thuật cho bảng vẽ được đại diện bằng một bảng với hai giá trị.
| Khóa | Mô Tả |
|---|---|
| name | Tên hiển thị metadata. |
| assetId | ID tài sản của hình ảnh cần bao gồm. |
Hàm
configure
configure(config: table)
Ghi đè các tùy chọn cấu hình mặc định thông qua các khóa/giá trị sau trong bảng config. Hàm này chỉ có thể được gọi từ một Script.
| Khóa | Mô Tả | Mặc định |
|---|---|---|
| enabled | Bật hoặc tắt chức năng của mô-đun. | true |
| assets | Danh sách các loại SurfaceArtAsset. | (xem mã dưới đây) |
| quotaPerPlayer | Số lượng tác phẩm nghệ thuật tối đa mà mỗi người chơi có thể đặt. | 2 |
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.configure({quotaPerPlayer = 4,promptKeyCode = Enum.KeyCode.T,promptMaxActivationDistance = 8,})
getCanvases
getCanvases(): table
Trả về tất cả các bảng vẽ được gán nhãn với nhãn SurfaceCanvas.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)local canvases = SurfaceArt.getCanvases()
placeArt
Đặt một tác phẩm nghệ thuật theo cách lập trình thay mặt cho một người chơi. Lưu ý rằng đối tượng canvas phải được gán nhãn với nhãn SurfaceCanvas khi máy chủ được khởi tạo. Nên sử dụng điều này chỉ với một bảng vẽ được trả về từ getCanvases.
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
local remoteEvent = ReplicatedStorage:WaitForChild("SurfaceArtRemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player)
-- Đặt Giải Thưởng Bloxy từ các tài nguyên nghệ thuật mặc định vào bảng vẽ đầu tiên
local canvases = SurfaceArt.getCanvases()
SurfaceArt.placeArt(player, canvases[1], "BloxyAward")
end)
removeAllArt
removeAllArt()
Xóa tất cả tác phẩm nghệ thuật khỏi tất cả các bề mặt.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.removeAllArt()
Sự Kiện
artChanged
Kích hoạt khi một tác phẩm nghệ thuật được thay đổi tại một vị trí cụ thể trên bảng vẽ. Khi một tác phẩm nghệ thuật bị xóa, artId sẽ là nil. Lưu ý rằng một giá trị Vector3 được truyền dưới dạng tham số thứ ba cho hàm xử lý sự kiện để bạn có thể đặt một hiệu ứng tùy chỉnh tại vị trí chính xác nơi tác phẩm nghệ thuật được đặt. Sự kiện này chỉ có thể được kết nối trong một LocalScript.
| Tham Số | |
|---|---|
| canvas: BasePart | Bảng vẽ mà trên đó tác phẩm nghệ thuật đã được thay đổi. |
| spot: Frame | Bảng nội bộ Frame chứa ImageLabel của tác phẩm nghệ thuật. |
| spotPosition: Vector3 | Vị trí chính xác nơi tác phẩm nghệ thuật được đặt. |
| artId: string | ID tài sản của tác phẩm nghệ thuật mới. |
| ownerUserId: number | ID người dùng của người chơi đã đặt nghệ thuật (UserId). |
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.artChanged:Connect(function(canvas, spot, spotPosition, artId, ownerId)
print("Nghệ thuật được đặt tại:", spotPosition)
print("ID tài sản nghệ thuật:", artId)
print("Nghệ thuật được đặt bởi:", ownerId)
end)
promptShown
Kích hoạt khi một prompt tương tác với bảng vẽ được hiển thị cho người chơi. Hàm kết nối nhận bảng vẽ mà trên đó prompt đang hiển thị. Sự kiện này chỉ có thể được kết nối trong một LocalScript.
| Tham Số | |
|---|---|
| canvas: BasePart | Bảng vẽ mà trên đó prompt đang hiển thị. |
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
Kích hoạt khi một prompt tương tác với bảng vẽ bị ẩn. Hàm kết nối nhận bảng vẽ mà trên đó prompt đã được hiển thị. Sự kiện này chỉ có thể được kết nối trong một LocalScript.
| Tham Số | |
|---|---|
| canvas: BasePart | Bảng vẽ mà trên đó prompt đã hiển thị. |
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
Kích hoạt khi giao diện chọn nghệ thuật bề mặt được hiển thị cho người chơi. Sự kiện này chỉ có thể được kết nối trong một LocalScript.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.selectorShown:Connect(function()
print(Players.LocalPlayer, "đã mở giao diện chọn nghệ thuật bề mặt")
end)
selectorHidden
Kích hoạt khi giao diện chọn nghệ thuật bề mặt bị ẩn đối với người chơi. Sự kiện này chỉ có thể được kết nối trong một LocalScript.
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.selectorHidden:Connect(function()
print(Players.LocalPlayer, "đã đóng giao diện chọn nghệ thuật bề mặt")
end)