跳至正文

1 月:沙盒 3.0、约束、工具提示与 API++!

· 14 分钟读完
Gabriel • SyedMuhammad
lead developer™

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

欢迎阅读我们上个月最新更新的汇总!

沙盒 3.0​

我们很高兴地宣布最新的沙盒更新!

沙盒封面

本次更新为沙盒游戏模式带来了许多改进:新特性、新实体、新工具,并对 UI 及现有系统进行了全面润色。它重点关注提升用户体验,并让创作内容、实体和工具变得更有趣(也更简单)。

生成菜单​

我们的生成菜单获得了大幅改进。它现在会在统一列表中展示所有物品,并按类别划分。当类别在屏幕上可见时会高亮显示。并且新增了一个搜索栏!

沙盒游戏模式生成菜单

上下文菜单​

上下文菜单是本次更新中最大的变更!

选择实体​

现在,当上下文菜单打开时,你可以通过点击实体来选择和修改它们。

沙盒游戏模式上下文菜单选择实体

每个实体都有其自己的一组属性,可通过上下文菜单进行修改。你可以在自定义类中通过定义 selected_context_menu_items 属性,以编程方式进行配置。

现在,在使用生成器工具枪时将出现全新的“预览网格体”,显示你即将生成的实体的虚影预览:

沙盒游戏模式自定义推进器
向推进器实体添加属性

例如,推进器的自定义粒子可以像这样设置以显示在上下文菜单中:

Client/Thruster.lua
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 已升级,现在可以显示工具的简短描述以及工具枪使用的所有按键。

沙盒教程改进后的 UI,展示了描述和按键
为工具添加描述和教程

你可以像这样轻松添加自定义描述和教程,它们会被教程系统自动识别:

Client/ColorGun.lua
-- 工具描述
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()。

由于部分沙盒实体已经实现了这些方法,你可以将按钮用线连接至它们,打造出酷炫的集成。

你可以创建自己的实体并实现这两个方法以使其生效:

Server/MyEntity.lua
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 上施加和设置角冲量与角力:

覆盖道具质量​

缆绳马达与物理约束​

可涂色物 Getter​

Actor 渲染剔除距离​

你现在可以设置任意 Actor 的渲染剔除距离(即 Actor 停止渲染的距离):

Actor 阴影​

你现在可以启用/禁用任意 Actor 的阴影:

其他新增方法​

改进的方法​

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 添加了许多非常酷的新特性!

一如既往,感谢大家参与测试、提交漏洞和编写脚本!请保持关注,后续还有更多内容!下一次更新再见! 💙