Skip to content

ZeroUltra/UnityManuallyReload

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

68 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Unity 手动编译 Reload 脚本

这是一个自定义reload domain工具,作用是减少Reload Domain次数,从而降低等待.测试版本是Unity2021/2022,理论上来说2020以上都可.

Unity2021(2020还好)不知是哪个版本,明显感觉编译reload时间冗长🥱😪😯

在Unity中遇到的问题

在unity工作流中,修改脚本->编译脚本->reload domain(重载域)->进入play

通过区分assembly能加快编译,但是reload domain 却很慢,每次编译之后都要reload domain,且进入play模式也会再来一次reload domain

示例:

0

写程序经常会Ctrl+s,一旦保存,就会重新编译,继而触发reload. 有时候会返回Unity编辑器,只是查看场景,并不想reload,会让我们漫长等待.

Unity有个Enter Play Mode Setting 可配置的进入运行模式 - Unity 手册

禁用Reload Domain 可以快速进入播放模式.但是每次修改完脚本还是会重新reload. 还有就是对于静态数据如果没有重新reload 还是会保持之前的数据具体查看关于静态数据问题

当然也通过禁用Auto refresh+ctrl+r来手动刷新也可以,但也会禁用一些资源的刷新

如何解决频繁Reload

需要做的就是,添加新脚本或者修改脚本后,经过确认无误之后,我们才reload,而且在进入 play模式,如果已经reload,不会二次reload

unity 提供了两个API EditorApplication.LockReloadAssemblies(); EditorApplication.UnlockReloadAssemblies();一个加锁,一个解锁.

配合 Enter Play Mode Setting 就可以大大减少时间.

效果图:

111

安装

两种安装方法

  1. 直接下载脚本代码,然后放到Editor文件夹中
  2. 使用Unity PackageManager,add git地址

使用

  1. Unity中Edit->ProjectSetting->Manually Reload Domain ,勾选上Enable Manually Reload
  2. 当修改完脚本之后,按下F5进行reload domain (会自动检测是否需要reload domain)
  3. 如遇其他不明情况按下ctrl+T 组合键强制reload domain

image-20260324144735954

参数说明:

  • Fully Manually Reload 完全手动Reload ,不进行任何自动reload,如果为true,完全由自己决定什么时候reload
  • Editor Scripts Manually Reload 是否Editor代码也需手动Reload,当编辑的代码属于Editor才有效, 即如果为true,那么editor代码编译完后也不会readlo domain 需要手动调用。如果为false,editor代码编译完后会自动调用reload,在写editor GUI的时候可设置为false,方便快速查看。
  • Monitoring Code Behaviour 是否监听代码新建/删除两个行为,默认情况下当创建/删除**(.cs/.asmdef/.asmref)**时会触发reload domain,为true时,代码行为变化不会reload domain。即在Unity的Project视图中新建/删除脚本不会 compile ---> reload

注意点

  • 开启之后,新建脚本,修改脚本或者导入插件的时候,只会编译而不会reload。通过F5或者菜单Tools/Reload Domain/Unlock Reload,手动reload,(相关快捷键自行修改脚本代码)

  • 记住,Unity必须reload之后,才能调用相关域。例如新建mono脚本如果不reload是挂不到gameobject上的。

  • 当设置Fully Manually Reload=false(完全手动模式)时,进入Play模式如果已经reload,则直接进入,如果没有reload则会强制reload(主要是为了重置static数据); 如果为Fully Manually Reload=true,不会执行任何相关reload,进入play模式也不会重置static数据,具体查看 关于静态数据问题

  • 如遇其他问题 按下Ctrl+T强制重载。

  • 有个比较很很很少见情况,当play时会报一些错误(比如静态数据错误),此时再怎么reload都没用,这个时候只要随便改下代码(例如就加个空格都行),然后在回到unity reload之后发现可以正常运行。这个bug不知道是什么原因,应该跟unity内部编译有关系.

需要注意的一点:

​ 当勾选Manually Reload的时候会自动设置Enter play mode setting,如果由于其他操作重新设置了 enter play mode setting,请手动设置成下图正确选项,或者重新勾选Enable Manually Reload进行自动设置。

image-20240228000722436

关于静态数据问题

官方说明

Unity - Manual: Domain Reloading

一些解决方案

joshcamas/unity-domain-reload-helper

JonathanTremblay/UnityFastPlay

stalomeow/QuickPlayMode

更新日志

V1.1.0

  • 现在按下F5进行reloaddomain时,即使是编译锁住状态(unity编辑器右下角有个🔒)也能进行

v1.0.9

  • 添加了 Monitoring Code Behaviour 选项
  • 修改了文字说明
  • 修复bug:当删除所有script时,会标识为editor代码改变

v1.0.8

  • 小修改,如果未启用 Enable Manually Reload,将不显示编译和reload耗时信息
  • 修改了setting ui界面

v1.0.7

  • 添加完全手动模式。开启此模式后,需要完全手动reload。

v1.0.6

  • 添加说明
  • 如遇到锁住问题 按下Ctrl+Alt+T强制重载

image-20231227195442245

v1.0.5

  • 修复当取消EnableManuallyReload勾选时,不会正确reload的bug

v1.0.4

  • 将设置移到ProjectSetting中

  • 新增功能编辑器代码是否手动Reload

    image-20231102201502323

v1.0.3

  • 修复设置未保存的问题 (原来使用了UnityScriptableSingleton<T>,使用过程中发现保存了数据但是加载的时候不会反序列化)

v1.0.2

  • 添加了Unity Package

  • 避免了可能不小心手动多次reload情况

  • 修改了数据保存代码逻辑

  • 修复新建脚本或者assembly的时候没有刷新的问题

v1.0.1

  • 每次进入play模式之前,会检查是否需要reload,已经reload就不用了,没有的话自动reload,这样能保证每次数据的正确性

其他

handzlikchris/FastScriptReload

Misaka-Mikoto-Tech/UnityScriptHotReload:

【Unity】引擎编译时间优化 - 知乎 (zhihu.com)

About

unity manually reload domain 减少等待时间

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages