功能
支持的功能
-
在monobehaviours、普通类或静态类中编辑函数
- 您可以以任何有效的C#方式编辑函数的主体。我们会重新编译整个函数,因此它的工作方式与您已经习惯的相同。
-
添加、编辑、删除字段
- 有关支持范围,请参阅字段文档。
-
编辑lambda方法
- 如果您修改lambda,我们会热重载现有的lambda。例如,在启动期间将lambda存储在静态字段中,然后在不运行启动代码的情况下编辑lambda,您对lambda的更改仍将立即应用。
-
编辑带闭包的lambda方法
- 如果您在lambda内部使用外部变量,您的lambda将照常工作。如果您使用新的外部变量,那么只有在您再次创建lambda时,它才会被热重载。例如,
Array.Sort(() => …)
中的lambda在每次运行代码时都会重新创建,因此它将始终按预期工作。
- 如果您在lambda内部使用外部变量,您的lambda将照常工作。如果您使用新的外部变量,那么只有在您再次创建lambda时,它才会被热重载。例如,
-
编辑
async/await
方法 -
编辑属性(
get
/set
) -
编辑事件(
add
/remove
) -
编辑索引器(方括号访问,如字典)
-
编辑运算符方法(显式和隐式运算符)
-
编辑转换运算符方法,如
==
和+=
-
在非泛型类中编辑非静态构造函数的主体
-
添加/编辑/删除本地函数
-
编辑泛型类方法
-
将方法从
async
更改为sync
,或从sync
更改为async
-
删除任何方法、属性、字段、类
-
添加/编辑/删除
using
指令。例如Using UnityEngine
-
添加/编辑变量初始化器。例如类中的
private int x = 1
- 例如
int myField = 10
。请注意,只有在创建新类实例时才会初始化变量。我们不会为已经实例化的类重新运行变量初始化器,因为这可能会破坏现有代码。
- 例如
-
使用较新的C#语法。Switch表达式、using语句、模式匹配、null合并语句等。默认情况下,我们支持C#编译器支持的所有语法。
-
在任何地方使用可空类型
-
添加新方法
-
在方法中添加、编辑、删除参数
-
更改任何方法的返回类型。包括实例、静态、属性、事件、索引器、泛型等。
-
更改可访问性,例如将方法从
private
更改为public
-
静态关键字更改,例如使方法变为静态
-
重命名方法
-
像普通方法一样编辑泛型方法
-
添加/编辑/删除泛型参数
-
添加/编辑/删除泛型方法的约束子句(例如
where T : class, new()
) -
在参数上添加/替换/删除
ref
、out
、in
修饰符 -
编辑标记为
[BurstCompile]
的代码 -
将调试器附加到Unity编辑器中已修改的代码,包括burst编译的代码
-
将调试器附加到Unity播放器(设备上)。支持所有代码编辑,就像在Unity编辑器中一样
-
部分协程支持 - 更改会应用于新创建的协程,但正在进行的协程尚不会更新
对Hot Reload补丁作出反应
当应用新补丁时,Hot Reload可以调用您的函数。有两个属性允许您的函数在Hot Reload补丁上被调用:
InvokeOnHotReload属性
每当任何函数被修补(或添加新函数)时,都会调用具有此属性的方法:
static class MyStaticClass {
// 编辑MyMethod以调用HandleMethodPatches
static void MyMethod() {
Debug.Log("当前时间是:" + DateTime.Now);
}
[InvokeOnHotReload]
static void HandleMethodPatches(List<MethodPatch> patches) { // patches参数是可选的
foreach (MethodPatch methodPatch in patches) {
Debug.Log($"收到方法补丁:{methodPatch.newMethod.Name}");
}
}
}
实例方法也受支持:
public class MyMonobehaviourClass : MonoBehaviour {
// 编辑MyMethod以调用HandleMethodPatches
void MyMethod() {
Debug.Log("当前时间是:" + DateTime.Now);
}
[InvokeOnHotReload]
void HandleMethodPatches(List<MethodPatch> patches) { // patches参数是可选的
foreach (MethodPatch methodPatch in patches) {
Debug.Log($"收到方法补丁:{methodPatch.newMethod.Name}");
}
}
}
MethodPatch
是一个包含以下内容的类:
- 原始方法:由Unity编辑器编译。对于新添加的方法为Null。
- 先前方法:Hot Reload应用其补丁之前的方法。对于新添加的方法为Null。
- 新方法:由Hot Reload生成的方法。
函数删除不会调用带有InvokeOnHotReload
的方法。更改函数名称的作用是删除先前的方法并添加一个新方法。
在域重载之后,例如从编辑模式切换到播放模式,Hot Reload会将所有更改重新应用于新域。因此,InvokeOnHotReload
将与域重载之前应用的所有补丁一起被调用。
InvokeOnHotReloadLocal属性
当方法本身被修改时,将调用具有此属性的方法。与InvokeOnHotReload
类似,此属性可以添加到任何类中的实例和静态方法中。
[InvokeOnHotReloadLocal]
static void MyMethod() {
// 更改下面的字符串以接收日志
Debug.Log("MyMethod被调用");
}
路线图上的功能
如果您正在使用或考虑商业许可证,并且其中之一对您非常重要,请告诉我们,我们会优先考虑它。
- 添加/删除属性。
- 添加新类/结构
- 添加、编辑、删除结构的构造函数
- 编辑泛型类的非静态构造函数主体
- 添加/删除/编辑非静态构造函数的声明
- 添加/编辑枚举
- 编辑分部类型中的变量初始化器
- 编辑/添加/删除记录中的字段
- 使用匿名类型编辑方法主体
- 修改泛型类中的字段初始化器
- 添加或删除以下方法关键字之一:
partial
、abstract
、virtual
、override
、extern
- 已经执行的异步方法不会被修补 - 只有新的调用才会使用更新的逻辑
- 支持编辑由Unity Multiplayer hl-api、Photon、Bolt、Mirror等库动态生成的代码
- 添加C#文件
- 将更改应用于正在进行的协程
始终需要完全重新编译
- 添加、修改、删除
.asmdef
文件。请注意,程序集定义中的脚本按预期受支持,只有对.asmdef
文件本身的修改才需要完全重新编译 - 修改定义符号,或
.csproj
或.sln
文件中的其他内容