跳至正文

6 月:附件重做、脚本安全性与体验优化!

· 1 分钟阅读
Gabriel • SyedMuhammad
lead developer™

全新的个人资料屏幕信息与简介、重做的骨骼网格体附件、新的武器 BulletHit 事件、包沙盒化、胶囊体重做以及更多内容!

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

个人资料屏幕增强

我们在个人资料中添加了一个新的简介字段,允许你填写一段关于自己的简短描述。 这是让其他人进一步了解你、你的兴趣或你在社区中创作的作品的绝佳方式。

此外,我们向个人资料屏幕添加了更多信息,包括用户的在线于加入日期国家以及侧边栏中的团队图标!

游戏内玩家个人资料

我们仍在继续扩展个人资料屏幕,以提供更多信息和隐私设置,来支持自定义他人可以看到的内容。

你可以直接在管理标签页中编辑自己的简介,快去向社区介绍一下自己吧!

Vault Improvements

新的举报按钮

我们为资源库资源评价都添加了全新的举报按钮,允许你将任何不当内容或违规行为直接上报给管理团队。

资源库资源中的举报按钮

我们将逐步在游戏的其他区域添加更多举报按钮,以便你可以协助我们共同维护社区的安全!

评价改进

现在也会在资源库评价标签页中显示用户头像

资源库资源中的评价

如果你游玩了任何游戏模式或使用了资源库中的资源,别忘了留下评价,让社区知道你的想法!

资源库资源中的评价按钮

危险区

我们将某些按钮移动到了资源库资源管理标签页中全新的危险区部分,以便更清晰地提醒用户这些操作不可逆,需要谨慎使用:

资源库资源管理标签页中的危险区

DLSS 帧生成选项

我们重新添加了选择 DLSS 帧生成模式的选项(在支持的情况下包括 auto、dynamic、2x、3x、4x 等),使用了全新的 DLSS 4.5 选项。

DLSS 帧生成设置

脚本改进

本月我们带来了许多全新的脚本功能与改进!

重做骨骼网格体附件

我们重做了所有的 AddSkeletalMeshAttached() 方法,新增了 4 个新参数,允许你将网格体附加到特定的插槽,并支持自定义的相对变换,甚至支持自定义动画。这带来了更高的灵活性,甚至可以实现使用自定义的运行时重定向器!

由于新格式属于破坏性更改,我们引入了新的兼容性版本 1.144。 有关此更改的更多信息,请参阅兼容性版本 1.144 页面。

文件沙盒化

我们更改了 File 类访问文件的方式,添加了允许访问的扩展名白名单。 尝试访问白名单以外的任何扩展名文件都将抛出错误。

添加此功能是为了防止恶意脚本访问和修改服务器上的敏感文件,并在整体上更轻松地对脚本进行沙盒化管理。

你可以在文件页面中查看所有允许的扩展名

File 类scripting-reference/classes/file

安全加载 Lua 脚本

鉴于某些包可能依赖于在运行时使用 File 类来加载 .lua 文件,我们添加了一个新方法 Package.LoadFile(),它能以沙盒化的方式加载 .lua 文件,编译并返回一个函数,你可以使用自己自定义的 env 表来执行该函数:

Server/Index.lua
local loader_func = Package.LoadFile("Server/MyScript.lua")

-- 通过提供自定义环境变量表来定义脚本可以访问的内容
local my_env = {
Console = Console,
math = math,
}

-- 使用自定义环境执行脚本
loader_func(my_env)

通过这种方式,你可以在沙盒环境中加载并执行脚本,从而防止它们访问你不想让其获取的服务器函数或数据。

客户端文件实时重载

我们添加了一个新方法 Package.ReloadClientFile(),该方法可以重新加载、缓存并向玩家发送更新后的文件,从而在玩家端触发 FileReload 事件。

你可以使用此方法为客户端文件构建自己的实时重载系统,或者在不重启整个包的情况下实时更新文件。 为此,只需订阅该事件,并配合使用如 Package.Require(file_path, true) 来重新加载文件即可。

新 Player.GetBySteamID

添加了方法 Player.GetBySteamID(),用于通过 SteamID 获取 Player 实例,这比遍历所有玩家并逐个对比 SteamID 要快得多。

每个实体可自定义的距离优化

近期我们引入了服务器端设置 distance_optimization,其工作原理是降低远离玩家的实体的更新频率,从而提高性能并减少网络占用。

为了给该系统提供更好的灵活性,我们添加了新方法 Player:SetDistanceOptimizationMultiplier()Actor:SetDistanceOptimizationMultiplier(),允许你为每个实体自定义距离优化系数,这使你能够根据实体的重要程度或大小,更精细地控制其实体优化方式。

例如,你可以让特定的玩家更频繁地接收更新,或者让特定的 Actor 相比其他实体更新得不那么频繁。

新的流式暂停事件

我们新添加了 StreamLevelBeginPauseStreamLevelEndPause 事件,这些事件会在流式传输系统暂停和恢复关卡流式传输过程中触发。

我们还移除了虚幻引擎原生的 ... 旋转进度条加载 UI——此前当流式传输系统开始加载流式关卡时,该 UI 会显示并隐藏所有的 UI/WebUI。

有了这项改动,你就可以在流式关卡暂停发生时,实现你自己的加载屏幕逻辑。

新的网格体设置

我们添加了一个新方法 Pawn:SetMeshSettings(),用于配置角色的主骨骼网格体的附加设置与可见性。

你现在可以更改其相对位置/旋转,甚至可以将其隐藏,以便能够配合新的 :AddSkeletalMeshAttached(),使用你自定义的运行时重定向器动画蓝图来附加一个不同的骨骼网格体!

此外在默认情况下,如果你没有使用这个新方法覆盖这些值,主骨骼网格体的偏移量现在会自动根据网格体的大小进行计算。

改进的胶囊体设置

现在,所有角色都会自动根据骨骼网格体包围盒的大小来计算胶囊体的大小。 但你也可以通过 Pawn:SetCapsuleSize() 方法对其进行覆盖。

该方法现在还接受一个 crouched_half_height 参数,允许你自定义角色下蹲时的胶囊体大小。

备注

CharacterSimple:SetMesh() 上的 adjust_capsule_size 参数现已被弃用,你应当改为使用 Pawn:SetCapsuleSize() 方法。

伤害系数返回

你现在可以从 TakeDamage 事件中返回一个数字,该数字将作为应用到最终伤害上的系数,允许你在现有的应用伤害之上实现自己的逻辑。

例如,如果角色穿着某些装备或具有某些特殊状态,你可以将伤害减半:

Server/Index.lua
Character.Subscribe("TakeDamage", function(character, damage, bone, type, from_direction, instigator, causer)
-- 穿戴盔甲时伤害减半
if (character:GetValue("HasArmor")) then
return 0.5
end
end)
提示

该系数会与所有其他事件的返回值累加。因此,如果你有多个脚本订阅了 TakeDamage 事件,最终伤害将会乘以所有返回的系数。

新的武器 BulletHit 事件

我们终于添加了 (据说是) 获票数最高的功能请求客户端事件:BulletHit,该事件会在你使用 Weapon 射击且子弹击中物体时触发。

键盘布局获取器

我们添加了一个新方法 Input.GetKeyboardLayout(),用于获取当前玩家的键盘布局。这非常适合针对 QWERTY、AZERTY 或其他键盘布局构建专门的默认输入绑定。

例如,你可以针对 QWERTY 布局注册 Q 键,或者针对 AZERTY 布局注册 A 键:

Client/Index.lua
if (Input.GetKeyboardLayout() == KeyboardLayout.AZERTY) then
Input.Register("MyAction", "A")
else
Input.Register("MyAction", "Q")
end

计时器剩余时间设置器

新增了方法 Timer.SetRemainingTime(),允许你设置现有 Timer 超时的剩余时间,从而可以延长或缩短计时器的剩余时间。

Other Improvements

性能与网络

我们提高了快照同步实现的效率,并对内部内存分配进行了若干改进。

此外,我们重做了 :SetDimension() 的实现,使其在性能网络占用方面都更加高效。 如果在此项改动中发现任何问题,请告诉我们,因为这在内部是一次重大的重做。

俯卧已停用

我们决定停用 Character俯卧功能。 这是一项尚未完工、较为粗糙的机制,它需要耗费大量的维护精力,并且导致代码库变得异常复杂。

更新依赖项

  • 启用了 WaterAdvanced 插件。
  • CEF 更新至 v149。
  • 更新了 HTTP 库。

文档

更新了基本概念

我们更新了“基本概念”页面,加入了大量关于 nanos world 运作机制以及如何开始编写脚本的新信息。即使你是从其他游戏转过来的,也能借此快速习惯我们的概念和术语。 我们还添加了大量全新的代码片段和示例,以便大家熟悉我们的 API!

Check it out:

基本概念getting-started/essential-concepts

常规改进

我们对文档源代码进行了一些改进和重构:

  • 将所有文件转换为 .mdx 格式,以实现标准化并能够使用高级 JSX 功能。
  • 为所有标题添加了明确的锚点“英文”名称,修复了本地化/翻译后的页面无法正确链接到这些标题的问题。
  • 简化了所有 \<MethodReference>\<EventReference> 组件,使其更易于使用。
  • 我们现在会在方法/事件的描述中,显示其最近是否在某个兼容性版本中被修改过。

结语

6 月是一个充满了脚本改进和体验优化的月份,我们正在逐步改进某些区域,为我们已经规划好的下一次更新打下坚实的基础!

我们的核心目标之一是让社区联系得更加紧密,我们正在开发多项功能,以便玩家能更轻松地寻找并与其他玩家建立联系,同时也让游戏对每个人来说都更加触手可及。

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

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

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

See you in the next update! 🚀

Ko-fiKo-fi