Unity 编辑器热更C# FastScriptReload

工具源码:https://github.com/handzlikchris/FastScriptReload


介绍

  • 用于运行时修改C#后能快速重新编译C#并生效,避免每次改C#,unity全部代码重新编译,耗时旧且需要重启游戏。

使用

  • 需要手动调整AssetPipeline自动刷新模式,即改成运行时不要自动刷新资源,同时意味着:

    • 运行时改shader代码不会及时生效,如果主要调试shader,还是要开运行时刷新。

    • 运行时window下改工程资源,unity不会刷新,比如外部新增一张图,unity不会刷新显示。


原理

  1. FastScriptReloadManagerEditorApplication.update每帧检查所有配置的*.cs文件

    1. System.IO.FileSystemWatcher.Changed 提供文件变化时事件
  2. 对变化的C#文件重新创建C#文件

    1. 对原来C#文件语法分析,对新增变量和方法另外封装,对修改的变量不用另外处理。类似将新增的变量存到他一个临时字典里,访问就到他的字典里取。生成.SourceCodeCombined.cs文件
    • 生成.rsp文件,包含编译需要的一些信息。

    • 使用.net命令和csc.dll工具编译C#代码为DLL文件。

  3. 安卓环境的话,这里会把dll转成字节流发给手机,手机收到后下面流程一致。

  4. 使用System.Reflection.Assembly.LoadFrom加载DLL文件。

  5. AssemblyChangesLoader.DynamicallyUpdateMethodsForCreatedAssembly 对所有已存在的C#方法,重定向到新的C#方法:Memory.DetourMethod,即把旧的函数指针指向新的函数。


安卓环境测试

  • 原理和上面一致,只是多了层网络收发,即把DLL的字节流发给手机,手机收到消息后加载程序集即可。
相关推荐
深挖派36 分钟前
GoLand 2026.1 安装配置与环境搭建 (保姆级图文教程)
后端·golang·编辑器·go·goland
郝学胜-神的一滴40 分钟前
[简化版 GAMES 101] 计算机图形学 04:二维变换上
c++·算法·unity·godot·图形渲染·unreal engine·cesium
南無忘码至尊2 小时前
Unity学习90天-第2天-认识键盘 / 鼠标输入(PC)并实现WASD 移动,鼠标控制物体转向
学习·unity·c#·游戏开发
星夜泊客2 小时前
unity 海底海洋资源OceanEnviromentPackUrp材质丢失修正
unity·游戏引擎·材质
William_cl2 小时前
C# ASP.NET 分层架构实战:BLL (Service) 业务层从入门到封神(规范 + 避坑)
架构·c#·asp.net
weixin_424294673 小时前
Unity 的Button Animator
unity·游戏引擎
꯭爿꯭巎꯭3 小时前
visual studio code (vscode)下载
ide·vscode·编辑器
qq_454245033 小时前
图数据标准化与智能去重框架:设计与实现解析
数据结构·架构·c#·图论
UQ_rookie3 小时前
【Unity3D】在URP渲染管线下使用liltoon插件出现粉色无法渲染情况的解决方案
unity·游戏引擎·shader·urp·着色器·vrchat·liltoon
CSharp精选营3 小时前
C# 如何减少代码运行时间:7 个实战技巧
性能优化·c#·.net·技术干货·实战技巧