前言

虚幻5把热重载更精进了一步,真的热重载是来了!

以前工作的时候写Java,比较头疼的问题就是开发业务出现Bug,每次进行测试,都需要关掉运行程序,重新启动才能将新的逻辑应用。但是后来Java引入了热重载机制,允许你不关闭运行程序,直接将新编写的代码加载到应用逻辑中,大大提升了开发效率。

虚幻4中,Eipc也加入了热重载,主要是让开发者在项目编码过程中,不需要关闭引擎编辑器,将新编写的逻辑,编译后加载到引擎中。但需要先关闭运行的项目,然后再重新运行,才能看到加入的逻辑结果

虚幻5对此进行了改进,新的热重载,不需要你关闭运行的项目工程,在调整后直接编译即可加载新的逻辑到程序中,这可以有效提升了开发效率。

操作

1、编译方式变化

虚幻5中,热重载功能默认是开启的,由此带来了新的问题,如果你通过Rider(JetBrains Rider 2022.2.1 Build #RD-222.3739.37)启动引擎(非调试模式启动),编译代码会提示如下错误:

错误提示
1
Microsoft.MakeFile.targets(45, 5): [MSB3073] 命令“"D:\Program Files\Epic Games\UE_5.2\Engine\Build\BatchFiles\Build.bat" UEPracEditor Win64 Development -Project="E:\ZACK\Practise\UEPrac\UEPrac.uproject" -WaitMutex -FromMsBuild”已退出,代码为 6。

查看日志细节可以看到相关说明,主要是说需要使用快捷键“Ctrl+Alt+F11”来完成编译。

1
Unable to build while Live Coding is active. Exit the editor and game, or press Ctrl+Alt+F11 if iterating on code in the editor or game

2、使用新热重载

例如新建一个Userwidget类,并在类内编写一个函数,暴露到蓝图中,函数声明和定义结构如下:

c++
1
2
3
4
5
6
7
8
9
//声明 在头文件中
UFUNCTION(BlueprintCallable)
void CallFun();

//定义 在源文件中
void UMyUserWidget::CallFun()
{
	UE_LOG(LogTemp, Log, TEXT("Hello"));
}

在引擎中,继承UMG类,并添加到视口中,通过按钮调用CallFun函数。运行工程,测试点击按钮,你会在控制台看到输出日志

LogTemp: Hello

注意,这个时候,不关闭运行程序,直接修改源码中函数CallFun内逻辑,如下:

c++
1
2
3
4
5
//定义 在源文件中
void UMyUserWidget::CallFun()
{
	UE_LOG(LogTemp, Log, TEXT("Hello Jam"));
}

然后使用快捷键Ctrl+Alt+F11进行编译,再次点击按钮,控制台将输出日志

LogTemp: Hello Jam

这就是新的热重载,不需要你关闭运行程序,即可加载新的执行逻辑!这在复杂逻辑设计中修改Bug时非常有用!

3、关闭热重载

关闭热重载的方法很简单,可以到编辑器偏好设置中找到实时代码编写,去掉启用实时代码编写的勾。或是在编辑器中右下角编译按钮旁边找到设置,也可以关闭。具体参照下图:

编辑器偏好设置中关闭
编辑器偏好设置中关闭
编译项配置中关闭
编译项配置中关闭
关闭Livecoding后,在Rider中即可恢复使用之前的编译方式,也不会在提示编译操作错误。

总结

使用热重载时,应该尽量避免以下操作,这将导致热重载失败无效。

  • 可以增加普通函数,不要增反射函数(UFUNCTION标注)
  • 可以增加普通属性,不要增反射属性(UPROPERTY标注)
  • 可以删除普通函数和属性,不可以删除反射函数和属性(UFUNCTION和UPROPERTY标记)
  • 可以添加新的U类,但不能删除已经被使用(实例化)U类
  • 可以添加普通类,但不要删除被使用的类(实例化)
  • 不要修改已经编译好的反射函数(UFUNCTION标记)的返回类型,函数名称,参表
  • 不要修改已经编译好的反射属性(UPROPERTY标记)名称或类型
  • 不要修改U类的名称或是说明符
  • 添加新的成员函数(普通)第一次编译后可能会提示找不到标识符,可以再次编译解决问题
  • 可以修改普通函数的名称,返回类型,参表。可以修改普通属性的类型,参数名称

最后提醒:在测试过程中发现普通属性和函数的调整,有概率导致出错,综合来看,尽量只调整逻辑部分,不要调整结构部分。

引擎版本:5.2

Rider版本:JetBrains Rider 2022.2.1 Build #RD-222.3739.37