跳至正文

7 月:全新网站、生成、载具与文档++!

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

全新网站设计、新的 SpawnMode 枚举、载具引擎事件、车灯与动画蓝图、CharacterSimple 下蹲、资源库资源仪表板,以及更多内容!

Welcome to our roundup of the latest updates from the last month!

我们的新网站来了! 🚀

我们非常激动地宣布我们的全新网站设计! 我们一直在幕后努力工作,为大家带来更好、更美观的网络体验。

让我们一起来游览所有新内容吧!

着陆页

我们的着陆页进行了完全重新设计,并且我们添加了一个全新的 ** Testimonials** 部分,展示了社区对 nanos world 的看法!

新的着陆页和 Testimonials 部分

提示

你对 nanos world 有什么想说的好话吗?欢迎提交你自己的评价,我们很乐意将其展示出来! 💙

商店

新的商店主页现在会展示热门的团队资源,而新的商店浏览则让搜索所有资源变得更加容易:

新的商店主页和商店浏览

当然,资源页面本身也经过了完全重做:

新的资源详情页面

新的资源管理页面

社区

这是最大的新增内容:一个全新的社区区域,你可以在其中浏览所有用户团队徽章

新的社区页面

现在每个用户和每个团队都拥有自己的公开个人资料。 用户个人资料会显示他创建的资源、所属的团队以及获得的徽章,而团队个人资料则为整个团队展示了相同的信息:

新的用户个人资料和团队个人资料

徽章

新的徽章页面

我们一直在不断添加新的徽章,并开始实现一些自动授予的徽章,比如评价者徽章,它会自动授予每一位在商店中评价过资源的用户。 此外,Alpha 测试员徽章现在也会自动授予所有获得测试权限的用户!

我们正在逐步实现更多自动授予的徽章!

提示

我们还有 ☕ Ko-fi 支持者徽章,它会授予所有通过 Ko-fi 支持项目开发的人。 这目前仍然是一个手动流程,所以如果你是我们的支持者但还没有获得这个徽章,请告诉我们!

账户管理

最后,新的账户管理区域是你编辑账户和管理所有资源的地方!

新的账户管理

还有更多! 赶快前往你的个人资料添加一段简介吧! 快去看看吧,并告诉我们你的想法! 💙

资源库资源仪表板

与新网站类似,我们也在资源库资源管理屏幕中添加了一个新的仪表板标签页,它会显示一个用于完善你资源个人资料的清单。

资源库资源管理中的仪表板标签页

你只有在完成整个清单后,才能够发布你的资源。 这样做的目的是确保每个已发布的资源都包含适当的描述、图片、标签以及玩家决定是否下载所需的一切信息。

我们还改进了标签标签页的视觉效果,并修复了主菜单中资源库资源项的多个视觉问题(例如星级和按钮出现在错误屏幕中的问题)。

脚本改进

七月在脚本方面是一个工作量很大的月份,我们对实体完成生成的方式进行了重大重构,并加入了大量新的载具功能!

新的生成模式

我们引入了一个新的枚举 SpawnMode,它取代了所有实体构造函数中旧的 defer_spawn 布尔参数

现在你不只是能选择“延迟或不延迟”,而是可以精确控制实体在 何时 完成生成并发送给客户端:

  • SpawnMode.Immediate - 在调用构造函数时立即完成生成(默认,即你所熟知的方式)。
  • SpawnMode.AfterConstructor - 保持生成延迟状态,当继承类的构造函数返回时,它会自动完成生成。
  • SpawnMode.Manual - 保持生成延迟状态,直到你自行调用 :FinishSpawn()
Server/Index.lua
-- 以延迟方式生成,以便在发送给客户端之前进行所有配置
local prop = Prop(
Vector(0, 0, 100),
Rotator(),
"nanos-world::SM_Cube",
CollisionType.Normal,
true,
GrabMode.Auto,
CCDMode.Auto,
SpawnMode.Manual
)

prop:SetScale(Vector(2, 2, 2))
prop:SetValue("Health", 100, true)

-- 直到此时,Prop 才会以完全配置好的状态发送给所有客户端
prop:FinishSpawn()

AfterConstructor 模式与继承类配合使用时,才能真正发挥其优势。 在调用 self.Super:Constructor() 之后进行的所有配置都会被批量打包,一次性发送给客户端,你无需再记得调用 FinishSpawn()

Server/Index.lua
MyCube = Prop.Inherit("MyCube")

function MyCube:Constructor(location, rotation)
self.Super:Constructor(location, rotation, "nanos-world::SM_Cube", CollisionType.Normal, true, GrabMode.Auto, CCDMode.Auto, SpawnMode.AfterConstructor)

-- 所有这些配置都会被打包成一个批次发送给客户端,
-- 当此构造函数返回时,FinishSpawn() 会被自动调用
self:SetScale(Vector(2, 2, 2))
self:SetMaterialColorParameter("Tint", Color.RED)
self:SetValue("Health", 100, true)
end

我们还添加了两个新方法,用于在运行时覆盖和查询该行为:

备注

这是一个潜在的破坏性更改:FinishSpawn() 现在即使在继承类的构造函数内部调用,也会立即完成生成并触发 Spawn 事件,并且服务器端的 Spawn 事件现在会在向客户端发送 Spawn 事件之后触发。

如果你的代码依赖于旧的顺序,请仔细排查,如果发现任何问题,请告诉我们!

Vehicle Improvements

Base Vehicle 在这个月得到了大量关爱!

引擎事件与状态

我们添加了新的 EngineStartEngineStop 事件,以及一个新的 Vehicle:IsEngineStarted() 方法,现在你终于可以对引擎的启动和关闭做出反应了:

Server/Index.lua
VehicleWheeled.Subscribe("EngineStart", function(vehicle)
Chat.BroadcastMessage("轰隆!")
end)

前大灯与尾灯

VehicleWheeled 现在通过新方法 VehicleWheeled:SetHeadlightsEnabled()VehicleWheeled:SetTaillightsEnabled() 实现了完善的灯光控制。

我们还修复了前大灯颜色无法应用于载具材质的问题。

Animation Blueprints

载具现在支持 CharacterSimple 已有的全套动画蓝图 API,让你可以直接从 Lua 驱动载具的动画蓝图:

这对于为车门、悬挂、旋翼、起重机或自定义载具的任何其他活动部件制作动画效果非常有用!

相机

我们添加了一个新方法 Vehicle:SetCameraArmLength() 来控制相机与载具的距离,并将 Vehicle:SetCameraOffset() 移到了基础载具中,因此现在所有类型的载具都可以使用它。

我们还修复了 Vehicle:PlayAnimation() 参数顺序错误的问题,以及 VehicleWheeled:FinishSpawn() 错误地允许被多次调用的问题。

CharacterSimple 下蹲

CharacterSimple 现在通过新方法 CharacterSimple:SetCrouching()CharacterSimple:IsCrouching() 实现了完整的下蹲支持与同步

与此同时,Pawn:GetCanCrouch()Pawn:GetCanJump() 被移到了 基础 Pawn 中,现在 CharacterCharacterSimple 可以共享使用。

我们还修复了角色下蹲无法正确同步给其他玩家的问题。

网络主控事件

我们添加了一个新的 NetworkAuthorityChange 事件,当 Actor 的网络主控发生变化时触发。

这使得你可以更轻松地知道你的客户端何时成为(或不再是)某个实体的主控,而无需每刻轮询 HasNetworkAuthority()

新的 Actor 获取器

Base Actor 添加了两个新的客户端方法:

获取器中的继承实体

现在 .GetAll().GetPairs().GetByIndex() 也会返回所有继承的实体

因此,如果你有 MyCubeChild = MyCube.Inherit("MyCubeChild"),调用 MyCube.GetAll() 现在也会返回所有 MyCubeChild 的实例,这正是你对继承的自然预期。

递归附加实体

Actor:GetAttachedEntities() 增加了一个新的 recursively 参数,用于返回附加到已附加 Actor 上的 Actor,一直向下遍历整个层级结构。

输入绑定状态

我们添加了一个新方法 Input.IsBindingDown(),用于返回某个绑定当前是否被按住。

Input.IsKeyDown() 不同,这个方法使用的是玩家配置的绑定名称,因此它会自动遵照自定义按键绑定:

Client/Index.lua
Client.Subscribe("Tick", function()
if (Input.IsBindingDown("Sprint")) then
-- 在疾跑时执行某些操作
end
end)

Vector2D 辅助

Vector2D 结构体缺少 Vector 已有的多数辅助,因此我们全部补全了:

感谢 @Ekali 提交的 PR

浮点曲线蓝图参数

Blueprint 现在支持将 CurveFloat 作为参数类型,因此你可以直接从 Lua 表构建曲线并将其传递给蓝图:

{
[0.0] = 0.0,
[0.25] = 0.8,
[0.5] = 1.0,
[0.75] = 0.3,
[1.0] = 0.0,
}
蓝图支持的参数scripting-reference/classes/blueprint

协程与回调修复

我们修复了大部分couldn't find env from callbacks 相关的脚本错误,以及使用协程时的多处崩溃问题。

如果你仍然遇到这些问题,请告诉我们,以便我们能够追踪剩余的情况!

其他修复

我们还修复了:

服务器改进

内置 HTTP 服务器上的玩家列表

内置服务器的 HTTP GET / 端点现在除了返回原有的服务器信息外,还会返回玩家列表(名称 + 网络 ID)。

该端点现已内部缓存以提升性能,并且我们修复了因 CORS 导致无法获取的问题,现在你可以直接从网站或面板中查询它。

Steam 认证

我们改进了连接服务器时的认证系统,以防止 Steam 速率限制导致的问题:现在只有在你的排队位置归零时才会生成票据,而不是提前为所有等待的玩家生成。

我们还改进了多个 Steam 认证的时序问题,现在如果 Steam 初始化失败,日志会显示更具体的错误原因。

Gameplay Abilities 插件

我们启用了 GameplayAbilities 插件,现在你可以在自定义资产中使用它了!

白名单 UE 插件assets-modding/whitelisted-ue-plugins

文档

我们在七月花了很大一部分时间重新设计脚本参考的呈现方式!

脚本参考重做

  • 函数事件现在会列在侧边栏目录中,并带有主控和原生图标,方便你直接跳转到所需的方法。
  • 改进了函数声明的可视化,新增了独立的返回值表格,并且当默认值为 Lua 表时,渲染效果更佳。
  • 提示框基类指示器现在以紧凑的标签形式显示。
  • 基类页面现在显示 \<AnyBASEClass> 而不是具体的基类名称,从而更清晰地表明这些方法是共享的。
  • 改进了表布局和换行,添加了事件/构造函数表的标题,并修复了多个锚点链接(包括枚举标题)。

新的类标签和重做后的侧边栏目录

备注

我们还重命名了部分类页面的 URL,去掉了 - 分隔符,例如 scripting-reference/classes/character-simple 现在变为 scripting-reference/classes/charactersimple

如果你有任何旧链接被收藏或在你的文档中被引用,请务必更新它们!

详细的服务器配置

服务器配置页面进行了大幅重写!

现在每个设置都按其 Config.toml 章节分组,并标注了类型默认值可接受范围。 除此之外,我们还添加了两个全新的章节,解释了底层实际发生的情况:

  • 压缩 - 哪些数据会被压缩、何时压缩,以及哪些文件扩展名会被跳过。
  • 距离优化 - 精确的相关性计算公式,以及展示每个级别的相关性百分比和截断距离的表。

如果你托管服务器,这绝对值得一读,可以最大限度地发挥你的带宽和 CPU 性能!

结语

本月我们投入了大量精力来改善网页体验,终于将商店、社区和你的账户整合到一个我们引以为傲的设计中!

我们希望确保每位创作者都有一个合适的地方来展示他们的作品,同时社区成员也能轻松找到彼此并建立联系。 这与我们的最大目标一致,即不仅要打造一个平台,更要建立一个核心社区,让每个人都能分享自己的创作,并互相帮助、共同成长。

在游戏/脚本方面,我们努力修复、改进和添加了一些缺失但必要的功能。 包括正确地规范化生成模式、为载具补全所有骨骼网格体缺失的方法、实现原生的下蹲同步,更不用说脚本本身的修复了(比如长期存在的协程或环境问题)。

希望大家喜欢所有这些新功能和改进! 我一直在寻求反馈,因此如果你有任何建议或想法,请在我们的 Discord反馈中心中告诉我们。

特别感谢所有通过 Crowdin 贡献翻译的人,你们让世界各地的玩家都能更轻松地了解游戏和文档;同时也要感谢那些通过 Ko-fi 支持开发的人!

正是有了你们的支持,我才能继续全职投入到 nanos world 的工作中,并不断推动项目向前发展。 💙

See you in the next update! 🚀

Ko-fiKo-fi