功能特性

功能

支持的功能

  • 在monobehaviours、普通类或静态类中编辑函数

    • 您可以以任何有效的C#方式编辑函数的主体。我们会重新编译整个函数,因此它的工作方式与您已经习惯的相同。
  • 添加、编辑、删除字段

  • 编辑lambda方法

    • 如果您修改lambda,我们会热重载现有的lambda。例如,在启动期间将lambda存储在静态字段中,然后在不运行启动代码的情况下编辑lambda,您对lambda的更改仍将立即应用。
  • 编辑带闭包的lambda方法

    • 如果您在lambda内部使用外部变量,您的lambda将照常工作。如果您使用新的外部变量,那么只有在您再次创建lambda时,它才会被热重载。例如,Array.Sort(() => …)中的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()

  • 在参数上添加/替换/删除refoutin修饰符

  • 编辑标记为[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被调用");
}

路线图上的功能

如果您正在使用或考虑商业许可证,并且其中之一对您非常重要,请告诉我们,我们会优先考虑它。

  • 添加/删除属性。
  • 添加新类/结构
  • 添加、编辑、删除结构的构造函数
  • 编辑泛型类的非静态构造函数主体
  • 添加/删除/编辑非静态构造函数的声明
  • 添加/编辑枚举
  • 编辑分部类型中的变量初始化器
  • 编辑/添加/删除记录中的字段
  • 使用匿名类型编辑方法主体
  • 修改泛型类中的字段初始化器
  • 添加或删除以下方法关键字之一:partialabstractvirtualoverrideextern
  • 已经执行的异步方法不会被修补 - 只有新的调用才会使用更新的逻辑
  • 支持编辑由Unity Multiplayer hl-api、Photon、Bolt、Mirror等库动态生成的代码
  • 添加C#文件
  • 将更改应用于正在进行的协程

始终需要完全重新编译

  • 添加、修改、删除.asmdef文件。请注意,程序集定义中的脚本按预期受支持,只有对.asmdef文件本身的修改才需要完全重新编译
  • 修改定义符号,或.csproj.sln文件中的其他内容