Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

unity manually reload domain 减少等待时间

ZeroUltra/UnityManuallyReload

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

63 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 还是会保持之前的数据(建议不要禁用,真的很坑) 具体查看:Unity - Manual: Domain Reloading (unity3d.com)

当然有些通过禁用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 ,勾选上Manually Reload
  2. 当修改完脚本之后,按下F5进行reload domain (会自动检测是否需要reload domain)
  3. 如遇一只🔒的情况按下Ttrl+T 组合键强制reload domain

image-20250704171221587

参数说明:

  • 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数据,具体查看 Unity - Manual: Domain Reloading (unity3d.com)

  • 如遇到锁住问题(unity右下角一直出现🔒的情况,可能在导入新插件的时候发生) 按下Ctrl+T强制重载。

  • 有个比较很很很少见情况,当play时会报一些错误(比如静态数据错误),此时再怎么reload都没用,这个时候只要随便改下代码(就加个空格都行),然后在回到unity reload之后发现可以正常运行。这个bug不知道为何,不太像是此插件导致的问题。

需要注意的一点:

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

image-20240228000722436

更新日志

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

v1.0.3

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

v1.0.2

  • 添加了Unity Package

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

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

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

v1.0.1

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

有什么问题,欢迎提Issues

推荐

handzlikchris/FastScriptReload

Misaka-Mikoto-Tech/UnityScriptHotReload:

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

About

unity manually reload domain 减少等待时间

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

AltStyle によって変換されたページ (->オリジナル) /