跳至正文

5 月:控件 3D、资产元数据!

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

Widget 3D、资产元数据、资源库上传、客户端触发器及更多!

来看看 5 月最新更新的汇总吧!

更轻松地上传到资源库​

我们很高兴地宣布,现在有更简单的新方法将你的包和资产包的新版本上传到资源库!

通过 CLI 上传​

我们添加了一个新的 CLI 命令 package upload 和 assets upload,允许你通过 CLI(命令行界面)轻松上传你的包或资产包的新版本。

该系统会校验、压缩并将你本地资源的新版本直接上传到资源库。它简化了流程,节省你的时间和精力。

Terminal
./NanosWorldServer.exe --cli upload package default-weapons

通过 UI 上传​

我们还使你可以直接从资源库管理标签页上传新的包或资产包版本。

这个新系统现在会自动检测你本地版本是否比远程版本更新,并显示上传按钮。

资源库管理标签页显示有新版本可上传

上传完成后,将出现一个弹窗,提醒你在商店中批准发布。这是一种无缝便捷的方式来管理和更新你的资源。

上传新版本后显示的弹窗

观看上传过程演示:

通过资源库上传包

新类:Widget3D​

我们很高兴地介绍新类:Widget3D。该类提供了现有 Widget 的 3D 表示!使我们能够让控件作为 Actor 在 3D 世界中渲染!

你可以通过新的 Widget 方法 SpawnWidget 生成 Widget3D 类:

Client/Index.lua
-- 生成并配置一个 Widget
local my_widget = Widget(NativeWidget.Image)
my_widget:CallBlueprintEvent("SetBrushFromTexture", "package://testing/Client/MyImage.jpg")

-- 从 Widget 生成 Widget3D
local my_widget_3d = my_widget:SpawnWidget3D(Vector(0, 0, 200), Rotator(0, 90, 0))

在世界中生成的 Widget3D
Widget 3D 类scripting-reference/classes/widget3d

地图包创建流程​

我们通过 UI 对地图包创建流程进行了重大改进。

现在,选择地图资产变得容易多了!系统会自动获取所选资产包中包含的所有地图资产,让你可以方便地选择所需的地图资产,简化了地图包的创建过程!

地图包创建工作流程

观看地图创建过程演示:

通过资源库创建地图包

资产元数据​

现在我们可以在 Asset.toml 中为单个资产定义元数据(自定义值)!之前我们只能通过路径定义资产:

Assets.toml
[assets.static_meshes]
SM_Flower_01 = "MyFolder/SM_Awesome_Flower_01"
SM_Rock_01 = "MyFolder/SM_Rock_01"
SM_MyAsset_01 = "MyFolder/SM_MyAsset_01"
# ...

现在我们可以将它们定义为表,允许为每个资产设置自定义值!

Assets.toml
[assets.static_meshes]
SM_Flower_01 = { path = "MyFolder/SM_Awesome_Flower_01", my_tag = "Wonderful", something = 123, thumbnail = "Thumbnails/SM_Flower_01.jpg" }
SM_Rock_01 = { path = "MyFolder/SM_Rock_01", my_tag = "Wonderful", something = 123, thumbnail = "Thumbnails/SM_Rock_01.jpg" }
SM_MyAsset_01 = { path = "MyFolder/SM_MyAsset_01", my_tag = "Wonderful", something = 123, thumbnail = "Thumbnails/SM_MyAsset_01.jpg" }
# ...

在资产元数据文档部分了解更多:

资产元数据core-concepts/assets

客户端触发器​

现在,我们的 Trigger 类也可以在客户端生成!让脚本编写者可以在客户端以与服务器相同的方式使用触发器!

附加网格体功能​

我们在附加网格体功能方面获得了一系列改进和新方法!

我们引入了新方法,使你可以直接在附加网格体上自定义其材质:SetMaterialScalarParameterOnAttached() 和 SetMaterialVectorParameterOnAttached()。这消除了(并弃用了)使用常规方法设置材质参数时对 attachable:// 模式的需求。

此外,我们还添加了便捷的获取器,如 GetAll[Static/Skeletal]MeshAttached(),用于检索所有当前附加的网格体及其路径。

最后,我们有了 SetStaticMeshAttachedTransform(),允许脚本编写者在运行时更改附加网格体的变换(位置/旋转)!

P2P 改进​

我们解决了 P2P(非专用服务器)功能实现中的几个问题,特别是与连接到 P2P 本地主机服务器相关的问题。我们开发了一种新的混合解决方案,解决了其中大部分问题。

P2P 服务器使用 Steam 骨干网来实例化一个新的虚拟 IP,该 IP 提供给其他玩家以连接到你的服务器,而无需你在路由器中转发端口。

问题在于你只能通过这个新的虚拟 IP 连接,例如无法通过 localhost (127.0.0.1) 连接,所以我们有一个 hacky 实现,它会识别你正在连接到本地主机服务器,并尝试直接从其中检索这个虚拟 IP,这非常脏,并且存在许多缺陷和不可预见的后果/漏洞。

但最终幸运的是,我们成功实现了一种解决方案,通过现在采用混合方法解决了所有问题!现在所有 P2P 服务器也允许“专用”连接,使它们能够同时通过 localhost 和虚拟 IP 进行连接!

杂项改进​

兼容性版本 1.54​

最后,值得一提的是本月我们引入了一个新的兼容性版本 1.54,对 Level.CallLevelBlueprintEvent 进行了更改,通过启用可变参数使其与常规蓝图函数保持一致。还有 Client.GetPackages(),使其也像 Server.GetPackages() 一样工作!

多包重载​

现在可以使用控制台命令一次重载/加载/卸载多个包!例如:

package reload sandbox battlefield-kill-ui

更新的 CEF 和 Steam​

我们已将 CEF (114) 和 Steam SDK (1.57) 库更新到最新版本!由于 Linux (Proton) 的一些问题,我们的 CEF 已落后近 1 年,但现在它们似乎都已修复,我们再次保持最新状态!

UFont 和 UClass 参数​

现在蓝图支持从 Font TTF Path 接收 UFont,并从虚幻引擎常规路径(/Game/MyAsset/MyClass.MyClass_C)接收 UClass!

资源库刷新​

我们也在资源库物品屏幕中添加了刷新按钮!它位于导航栏的右侧:

结语​

本月的目标是更加鼓励脚本编写者/模组制作者将他们的资源上传到资源库。由于现在推送新版本只需点击几下,而且流程已高度自动化,许多障碍已被消除!

创建地图包的新工作流程也旨在鼓励脚本编写者/模组制作者以更简单、更快速的方式从其资产包创建地图包!

我下一步想做的是能够直接通过资源库 UI 创建包/资产包并在商店批准发布(目前我们仍需要使用网站来完成),然后我们将拥有在游戏内完成创建和上传资产的完整流程!

我认为资源共享是沙盒游戏的关键因素,我想尽可能改进我们在这方面的设计,使其更加容易!

总之,本月我们在模块化和脚本能力的各个方面都取得了重大改进!

Widget3D 将在 3D UI 创建方面带来许多改进(例如名称标签或简单的自定义 3D 文本/标志)。

而资产元数据是改进资产分类这一略显模糊领域的巨大一步。很快我将更新所有标准资产,添加标签、类别,并更新沙盒包以更标准化的方式使用这些!

感谢又一个月的支持和帮助!下个月见! 🤗🤗