GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — GitHub - ZeroUltra/UnityManuallyReload: unity manually reload domain 减少等待时间

BranchesTags
Open more actions menu

Latest commit

 

History

69 Commits
69 Commits

Folders and files

NameName
Last commit message
Last commit date
.github
.github
 
 
Editor
Editor
 
 
Editor.meta
Editor.meta
 
 
package.json
package.json
 
 
package.json.meta
package.json.meta
 
 

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

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

compilereloadunity

Resources

Readme
Activity

Stars

143 stars

Watchers

2 watching

Forks

19 forks
Report repository

Releases

Packages

Used by

Contributors

Languages

You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.