[Unity 杂货铺] 编辑器中的 C# 代码热重载
1 概要
这篇文章的唯一内容,是告诉全宇宙有这么一个 Unity 插件:Hot Reload
可以极大地提高游戏开发中 C# 代码迭代速度,实现类似于脚本语言中的热重载。无需重启游戏,无需编译,省下大量等待时间。
属于编辑器插件,理论上不会存在于发布版本中,提升的是开发阶段的迭代效率,并非正式游戏中的重载方案。
下文只是一些相关资料和个人使用感受,仅作备忘。
2 相关链接
更新日志:https://hotreload.net/zh/changelog
Unity Discussions:https://discussions.unity.com/t/hot-reload-edit-code-without-compiling/
执行原理:https://gitlab.hotreload.net/root/hot-reload-releases/-/blob/production/Third%20Party%20Notices.md
3 价格
插件当前价格是 $79.99(一次性购买),偶尔销售节会打五折。可以在官网,也可以在资产商店购买。
好像有一个月的免费使用时间。
瞅了一眼团结资产商店,价格会低一些,这个就见仁见智了。
4 使用背景
很久以前写 Lua 的时候,就觉得修改完代码就可以热重载代码,调试起来十分方便,不需要重启游戏。于是在使用 C# 做开发时,也一直在找寻方便地进行热重载的方式,尽量能减少编译重启的次数。
2023 年以前在 GitHub 上,存在着一些可行的第三方库:UnityScriptHotReload 和 FastScriptReload
但是大部分都限制较大,只能在一个比较小的范围内进行修改,有时候也很难区分哪部分修改成功,哪部分未成功待重新编译,所以实用范围较小。
Hot Reload 解决了很大部分的问题,并且这几年也一直都在更新中,逐步扩展对各种泛型、序列化字段、Unity 属性的支持:功能特性
在某个版本中加入了软链接(Junctions)的支持之后,目前已经成为我项目中的常驻插件了。
另外我觉得,不必重启游戏,在测试和调优中是很有正面意义的。很多时候一些不影响功能的小错误,细节,在需要频繁编译、重启、观察的场景中,大家会宁愿放着不处理,或者等后面汇集后再一起修改。
5 使用场景
记录一些我自己觉得“终于不用等了”的场景:
5.1 界面开发,动效开发
界面向左移动 100 单位,还是 150 单位。动效是播放 0.5 秒,还是 1 秒?
多语言拼写错误,调用了不存在的配置。
不需要重启编译时,是可以极大降低这些负担。
5.2 调试
由于 Unity 链接调试器时常常会卡住,另外在一些场景中,断点调试可能没有一行Debug.Log来得方便。
有时候重启还怕一些错误重现不了,或者有些游戏业务逻辑非常依赖特定的活动时间和等级限制什么的,重启一次会非常麻烦。
此时直接修改加入打印代码会很方便,甚至可以顺便把 Bug 修复完后,继续在当前会话中进行测试验证。
5.3 GM 指令
我自己在开发中有一个DoSomethingInF5()的快捷方法,里面的内容不是固定的,有时候是打开某个界面,播放某个特效,有时候是打印场景中所有的单位,跳转到其他场景。
随用随改,改完直接按 F5 执行。
5.4 编辑器工具开发
Hot Reload 不仅适用于游戏运行中,也适用于编辑器工具。例如编写自定义 Inspector 界面时,几乎是改完代码切回编辑器就能看到样式变化了。
5.5 移动平台的热重载
概要中有说过,Hot Reload 属于编辑器插件,理论上不会存在于发布版本中,也不提供游戏运行功能。
但是他提供了移动端的支持,以供开发阶段对移动端进行修补。大致原理是可以通过连接手机,把修改后的代码发送到移动端,以相同的方式进行重载(仅限 Mono)。
我目前还没有使用过这一功能,将来用到再加上使用反馈。但如何可行的话,省去反复打 APK 调试的时间,那可高效太多了。

浙公网安备 33010602011771号