ผู้เล่นมักจะรู้สึกสนุกที่ได้เป็นส่วนหนึ่งในการสร้างพื้นที่ที่พวกเขาอยู่ โมดูล SurfaceArt โมดูลสำหรับนักพัฒนา ช่วยให้ผู้เล่นสามารถทิ้งร่องรอยไว้ในประสบการณ์ได้จริงๆ
การใช้งานโมดูล
การติดตั้ง
ในการใช้โมดูล SurfaceArt ในประสบการณ์:
จากเมนู Window ใน Studio หรือแถบเครื่องมือ Home ให้เปิด Toolbox และเลือกแท็บ Creator Store

ตรวจสอบให้แน่ใจว่าได้เลือกการจัดเรียง Models แล้วคลิกปุ่ม ดู ทั้งหมด สำหรับ หมวดหมู่

ค้นหาและคลิกที่แถบ Packages
ค้นหาโมดูล Surface Art และคลิกที่มัน หรือทำการลากและวางมันลงในมุมมอง 3D

ในหน้าต่าง Explorer ให้ย้ายโมเดล SurfaceArt ทั้งหมดไปยัง ReplicatedStorage เมื่อเริ่มรันประสบการณ์ โมดูลจะเริ่มทำงาน
การจัดวางผ้าใบ
โมดูลมาพร้อมกับโมเดล SurfaceCanvas หนึ่งชุดที่คุณสามารถจัดวางในโลก 3D โมเดลนี้คือสิ่งที่ผู้เล่นจะมีปฏิสัมพันธ์ด้วยเพื่อวางศิลปะบนพื้นผิวของมัน
ค้นหาเมช SurfaceCanvas ภายในโฟลเดอร์ Workspace ของโฟลเดอร์หลักของโมดูล

ย้ายมันไปยังลำดับชั้น Workspace ระดับสูงสุดและจัดวางที่ต้องการ

เมื่อเผยแพร่/รันการทดสอบ ผู้เล่นจะสามารถมีปฏิสัมพันธ์กับวัตถุผ่าน ProximityPrompt และวางศิลปะบนพื้นผิวที่กำหนด

การเปลี่ยนพื้นผิวของผ้าใบ
ภายใต้พื้นผิว โมดูลใช้ SurfaceGui เพื่อแสดงไอเท็มศิลปะ เพื่อกำหนดว่าศิลปะจะแสดงที่พื้นผิวใด:
เลือกเมช SurfaceCanvas
ที่ด้านล่างของหน้าต่าง Properties ค้นหาแอตทริบิวต์ SurfaceCanvasFace พร้อมค่าดีฟอลต์คือ Right

คลิกที่แอตทริบิวต์และใส่หนึ่งในค่าหกค่าที่อธิบายถึง Enum.NormalId
| ค่าแอตทริบิวต์ | หมายเลข 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 |
การใช้สินทรัพย์ศิลปะที่กำหนดเอง
เพื่อให้เข้ากับธีมของประสบการณ์ของคุณ คุณสามารถใช้ชุดสินทรัพย์ที่กำหนดเองแทนค่าเริ่มต้นได้ สิ่งนี้สามารถทำได้ผ่านฟังก์ชัน configure ที่เรียกจาก Script ใน ServerScriptService
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)local customAssets = {CustomAsset1 = {name = "สินทรัพย์ที่กำหนดเอง 1",assetId = "rbxassetid://7322508294",},CustomAsset2 = {name = "สินทรัพย์ที่กำหนดเอง 2",assetId = "rbxassetid://7322547665",},}SurfaceArt.configure({assets = customAssets,})
การล้างผ้าใบทั้งหมด
เพื่อเอาศิลปะทั้งหมดออกจากผ้าใบทั้งหมดในโลก ให้เรียกฟังก์ชัน removeAllArt จาก Script
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.removeAllArt()
การแสดงผลกระทบที่กำหนดเอง
อาจมีกรณีที่คุณต้องการรวมเอฟเฟกต์ภาพเพิ่มเติมเมื่อมีการวางงานศิลปะ โมดูลนี้เปิดเผยอีเวนต์เรียกว่า artChanged บนไคลเอนต์ที่คุณสามารถเชื่อมต่อและเพิ่มตรรกะของคุณเอง
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
-- แสดงประกายระยะเวลา 3 วินาที
task.spawn(function()
local emitterAttachment = createParticleEmitter(canvas, spotPosition)
task.wait(3)
emitterAttachment:Destroy()
end)
end
end)
เอกสารอ้างอิง API
ประเภท
SurfaceArtAsset
ภาพที่จะใช้เป็นศิลปะสำหรับผ้าใบถูกแทนด้วยตารางที่มีสองค่า
| กุญแจ | คำอธิบาย |
|---|---|
| name | ชื่อแสดงเมตาดาต้า |
| assetId | หมายเลข ID ของสินทรัพย์ภาพที่จะรวมไว้ |
ฟังก์ชัน
configure
configure(config: table)
เขียนทับตัวเลือกการกำหนดค่าดีฟอลต์ผ่านกุญแจ/ค่าต่อไปนี้ในตาราง config ฟังก์ชันนี้สามารถเรียกได้จาก Script เท่านั้น
| กุญแจ | คำอธิบาย | ดีฟอลต์ |
|---|---|---|
| enabled | เปิดหรือลบใช้งานของโมดูล | true |
| assets | รายการของประเภท SurfaceArtAsset | (ดู โค้ด ด้านล่าง) |
| quotaPerPlayer | จำนวนสูงสุดของชิ้นงานศิลปะที่ผู้เล่นแต่ละคนสามารถวางได้ | 2 |
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.configure({quotaPerPlayer = 4,promptKeyCode = Enum.KeyCode.T,promptMaxActivationDistance = 8,})
getCanvases
getCanvases(): table
คืนค่าผ้าใบทั้งหมดที่ถูกแท็กด้วยแท็ก SurfaceCanvas
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)local canvases = SurfaceArt.getCanvases()
placeArt
วางชิ้นงานศิลปะในฐานะตัวแทนของผู้เล่น โปรดทราบว่าอ็อบเจ็กต์ canvas จะต้องถูกแท็กด้วยแท็ก SurfaceCanvas เมื่อเซิร์ฟเวอร์ถูกเริ่มต้น ซึ่งแนะนำให้ใช้เฉพาะกับผ้าใบที่ส่งกลับจาก getCanvases
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
local remoteEvent = ReplicatedStorage:WaitForChild("SurfaceArtRemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player)
-- วางรางวัล Bloxy จากสินทรัพย์ศิลปะเริ่มต้นในผ้าใบแรก
local canvases = SurfaceArt.getCanvases()
SurfaceArt.placeArt(player, canvases[1], "BloxyAward")
end)
removeAllArt
removeAllArt()
ลบงานศิลปะทั้งหมดจากพื้นผิวทั้งหมด
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage.SurfaceArt)SurfaceArt.removeAllArt()
อีเวนต์
artChanged
เกิดขึ้นเมื่อมีการเปลี่ยนงานศิลปะที่ตำแหน่งเฉพาะบนผ้าใบ เมื่อมีการลบนงานศิลปะ artId จะเป็น nil โปรดทราบว่าค่าของ Vector3 จะถูกส่งเป็นพารามิเตอร์ที่สามไปยังตัวจัดการอีเวนต์เพื่อให้คุณสามารถจัดตำแหน่ง เอฟเฟกต์ที่กำหนดเอง ที่ตำแหน่งที่แน่นอนที่งานศิลปะถูกวางไว้ อีเวนต์นี้สามารถเชื่อมต่อได้เฉพาะใน LocalScript
| พารามิเตอร์ | |
|---|---|
| canvas: BasePart | ผ้าใบที่งานศิลปะถูกเปลี่ยน |
| spot: Frame | Frame ภายในที่เก็บงานศิลปะ ImageLabel |
| spotPosition: Vector3 | ตำแหน่งที่แน่นอนที่งานศิลปะถูกวางไว้ |
| artId: string | หมายเลข ID ของงานศิลปะใหม่ |
| ownerUserId: number | UserId ของผู้เล่นที่วางศิลปะ |
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.artChanged:Connect(function(canvas, spot, spotPosition, artId, ownerId)
print("งานศิลปะที่วางที่:", spotPosition)
print("หมายเลข ID ศิลปะ:", artId)
print("งานศิลปะที่วางโดย:", ownerId)
end)
promptShown
เกิดขึ้นเมื่อแสดงข้อความแจ้งปฏิสัมพันธ์ของผ้าใบต่อผู้เล่น ฟังก์ชันที่เชื่อมต่อจะได้รับผ้าใบที่ข้อความแจ้งนั้นแสดงอยู่ อีเวนต์นี้สามารถเชื่อมต่อได้เฉพาะใน LocalScript
| พารามิเตอร์ | |
|---|---|
| canvas: BasePart | ผ้าใบที่ข้อความแจ้งนั้นแสดงอยู่ |
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
เกิดขึ้นเมื่อข้อความแจ้งปฏิสัมพันธ์ของผ้าใบถูกซ่อน ฟังก์ชันที่เชื่อมต่อจะได้รับผ้าใบที่ข้อความแจ้งนั้นแสดงอยู่ อีเวนต์นี้สามารถเชื่อมต่อได้เฉพาะใน LocalScript
| พารามิเตอร์ | |
|---|---|
| canvas: BasePart | ผ้าใบที่ข้อความแจ้งนั้นแสดงอยู่ |
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
เกิดขึ้นเมื่อ UI ตัวเลือกศิลปะพื้นผิวแสดงให้ผู้เล่นเห็น อีเวนต์นี้สามารถเชื่อมต่อได้เฉพาะใน LocalScript
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.selectorShown:Connect(function()
print(Players.LocalPlayer, "เปิดตัวเลือกศิลปะพื้นผิว")
end)
selectorHidden
เกิดขึ้นเมื่อ UI ตัวเลือกศิลปะพื้นผิวถูกซ่อนสำหรับผู้เล่น อีเวนต์นี้สามารถเชื่อมต่อได้เฉพาะใน LocalScript
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage.SurfaceArt)
SurfaceArt.selectorHidden:Connect(function()
print(Players.LocalPlayer, "ปิดตัวเลือกศิลปะพื้นผิว")
end)