玩家通常會喜歡感覺像是他們身處在建造這個空間的過程中的一部分。 地面藝術 開發模組 讓玩家在體驗中留下他們的標記。
模組使用
安裝
要在體驗中使用 表面藝術 模組:
確認 模型排序 已選擇,然後按一下 查看全部 按鈕 for 類別 。
找到並點擊 Dev Modules 磚塊。
找到 地面藝術 模組並點擊它,或將它拖曳到 3D 檢視窗中。
在 Explorer 窗口中,將整個 表面藝術 模型移動到 ServerScriptService 中。執行體驗時,模組將分配到各個服務並開始執行。
正在放置畫布
模組包含一個 地面繪製器 模型,您可以將它放置在 3D 世界中。這個模型是玩家與您交互的地方,您可以在它上面放置藝術。
找到模組主頁面的 表面描述器 網格內的 表面 canvas 網格。
將它移動到 工作區 的頂層,並將其放置在所需位置。
發布/執行測試會作業時,玩家將能夠通過 ProximityPrompt 與對象互動並在指定的表面上放置藝術。
變更 Canvas 面
在引擎蓋下,模組使用 SurfaceGui 來顯示藝術項目。要設定哪個表面藝術會顯示:
選擇 地面繪製器 網格。
在 屬性 窗口的底部,找到 地面繪製器面 屬性,以預設值 右 為值。
單擊屬性並輸入六個值之一,描述 Enum.NormalId。
屬性值 | 相應的普通ID |
---|---|
前方 | Enum.NormalId.Front |
返回 | Enum.NormalId.Back |
右 | Enum.NormalId.Right |
左 | Enum.NormalId.Left |
最上方 | Enum.NormalId.Top |
底部 | Enum.NormalId.Bottom |
使用自訂資產
為了更好地服務您的體驗主題,您可以使用自己的自訂資產,而不是預設值。這可以通過 配置 功能,從 Script 中呼叫的 ServerScriptService 來執行。
腳本
local ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))local customAssets = {CustomAsset1 = {name = "Custom Asset 1",assetId = "rbxassetid://7322508294",},CustomAsset2 = {name = "Custom Asset 2",assetId = "rbxassetid://7322547665",},}SurfaceArt.configure({assets = customAssets,})
清除所有畫布
要從世界上的所有畫布上移除所有現有藝術,請從 Class.Script 中呼叫 Script 函數。
腳本
local ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))SurfaceArt.removeAllArt()
顯示自訂效果
有時候您想要在放置作品時包含額外的視覺效果。這個模塊會在客戶端上展示一個名為 artChanged 的事件,您可以連接到並添加自己的論理。
本地指令碼
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage:WaitForChild("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 參考
類型
地面藝術資產
用於畫布的圖像以兩個值表示。
鑰匙 | 說明 |
---|---|
name | 金屬標籤顯示名稱。 |
assetId | 包含圖像的資產 ID。 |
功能
設定
在 config 表中,通過以下鍵值/值來偽裝預設設定選項。此功能只能從 Script 中呼叫。
鑰匙 | 說明 | 預設 |
---|---|---|
enabled | 切換模組的功能開關。 | 真的 |
assets | 地面藝術資產 類型的清單。 | (請參閱下方的代碼) |
quotaPerPlayer | 每個玩家可以放置的藝術項目最大數量。 | 2 |
腳本
local ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))SurfaceArt.configure({quotaPerPlayer = 4,promptKeyCode = Enum.KeyCode.T,promptMaxActivationDistance = 8,})
取得 Canvases
返回所有標有 SurfaceCanvas 標籤的畫布。
腳本
local ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))local canvases = SurfaceArt.getCanvases()
放置藝術
為玩家代為程式化地放置一件藝術作品。注意, canvas 對象必須被標記為 SurfaceCanvas 標籤,當服務器初始化時。 建議您使用此功能僅用於從 getCanvases 返回的 canvas。
腳本
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))
local remoteEvent = ReplicatedStorage:WaitForChild("SurfaceArtRemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player)
-- 將預設的藝術資產放入第一個畫布
local canvases = SurfaceArt.getCanvases()
SurfaceArt.placeArt(player, canvases[1], "BloxyAward")
end)
移除所有藝術
移除所有表面的所有藝術。
腳本
local ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))SurfaceArt.removeAllArt()
事件
art變更
當畫作在 canvas的特定位置變更時發射。當畫作被移除時,artId 會變成nil。注意,Vector3 值作為第三個參數傳送給事件處理器,因此您可以在畫作放置的正確
參數 | |
---|---|
canvas:BasePart | 可以在此上漆改作品。 |
點: Frame | 內部 Frame 包含藝術 ImageLabel 。 |
點位位置: Vector3 | 放置藝術品的正確位置。 |
artId:string | 新藝術品的資產ID。 |
所有者UID: number | UserId 的玩家,放置了藝術。 |
本地指令碼
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))
SurfaceArt.artChanged:Connect(function(canvas, spot, spotPosition, artId, ownerId)
print("Art placed at:", spotPosition)
print("Art asset ID:", artId)
print("Art placed by:", ownerId)
end)
提示顯示
在玩家看到可選擇的畫布交互提示時發生時爐。連接的函數會在提示顯示的畫布上收到畫布。此事件只能在 LocalScript 中連接。
參數 | |
---|---|
canvas:BasePart | 可以在此輸入提示。 |
本地指令碼
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))
SurfaceArt.promptShown:Connect(function(canvas)
print(Players.LocalPlayer, canvas)
end)
提示隱藏
當畫布交互提示隱藏時,發射。連接的函數將畫布傳送到指定的位置。此事件只能連接在 LocalScript 中。
參數 | |
---|---|
canvas:BasePart | 可以在此輸入提示。 |
本地指令碼
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))
SurfaceArt.promptClosed:Connect(function(canvas)
print(Players.LocalPlayer, canvas)
end)
顯示器
在玩家看到表面藝術選擇器 UI 時發生。此事件只能在 LocalScript 中連接。
本地指令碼
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))
SurfaceArt.selectorShown:Connect(function()
print(Players.LocalPlayer, "opened surface art selector")
end)
選擇器隱藏
隨著表面藝術選擇器 UI 隱藏時發生。此事件只能連接在 LocalScript 中。
本地指令碼
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))
SurfaceArt.selectorHidden:Connect(function()
print(Players.LocalPlayer, "closed surface art selector")
end)