1 月:沙盒 3.0、约束、工具提示与 API++!
沙盒 3.0、缆绳物理约束、交互工具提示、文档改进以及脚本 API++!

欢迎阅读我们上个月最新更新的汇总!
沙盒 3.0
我们很高兴地宣布最新的沙盒更新!

本次更新为沙盒游戏模式带来了许多改进:新特性、新实体、新工具,并对 UI 及现有系统进行了全面润色。它重点关注提升用户体验,并让创作内容、实体和工具变得更有趣(也更简单)。
生成菜单
我们的生成菜单获得了大幅改进。它现在会在统一列表中展示所有物品,并按类别划分。当类别在屏幕上可见时会高亮显示。并且新增了一个搜索栏!
上下文菜单
上下文菜单是本次更新中最大的变更!
选择实体
现在,当上下文菜单打开时,你可以通过点击实体来选择和修改它们。
每个实体都有其自己的一组属性,可通过上下文菜单进行修改。你可以在自定义类中通过定义 selected_context_menu_items 属性,以编程方式进行配置。
现在,在使用生成器工具枪时将出现全新的“预览网格体”,显示你即将生成的实体的虚影预览:
向推进器实体添加属性
例如,推进器的自定义粒子可以像这样设置以显示在上下文菜单中:
Thruster.selected_context_menu_items = {
{
id = "thruster_particle_asset",
type = "select",
label = "particle",
options = Thruster.assets_list,
callback = function(value)
ContextMenu.selected_entity:CallRemoteEvent("SetParticleAsset", value)
end,
value = function()
return ContextMenu.selected_entity:GetValue("Particle")
end,
},
...
}
实体归属
我们还添加了一项新功能,悬停在实体上时会显示谁生成/编辑了该实体,方便管理和知晓创建者。

Tutorials
教程 UI 已升级,现在可以显示工具的简短描述以及工具枪使用的所有按键。

为工具添加描述和教程
你可以像这样轻松添加自定义描述和教程,它们会被教程系统自动识别:
-- 工具描述
ColorGun.description = "Paint props and objects with a selected color"
-- 工具教程
ColorGun.tutorials = {
{ key = "LeftClick", text = "paint object" },
{ key = "ContextMenu", text = "color gun settings" },
}
新实体
我们在沙盒中引入了许多有趣的新实体,后续还会推出更多!
复古相机
RetroCamera 是一款宝丽来拍立得相机,可以让你进行实时拍摄。
它使用 SceneCapture 并输出 Base64 图像,照片会立即打印在相片底片上,并在服务器端同步和持久化保存!
按钮与连接线
Button 是一个新的可按下实体,能够激活和停用其他实体:
你可以使用全新的 Wire Tool Gun 将按钮连接到其他实体。
它的实现原理是维护一份“已连接”实体的列表,并在这些实体实现了相应的方法时对其调用 :Activate() 和 :Deactivate()。
由于部分沙盒实体已经实现了这些方法,你可以将按钮用线连接至它们,打造出酷炫的集成。
你可以创建自己的实体并实现这两个方法以使其生效:
function MyEntity:Activate()
-- 开启!
end
function MyEntity:Deactivate()
-- 关闭!
end
相框
PhotoFrame 是可以显示自定义图像的新实体。它同时支持 Base64 和 URL。
Sign 与 FloatingText
我们创建了两个新实体:Sign 和 FloatingText。两者都使用新的 TextRender 类在场景中渲染文本,并且可以通过上下文菜单对文本内容进行自定义。
新工具
除了新的 Wire Gun 工具之外,我们还将在接下来的更新中添加更多工具,比如用不同物理约束来连接两端的 Ball Socket Gun、Spring Gun 和 Elastic Gun。

重构的 API
现在,所有沙盒系统都被整合并导出到一个单一的全局变量中:Sandbox。你可以从脚本中通过它访问所有沙盒系统和方法,例如 Sandbox.ContextMenu 或 Sandbox.SpawnMenu。
我们还创建并暴露了多个新的子系统,例如 Tutorials、Notifications、SpawnHistory,甚至将 WebUI 暴露为 Sandbox.WebUI。
更新的文档页面
我们更新了所有沙盒文档页面,详细说明了如何使用和集成这些新系统,快来看看吧:
沙盒游戏模式explore/sandbox-game-mode/即将推出
这只是我们沙盒 3.0 更新的开始,我们仍在开发许多新功能和改进,包括更多实体、工具与系统。
我们想要补充缺失的“输入系统”,这样玩家就能通过按键与实体进行交互了。
抢先预览一下我们正在实验的另一个工具:
交互工具提示
我们为 Prop、Weapon(Base Pickable)和 Base Vehicle 引入了全新的交互工具提示系统。当你注视这些可交互物体时,屏幕上会出现工具提示(文本 + 图片):
对于道具,你现在可以使用 Prop:SetInteractionToolTipText() 来修改工具提示的文本。这允许你为仅支持交互的道具设置自定义消息,如“打开”、“关闭”或“按下”。
你可以使用新的静态方法 Viewport.SetInteractionToolTipEnabled() 禁用此系统。
脚本与 API
新类:TextRender
我们以前也有一个 TextRender 类,但它实际上是一个 Text3D 组件(来自 Unreal Text3D 插件)。
因此我们决定创建一个全新的 TextRender 类,并将旧的 TextRender 重命名为 Text3D。这为我们提供了一个新的轻量类,用于配合字体渲染简单的 2D 文本,同时保持 Text3D 独立并拥有其专属方法(与以前相同)。
这个全新的 TextRender 类还支持通过 TextRender:SetFont() 使用自定义字体。
为了本次升级,我们引入了新的兼容性版本 1.103,从而不会对任何使用旧 TextRender 类的现有脚本造成破坏。
纹理参数
纹理参数灵活性得到了极大提升:任何纹理参数现在均支持加载 Base64、URL 图像(实验性)以及烘焙过的纹理资产。

你可以使用 Paintable:SetMaterialTextureParameter() 直接给材质设置 URL 或 Base64!
缆绳与约束
Cable 得到了大幅改进。创建“锁定”约束时将不再附带自动计算的偏移量。 Cable.AttachEndTo() 中新增了 constraint_offset 参数,因此你可以直接通过脚本来自定义偏移,更好地掌控约束。
我们还添加了一系列新方法来自定义物理约束和马达设置,比如 :SetLinearMotorPositionSettings() 以及 :SetAngularMotorSLERPOrientationSettings()。请在博客的下一节中查看全部内容。
缆绳的生成性能也得到了提升:如果你使用全自由约束,物理约束现在会保持停用(非常适合只需要视觉效果的场景)。我们还做了细微改进,以稳定并减少物理抖动现象。
新增及改进的方法
我们这个月实现了一系列全新的脚本方法:
角冲量/力
你现在可以在任意 Actor 上施加和设置角冲量与角力:
覆盖道具质量
缆绳马达与物理约束
-
Cable:SetPhysicsConstraintSettings() -
Cable:SetLinearMotorPositionSettings() -
Cable:SetLinearMotorVelocitySettings() -
Cable:SetAngularMotorSLERPOrientationSettings() -
Cable:SetAngularMotorSLERPVelocitySettings() -
Cable:SetAngularMotorTwistAndSwingOrientationSettings() -
Cable:SetAngularMotorTwistAndSwingVelocitySettings()
可涂色物 Getter
-
Paintable:GetMaterialVectorParameter() -
Paintable:GetMaterialColorParameter() -
Paintable:GetMaterialTextureParameter() -
Paintable:GetMaterialScalarParameter()
Actor 渲染剔除距离
你现在可以设置任意 Actor 的渲染剔除距离(即 Actor 停止渲染的距离):
Actor 阴影
你现在可以启用/禁用任意 Actor 的阴影:
其他新增方法
VehicleWheeled:IsInAir()(返回载具是否处于空中)WebUI:HasNodeFocus()(返回是否有任意 WebUI 节点拥有焦点)Steam.TriggerScreenshot()(在 Steam 中触发截图)SceneCapture:CaptureScene()(强制进行一次捕获)Pawn:SetFlyingMode()(现在可以在 CharacterSimple 上调用)Viewport.SetInteractionToolTipEnabled()(全局启用/禁用交互工具提示)Prop:SetInteractionToolTipText()(设置道具的交互工具提示文本)
改进的方法
Client.ShowNotification():新增duration参数。CharacterSimple:SetSpeedSettings():新增max_fly_speed参数。Actor:AttachTo()、Cable:AttachStartTo()以及Cable:AttachEndTo():现在会返回是否成功。
Hit 事件 other_actor 参数
现在 Hit 事件包含一个新的 other_actor 参数,代表造成碰撞的另一个 Actor。
文档
我们对文档进行了多项改进。
效率标签
我们为所有方法添加了全新的 efficiency 标签:

例如,如果你悬停在 HTTP.Request() 上,你会在右上角看到一个“blocking”标签,意味着这是一个阻塞操作,会冻结主线程。
锚点链接
所有方法和事件的锚点链接现已修复:你可以悬停并从任何 API 页面复制链接。并且当点击锚点时,页面现在会以正确的偏移量进行滚动。
改进的搜索结果
我们还改进了文档搜索,现在可以返回更精确的结果。

Docker 教程
我们新增了一篇由社区撰写的教程,介绍如何在 nanos world 服务器上使用 Docker,欢迎前往 Docker 安装页面查看。
生活质量改进
WebUI 输入
除了新增的 WebUI:HasNodeFocus() 方法外,现在当某个 WebUI 节点拥有焦点时按下 Esc 键,会让该节点取消焦点(而不是打开 Esc 菜单)。
同时,当 WebUI 节点拥有焦点时,所有游戏输入都将被忽略。这使得游戏内表单和文本输入体验更加“自然”,并避免了玩家在 UI 中打字时意外触发游戏按键绑定的烦人情况。
文件传输速度
我们再次对下载系统进行了迭代,高延迟玩家的文件传输速度得到了提升,使在较差网络条件下加入服务器的过程更加顺畅。
语音通话网络使用情况
在语音通话方面,使用本地频道时,数据现在仅传输给方圆约 30 米内的玩家,从而减少不必要的带宽占用。
丢弃输入
按下丢弃输入(G)现在也会丢弃已抓取的道具。
新增默认资产
我们在默认资产包中添加了若干新资产,包括新的静态网格体(SM_RetroCamera、SM_PhotoFrame、SM_LightSwitch、SM_PushButton)、音效(按钮、开关和推进器声音),以及来自 Fab 的完整 火箭推进器排气 粒子包。
我们还改进了载具侧滑粒子,修复了一些闪烁问题并提升了视觉效果。
更不用说还改进了多个资产的碰撞,修复了它们的物理行为。
首次基准测试

我们新增了一个弹窗,在首次启动游戏时询问是否运行首次基准测试(它不会再自动运行)。
依赖项
更新的依赖项:
- 虚幻引擎已更新至 5.7.3。
- CEF 已更新至 144。
- Sentry 已更新至 1.6。
结语
沙盒游戏模式终于呈现出了我期望的形态,非常接近给我带来灵感的 Garry's Mod 版本。虽然我还有很多工作要做和拓展,但我们比以往任何时候都更接近目标。
我对沙盒模式的目标是让它成为一个充满乐趣的游戏模式,并能方便地成为新集成和实体的来源。同时,它也是如何为 nanos world 实现自定义实体、工具和系统的优秀示例来源。
每当我抽时间编写脚本和游戏模式时体验都很棒。除了超级有趣之外,我总能发现缺失的方法和问题,并最终在这段时间里完成整合与修补工作。
我一直专注于改进现有的功能并解决长期存在的问题。这个月,我们为游戏和脚本 API 添加了许多非常酷的新特性!
一如既往,感谢大家参与测试、提交漏洞和编写脚本!请保持关注,后续还有更多内容!下一次更新再见! 💙
