表面艺术

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

玩家经常会感觉像他们是空间中的一部分。 地面艺术 开发者模块 让玩家在体验中留下他们的标记。

模块使用

安装

要在体验中使用 表面艺术 模块:

  1. 视图选项卡打开工具箱并选择 创建者商店 选项卡。

    Toolbox toggle button in Studio
  2. 确保 模型排序 已选择,然后单击 查看所有 按钮为 类别

  3. 找到并单击 开发者模块 地瓦片。

  4. 找到 地面艺术 模块,然后单击它,或者拖放到3D视查看中。

  5. Explorer 窗口中,将整个 表面艺术 模型移入 ServerScriptService 。运行体验时,模块将分配到各个服务并开始运行。

将画布放置

模块包含一个 地面画板 模型,您可以将它放置在 3D 世界中。这是玩家与放置艺术品面对面的交互界面。

  1. 找到模块的主文件夹 工作区 的 表面 canvas 网格。

  2. 将其移动到顶级 工作区 层级,并将其放置在您想要的位置。

  3. 发布/运行测试会话时,玩家将能够通过 ProximityPrompt 与对象互动,并且在指定的表面上放置艺术。

改变画布面

在引擎盖下,模块使用 SurfaceGui 来显示艺术物品。 要配置艺术物品在哪个表面上显示:

  1. 选择 地面画板 网格。

  2. 属性 窗口的底部,找到一个默认值为 地面 canvas 面 属性。

  3. 单击属性,输入六个描述 Enum.NormalId 的值之一。

属性值相应的普通ID
前端 Enum.NormalId.Front
返回 Enum.NormalId.Back
右侧 Enum.NormalId.Right
左侧 Enum.NormalId.Left
顶部 Enum.NormalId.Top
底部 Enum.NormalId.Bottom

使用自定义艺术资产

为了更好地融入您的体验主题,您可以使用您自己的自定义资产,而不是默认资产。这可以通过 配置 函数,从 Script 中调用。

脚本

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。

函数

配置

配置(配: table )

通过 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,
})

获取可vas

getCanvases():table

返回所有标有 SurfaceCanvas 标签的画布。

脚本

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))
local canvases = SurfaceArt.getCanvases()

放置艺术

放置艺术(玩家layer: Player , canvas: BasePart )

为玩家代表程序化地将一件艺术品放置在。 注意,当服务器初始化时,必须标记 canvas 标签,当服务器初始化时。 它是建议使用此只用于返回 SurfaceCanvas 的 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变更

当画作在画布上的特定位置更改时,它会发生。当画作被移除时,artId 将被nil。 注意,Vector3 值作为第三个参数传递给事件处理器,因此您可以在画作放置的正确位置设置

参数
canvas:BasePart可vas上的艺术品。
地点: Frame内部 Frame 包含艺术品 ImageLabel
位置:Vector3艺术品放置的准确位置。
artId:string新艺术品的资产ID。
拥有者 UserID: numberUserId 的玩家,放置了艺术品。
本地脚本

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可vas上,该提示正在显示。
本地脚本

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可vas上,该提示正在显示。
本地脚本

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)

选择器显示

在玩家看到表面艺术选择器用户界面时触发。 此事件只能在 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)

选择器隐藏

当表面艺术选择器用玩家界面隐藏时,发生。 此事件只能连接在一个 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)