Synth Daily

用Unity引擎走过十年的Gun Rocket更新历程

一名开发者回顾了十年前制作的游戏《Gun Rocket》的更新历程。这款最初使用 Unity 4.6 开发、后升级至 5.5 的游戏,如今已无法在现代系统上运行。为了让游戏重获新生,作者踏上了一条充满挑战的升级之路,将项目从旧版 Unity 迁移至新版。这个过程暴露了 Unity 引擎多年来的巨大变迁,包括版本号命名规则的改变、脚本语言从 JavaScript 到 C# 的统一,以及网络功能 UNet 的废弃。尽管困难重重,作者仍决定砍掉部分功能并继续推进,以适应 2026 年的技术环境。

十年之旅的开端

大约十年前,作者开发了一款名为《Gun Rocket》的游戏,其中包含 100 个关卡、多种飞船和局域网对战模式。这款游戏通过 Steam 发行,曾是作者最成功的个人项目。

然而,最近当作者试图重新运行时,却发现 游戏完全无法启动,日志也无任何信息。作者推测,这可能是由于驱动程序或 Windows API 的兼容性问题导致。

为了让《Gun Rocket》能在 2026 年的环境下运行,一场技术升级在所难免。

Unity 版本号的变迁

项目的最后一次开发记录显示,其使用的是 Unity 5.5.0f3 版本。而回顾更早的 git 历史,它最初诞生于 2015 年的 Unity 4.6 版本。

从 5.5 升级到如今的 Unity 6.x 似乎只是一个大版本的跨越,但事实并非如此。

  • 版本命名规则的改变:大约在 2017 年,为了迎合企业客户的偏好,Unity 将版本号从 5.x 这样的数字命名改为了以年份命名,如 Unity 2017
  • 回归数字命名:如今,Unity 又回到了数字命名,但形式变成了 6000.x.x。作者觉得这种命名方式颇具趣味,并指出其巧妙地解决了版本号排序问题(6000 > 2023)。

要找到旧版的 Unity,必须访问官方的 版本存档库 (Archive)。幸运的是,作者在 2018 年已将项目从 Unity 4.6 升级到了 5.5,否则将无法在官方存档中找到更早的版本。

艰难的升级之路

作者首先尝试在 Unity 5.5.0f3 编辑器中打开项目,但与游戏本身一样,编辑器也无法启动。这可能与 Unity Hub 诞生前的旧版许可证检查机制有关。

第一步:从 5.6 到 2017

作者转而尝试了 Unity 5 系列的最后一个版本 5.6.7f1,并成功启动。随后,项目顺利地升级到了 2017.4.40f1,整个过程波澜不惊。唯一的显著变化是项目中出现了一个新的空文件 manifest.json,标志着 Unity 包管理器 (Package Manager) 的引入。

{
    "dependencies": {
    }
}

这个新系统旨在将 C# 代码移出引擎核心、允许用户选择性安装功能包,并为第三方模块提供标准。

第二步:跳跃至 2019——真正的挑战

信心满满的作者决定跳过 2018 版本,直接升级到 2019.3.15f1。这次升级引发了一系列 重大的破坏性变更

  • Unity 彻底移除了对 JavaScript 的支持
  • 旧的网络解决方案 UNet 被废弃,并且在 2019.1 及以后版本中不再可用。
  • AssetDatabase 和预制件(Prefab)系统都经历了重大改革。

挑战一:告别 JavaScript

幸运的是,作者在项目早期就已转向 C#,整个项目中只有 3 个脚本是用 JavaScript 编写的。将代码本身重写为 C# 很容易,但 修复因此产生的损坏引用却异常艰难

最终,作者采用了一种费时费力的方法:

同时打开 2017 和 2019 两个版本的编辑器,并排手动比对每一个预制件(Prefab)的设置。仅仅为了修复 3 个脚本带来的问题,这个过程耗费了数小时。

挑战二:废弃的网络功能

《Gun Rocket》的局域网对战模式是基于 Unity 5 时代的网络方案 UNet 实现的。由于该功能在游戏中并未引起太大反响,且 UNet 已被完全移除,作者做出了一个简单的决定:直接砍掉整个局域网模式

作者还感慨历史的相似性:Unity 在 2022 年左右推出了新的网络方案 Netcode for Gameobjects,但其官方服务器托管服务也将在 2026 年移交给第三方公司。这不禁让人思考,如果不能通过服务器盈利,第一方网络方案的未来将会如何。