Unity不自动重载是因为未配置文件监听与编译触发机制:需启用Refresh external project after changes、安装启用Unity Package(≥2.0.22)、确保VSCode打开项目根目录,并避免编译错误或状态锁阻塞。

VSCode里改完C#脚本,为什么Unity不自动重载?
因为Unity默认不监听VSCode保存动作,也不主动触发编译。你按Ctrl+S只是保存了文件,Unity根本不知道——它只认自己内部的“编译触发机制”。常见现象是:改完代码、切回Unity,界面没反应;手动点Play才生效;甚至出现“旧逻辑还在跑”的错觉。
根本原因在于Unity的脚本编译流程和编辑器事件未与VSCode打通。不是VSCode慢,而是它没被配置成“能喊醒Unity的人”。
- 确保Unity中勾选了
Preferences → External Tools → Refresh external project after changes - 必须安装并启用
Visual Studio Code EditorUnity Package(不是VSCode插件!),版本≥2.0.22 - Unity 2021.3+ 用户注意:该包已内置,但需在Package Manager里确认状态为“Enabled”,而非“Installed”
- 不要依赖
Assets → Open C# Project来刷新——它只生成项目文件,不触发编译
如何让Unity在VSCode保存后立刻编译?
靠的是Unity的Assembly Reload Events + 文件系统监听配合。VSCode本身不发信号,但Unity可以监听.cs文件变更并自动响应,前提是环境干净、无阻塞错误。
- 关闭Unity的
Auto Refresh(Edit → Preferences → General → Auto Refresh)反而更稳——它常因资源导入卡住而延迟脚本编译 - 改用“手动触发编译”:在VSCode中保存后,按
Ctrl+Shift+B(Windows)或Cmd+Shift+B(macOS)调出任务面板,选择Unity: Compile Scripts(需已安装Unity Tools扩展) - 如果没这个任务,说明
Unity Tools未识别到Unity项目根目录——检查项目里是否有ProjectSettings/ProjectVersion.txt,且VSCode工作区打开的是项目根文件夹 - 避免在
Editor文件夹外写编辑器脚本却忘了加#if UNITY_EDITOR,这类编译错误会静默阻断整个重载流程
XLua热重载:VSCode改Lua,Unity里实时生效的关键配置
XLua本身不依赖Unity编译流程,所以“热重载”体验比C#更直接——但VSCode必须把Lua文件正确同步进Unity的StreamingAssets或Resources路径,且XLua要监听到变更。
- 确保Lua脚本放在
Assets/StreamingAssets/lua/下(推荐),并在C#中用XLua.LuaEnv.DoString或DoFile加载时启用cache = false - 在VSCode中安装
Lua插件(如sumneko.lua),并配置lua.runtime.version为5.3(XLua默认兼容此版本) - 关键一步:Unity中调用
XLua.LuaEnv.ReloadAll()或监听文件变更后手动require重载模块——VSCode改完保存,你得在C#里加一句触发逻辑,比如用FileSystemWatcher监听StreamingAssets目录 - 别把Lua脚本放
Assets/Resources里还用Resources.Load——它会打包进AssetBundle,改了也不会实时生效
为什么有时候“明明改了,Unity就是不更新”?
最常被忽略的不是配置,而是Unity的编译状态锁。一个隐藏的Library/ScriptAssemblies/临时文件没释放、一个正在后台运行的协程占着主线程、甚至Unity编辑器窗口失焦超过3秒,都可能让重载挂起。
- 看Unity右下角状态栏:如果显示
Compiling...但一直不动,大概率是某个.cs文件有语法错误,导致编译器卡死——去Console找红色报错,哪怕只是多了一个逗号 - 不要在Unity Play模式下频繁保存脚本:部分生命周期方法(如
OnEnable)可能被重复调用,引发状态混乱,看起来像“没生效” - VSCode的
files.autoSave设为onFocusChange比onDelay更可靠——切到Unity前自动保存,避免“以为保存了其实没点Ctrl+S” - Unity 2023.2+ 用户注意:
Assembly Definition Files (.asmdef)引用关系错乱时,修改子模块代码不会触发父模块重编译,得手动删Library/ScriptAssemblies/*.dll再试



















