跳至正文

10 月:Alpha 版本发布!

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

我们自豪地宣布……

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

初步想法​

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

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

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

备注

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

材质​

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

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

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

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

Some existing methods are suffering a rework due that, e.g. Pickables got a new method :SetCrosshairMaterial(), so you can set the Crosshair from a Material (and not from a predefined list anymore), also all old Crosshair have been converted into materials which you can find here.

改进的 WebUI​

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

注意

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

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

Also it received new methods: :SetFreeze(), :Resize() and :SetAutoResize().

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

  1. 相对于 current-file-path/
  2. 相对于 current-package/Client/
  3. 相对于 current-package/
  4. 相对于 Packages/

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

Actor​

Actor 的新内容:

  • Added new method for all actors: :SetLifeSpan(time) which will automatically destroy this actor after time seconds.
  • Added new method for all actors: :IsBeingDestroyed() which will return if this actor is being destroyed (useful to check from inside other Events such as Drop or Ungrab).
  • Added new parameter for all actors :AttachTo() method: lifespan_when_detached, which will destroy the actor after time seconds after it's detached.
  • Now event TakeDamage has a new argument: causer (the object/actor which caused the damage). 还添加了新的伤害类型:RunOverVehicle 和 RunOverProp。
  • Now event Hit has new arguments: impact_force, normal_impulse, impact_location and velocity.
  • Now :SetLocation() will try to find the better spot to teleport the Actor (to avoid collisions).

Character​

Character 的新增内容:

Character 方法的新增与改进:

  • 添加了若干个用于获取其属性的新 Getter。
  • Added :SetDamageMultiplier() change the damage multiplier depending on the bone damaged.
  • Added :SetHiddenBone() to make invisible any part of the body.
  • Added :SetJumpZVelocity() to make the character jump higher.
  • Improved :PlayAnimation() got new parameters (blend times, loop and play rate), and now it supports loading any type of animation (Montage or Sequence).
  • Removed :SetInitialLocation(), it has been replaced with :Respawn().

Character 事件的新增与改进:

  • Added AttemptEnterVehicle called when Character tries to enter a vehicle, returns false to prevent it.
  • Added AttemptLeaveVehicle called when Character tries to leave a vehicle, returns false to prevent it.
  • Added AttemptReload called when Character tries to reload it's weapon, returns false to prevent it.
  • Added Interact called when Characters tries to Pick Up a Pickable or Grab a Prop.
  • Added Highlight called when Characters looks at a Prop or Pickable being able to pick up it.

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

武器​

Weapon 的新增内容:

Weapon 方法的新增与改进:

其他新增内容:

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

手榴弹​

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

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

声音​

Sound 的新增内容:

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

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

此外,还可以在任何 Sound 参数中使用 SpecialPath 传入 .ogg。

Sound 方法的新增与改进:

Input​

添加了新类:Input!

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

-- 注册绑定名称 'SpawnMenu',默认按键为 'Q'
-- 这将自动把 'SpawnMenu' 添加到用户的按键绑定设置中
Input.Register("SpawnMenu", "Q")

-- 订阅按键按下事件
Input.Bind("SpawnMenu", InputEvent.Pressed, function()
-- 打开生成菜单
end)

-- 订阅按键释放事件
Input.Bind("SpawnMenu", InputEvent.Released, function()
-- 关闭生成菜单
end)

HTTP​

添加了新类:HTTP!

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

性能优化​

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

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

Server​

Server 静态类的新增内容:

Client​

Client 静态类的新增内容:

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

游戏内控制台​

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

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

备注

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

Timer​

Timer 的新增内容:

命令行界面​

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

Steam 成就​

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

这其中包括成就!我们得到了有才华的朋友 Esther 的支持,她正在为这些成就绘制令人惊叹的艺术画作!

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

脚本改进​

  • Added new Searchers to Package.Require(), we now currently support 5 searchers, which are looked in the following order:

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

  • Package.RequirePackage() now will load a package as a library inside the current package, it means the package loaded will now be automatically sent to clients, and all paths it loads is relative to the package itself (and not to the one which is requiring it anymore).

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

重命名默认资源包​

默认包 NanosWorldWeapons 和 NanosWorldVehicles 已重命名为 nanos-world-weapons 和 nanos-world-vehicles,以遵循包和资产名称的新标准规范。现在引入它们的方式应为 Package.RequirePackage("nanos-world-weapons"),使用方式保持不变(NanosWorldWeapons.AK47())。

常规更改​

  • Cable 获得了新方法::GetAttachedStartTo() 和 :GetAttachedEndTo(),用以获取其两端是否已连接。
  • Player 获得了新方法::SetVOIPVolume()、:GetSteamID()。
  • Pickables 获得了新事件:ReleaseUse 和 PullUse,当角色拉动或释放其使用按键(例如武器扳机)时触发。
  • 改进了 Pickables 和 Props 启用交互触发器的方式。
  • 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 变形目标未同步的问题。
  • 修复了 Discord 自定义集成有时不起作用的问题。
  • 修复了当玩家没有 Steam 个人资料图片时导致崩溃的问题。
  • 修复了在新游戏屏幕取消勾选 Server Announce 时复选框被禁用的问题。
  • 修复了在 Interact 事件内部销毁实体时发生的崩溃问题。
  • 修复了海量的其他崩溃 💥。感谢各位提交的崩溃报告!