玩家经常会感觉像他们是空间中的一部分。 地面艺术 开发者模块 让玩家在体验中留下他们的标记。
模块使用
安装
要在体验中使用 表面艺术 模块:
确保 模型排序 已选择,然后单击 查看所有 按钮为 类别 。
找到并单击 开发者模块 地瓦片。
找到 地面艺术 模块,然后单击它,或者拖放到3D视查看中。
在 Explorer 窗口中,将整个 表面艺术 模型移入 ServerScriptService 。运行体验时,模块将分配到各个服务并开始运行。
将画布放置
模块包含一个 地面画板 模型,您可以将它放置在 3D 世界中。这是玩家与放置艺术品面对面的交互界面。
找到模块的主文件夹 工作区 的 表面 canvas 网格。
将其移动到顶级 工作区 层级,并将其放置在您想要的位置。
发布/运行测试会话时,玩家将能够通过 ProximityPrompt 与对象互动,并且在指定的表面上放置艺术。
改变画布面
在引擎盖下,模块使用 SurfaceGui 来显示艺术物品。 要配置艺术物品在哪个表面上显示:
选择 地面画板 网格。
在 属性 窗口的底部,找到一个默认值为 右 的 地面 canvas 面 属性。
单击属性,输入六个描述 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。 |
函数
配置
通过 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
返回所有标有 SurfaceCanvas 标签的画布。
脚本
local ReplicatedStorage = game:GetService("ReplicatedStorage")local SurfaceArt = require(ReplicatedStorage:WaitForChild("SurfaceArt"))local canvases = SurfaceArt.getCanvases()
放置艺术
为玩家代表程序化地将一件艺术品放置在。 注意,当服务器初始化时,必须标记 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: 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 | 可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)