跳至正文

10 月:Alpha 版本发布!

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

我们自豪地宣布……

……Alpha 版本更新的巨长列表!

初步想法

感谢大家在上个月给予的所有支持! 我们的社区已经壮大了许多,看到它变得如此美好和友善真是太棒了 🥰!

周日的试玩活动非常精彩! 我们得以很好地测试游戏的稳定性。 可以说,我们遇到的大部分崩溃都与外部集成问题(WebUI 或虚幻引擎本身)有关,这展示了我们核心系统极高的成熟度。 我想以后可以更频繁地举办这种活动,玩万圣节模式以及测试社区的游戏模式真的充满了乐趣!

从现在开始,所有更新都将开始引入版本控制(终于!),小更新/非破坏性更改将获得 PATCH 版本号,而破坏性更改将获得 MINOR 版本号。

note

以下更新日志包含了自上次官方宣布的 0.73.0 版本以来的所有功能。 接下来的许多项目其实此前已经包含在 bleeding-edge 分支中了。

材质

现在 nanos world 支持材质资产了! 🎨

这意味着你可以在你的 Assets.toml 中配置自己的材质,并通过 Paintable 方法来引用它们!

函数 :SetDefaultMaterial() 已被替换为 :SetMaterial()。 你可以在此处查看所有开箱即用的内置材质列表。

此外,现在还可以获取 WebUI 材质并将其应用到任何表面上(详情见下文)!

由于这一改动,一些现有的方法正在进行重构,例如 Pickables 获得了一个新方法 :SetCrosshairMaterial(),因此你可以从材质中设置准星(而不再是通过预定义的列表);同时,所有旧的准星都已转换为材质,你可以在此处找到它们。

改进的 WebUI

WebUI 迎来了多项改进,包括运行 HTML5 音频和视频的能力! 📽

caution

我们使用的是 Ultralight 的 Beta 版本,该版本支持音频和视频,因此必然会发生崩溃,此外音频目前仅支持 2D。 Ultralight 官方正在研究解决方案,以便我后续能实现 3D 音频。

WebUI 构造函数加入了几个新参数:is_transparentauto_resizewidthheight。 宽和高仅在自动调整大小为 OFF 时使用,如果你想生成一个 WebUI 并将其作为材质应用到任何表面上(并且不希望它是整个屏幕的大小),这将非常有用。

同时它还获得了新的方法::SetFreeze():Resize():SetAutoResize()

引入了全新的搜索器,改进了加载 .html 文件的方式,现在会按照以下顺序进行查找:

  1. Relative to current-file-path/
  2. Relative to current-package/Client/
  3. Relative to current-package/
  4. Relative to Packages/

现在可以从 WebUI 生成材质,它会自动动态地渲染到任何表面上::SetMaterialFromWebUI()(该方法属于 Actor)。

Actor

Actor 的新内容:

  • 为所有 Actor 添加了新方法::SetLifeSpan(time),它将在 time 秒后自动销毁该 Actor。
  • 为所有 Actor 添加了新方法::IsBeingDestroyed(),用于返回该 Actor 是否正在被销毁(这在从 DropUngrab 等其他事件内部进行检查时非常有用)。
  • 为所有 Actor 的 :AttachTo() 方法添加了新参数:lifespan_when_detached,它将在 Actor 被分离 time 秒后将其销毁。
  • 现在 TakeDamage 事件拥有了一个新参数:causer(造成伤害的对象/Actor)。 同时添加了新的伤害类型:RunOverVehicleRunOverProp
  • 现在 Hit 事件拥有了新参数:impact_forcenormal_impulseimpact_locationvelocity
  • 现在 :SetLocation() 将尝试寻找更好的位置来传送 Actor(以避免碰撞)。

Character

角色的新内容:

角色方法新增/改进:

  • 添加了若干个用于获取其属性的新 Getter。
  • 添加了 :SetDamageMultiplier(),可根据受损的骨骼来更改伤害倍率。
  • 添加了 :SetHiddenBone(),用以隐藏身体的任何部位。
  • 添加了 :SetJumpZVelocity(),使角色可以跳得更高。
  • 改进了 :PlayAnimation(),获得了新参数(混合时间、循环和播放速率),并且现在支持加载任何类型的动画(Montage 或 Sequence)。
  • 移除了 :SetInitialLocation(),它已被 :Respawn() 取代。

角色事件新增/改进:

  • 添加了 AttemptEnterVehicle,在角色尝试进入载具时调用,返回 false 可阻止该行为。
  • 添加了 AttemptLeaveVehicle,在角色尝试离开载具时调用,返回 false 可阻止该行为。
  • 添加了 AttemptReload,在角色尝试为武器装弹时调用,返回 false 可阻止该行为。
  • 添加了 Interact,在角色尝试拾取可拾取物或抓取道具时调用。
  • 添加了 Highlight,在角色注视道具或可拾取物并能够将其拾取时调用。

默认资产包中的某些角色动画已从 AM_ 重命名为 A_(因为它们不再是蒙太奇动画)。 此外还添加了大量新的动画。

Weapons

武器的新内容:

武器方法新增/改进:

额外内容:

  • 现在当角色在驾驶时,武器会被隐藏。
  • 为内置的弹壳粒子添加了弹壳掉落并击中地面的音效(这是一种程序化且 100% 精准的音效 😉)。
  • 添加了拾取或丢下武器时的音效,并且在丢下武器时会将其稍微向前抛出。

手榴弹

手榴弹的所有属性均已被弃用,现在必须通过方法进行访问。

我们为手榴弹添加了一种特殊的粒子效果 nanos-world::P_Grenade_Special,它会根据手榴弹所在的地面爆炸出不同的粒子。 I.e. 如果手榴弹在草地表面,它会爆炸出“草地爆炸”粒子;如果在水下,则会爆炸出“水下爆炸”粒子。 注: 该粒子仅对手榴弹有效。

声音

声音的新内容:

现在可以在运行时加载 .ogg 声音了! 你可以将它们存储在任何包或资产包中,并使用我们针对 SpecialPath 的新路径模式进行加载(assets://asset-pack-name/path.oggpackage://package-name/path.ogg)。

向构造函数添加了 loop_mode 参数(现在可以无限循环播放任何声音)。

此外,可以在任何声音参数中通过 SpecialPath 传递 .ogg 文件。

声音方法新增/改进:

输入

添加了一个新静态类:Input

现在你可以用正确的方式来控制、创建和自定义按键绑定了! 示例:

-- Registers the binding_name 'SpawnMenu' with default key 'Q'
-- This will add 'SpawnMenu' to user KeyBinding Settings automatically
Input.Register("SpawnMenu", "Q")

-- Subscribes for Pressing the key
Input.Bind("SpawnMenu", InputEvent.Pressed, function()
-- Opens the Spawn Menu
end)

-- Subscribes for Releasing the key
Input.Bind("SpawnMenu", InputEvent.Released, function()
-- Closes the Spawn Menu
end)

HTTP

添加了一个新类:HTTP

现在我们有了一个专门用于发送 HTTP 请求的独立类。 它还支持异步 HTTP 请求(并且是线程安全的!)

性能优化

我们在 Alpha 版本更新中对性能技术进行了大量的钻研。 以下是本次更新的亮点:

  • 现在,基础结构体 VectorRotator 在通过网络发送时会自动进行压缩。 在最理想的情况下,其体积最多可减少 90%! 这对于网络占用来说是一个极大的利好。
  • A new setting was added Profiling which you can enable with --profiling on server and in Settings on Client. 这将在控制台中记录运行各项操作/脚本事件等所消耗的所有时间。
  • 现在 HTTP 请求(即 加入服务器时下载文件的过程)会自动进行压缩,这可以减少下载大文件时的网络占用!
  • 现在,距离非常远或不在屏幕上的 Actor 的同步/更新频率将减半,以提高性能。 我们后续仍计划对其进行微调,并在某些情况下使其更加激进。
  • 资产加载系统经过了重做,现在速度快了许多。
  • 小的道具(半径 < 200)将不再与玩家或动态对象发生碰撞。 此外,较大的道具将默认禁用 CCD(大幅提升性能),这可以在 Prop 构造函数中开启。
  • 现在语音通话使用了 Steam 系统,它提供了极高的压缩率,并且可以通过 Shift+Tab 菜单进行自定义设置。
  • 针对我们的低级 Lua 代码进行了多项改进,以提升脚本编写的性能。

服务器

Server 静态类的新增内容:

客户端

Client 静态类的新增内容:

现在加入服务器时,Windows 任务栏上会显示一个进度条,并且在加载完成后它会闪烁提示:

游戏内控制台

现在可以在游戏内直接访问服务器控制台了!

如果你打开它,会显示 2 个标签页:客户端服务器。 你可以阅读所有的服务器日志,并且还能输入命令。

note

并非所有的日志都会显示在这里,仅显示你连接到服务器期间所输出的日志。

计时器

Timer 的新内容:

命令行界面

  • 现在可以使用 CLI 一次性下载多个资产/包,只需用空格隔开即可,例如:cli assets install quaternius city-park

Steam 成就

通过集成 Steam,我们正在尽可能地利用它所允许的每一项功能 😅!

这其中就包括了成就! 我们得到了才华横溢的好友 Esther 的支持,他正在为这些成就绘制精美的原画!

我们会一步步创建更多成就并发布它们! 我们同样期待你为更多成就提出想法!

脚本改进

  • Package.Require() 添加了全新的搜索器,我们目前支持 5 个搜索器,它们会按以下顺序进行查找:

    1. Relative to current-file-path/
    2. 相对于 current-package/Client/current-package/Server/(取决于你所处的端)
    3. 相对于 current-package/Shared/
    4. Relative to current-package/
    5. Relative to Packages/
  • Package.Require() now can be called in runtime and at any moment.

  • Package.RequirePackage() 现在会将一个包作为库加载到当前包的内部,这意味着被加载的包会自动发送给客户端,并且它加载的所有路径都是相对于该包本身的(而不再是相对于调用它的那个包)。

  • 详细日志现在将显示当前线程的 ID。

重命名默认资源包

默认资源包 NanosWorldWeaponsNanosWorldVehicles 已被重命名为 nanos-world-weaponsnanos-world-vehicles,以遵循包和资产名称的新正确规范。 现在引入它们应该写成类似于 Package.RequirePackage("nanos-world-weapons"),不过使用方式仍保持不变(NanosWorldWeapons.AK47())。

常规更改

  • Cable 获得了新方法::GetAttachedStartTo():GetAttachedEndTo(),用以获取它的两端是否连接在某些物体上。
  • Player got new methods: :SetVOIPVolume(), :GetSteamID().
  • Pickables got new events: ReleaseUse, PullUse when Character pulls or releases its usage (i.e. trigger for weapons).
  • 改进了 PickablesProps 的交互触发器启用的方式。
  • Trigger 获得了新方法::ForceOverlapChecking(),它将在游戏线程中检查重叠并立即派发事件。
  • Quaternions 添加了新方法(+、-、Normalize)。
  • 添加了用于生成随机 Rotator 的新方法:Rotator.Random()
  • 在默认资产包中添加了大量新的声音、动画、道具和网格体。
  • 添加了 Steam 登录。
  • 所有 .config 文件中的 tabs 均已被替换为 spaces
  • .GetPairs() 现在仅支持 pairs
  • 添加了分辨率图形设置。
  • 删除了游戏内菜单的“Make Day”按钮。
  • 添加了道具或物体进入水中时的全新溅水效果。
  • :GetValue() 现在有了一个额外的参数:fallback,在值不存在时将返回该参数。
  • 可能还有很多其他添加了但被忘掉的东西 😜。

漏洞修复

  • 修复了 World.SetFogDensity() 不起作用的问题。
  • 修复了 Client.SetCameraLocation 不起作用的问题。
  • 修复了 Actors.RotateTo() 数学计算不正确的问题。
  • 修复了 StaticMesh.GetBounds() 不起作用的问题。
  • 修复了 Cable 方法可以在客户端被调用的问题。
  • 修复了若干个 Character 属性不同步的问题。
  • 修复了在运行时更改地图导致崩溃的问题。
  • 修复了角色在重生时生命值不会重置为 max_health 的问题。
  • 修复了死亡布娃娃仍在到处移动的问题(由 MoveTo() 导致)。
  • 修复了 LogEntry 事件引起的无限递归问题。
  • 修复了 Characters 的 Morph Targets 不同步的问题。
  • 修复了 Discord 自定义集成有时不起作用的问题。
  • 修复了当玩家没有 Steam 个人资料图片时导致崩溃的问题。
  • 修复了在新游戏屏幕取消勾选 Server Announce 时复选框被禁用的问题。
  • 修复了在 Interact 事件内部销毁实体时会导致崩溃的问题。
  • 修复了海量的其他崩溃 💥。 感谢各位提交的崩溃报告!