多线程注意事项
不能游戏线程(GameThread)之外的线程中不能做以下事,否则会导致异常。
- 创建/修改/删除游戏对象(UObjects / AActors)
- 使用定时器(TimerManager)
- 使用任何绘制接口,例如DrawDebugLine。
非要做的话,可以通过异步的方式,如下:
#include "Async.h" AsyncTask(ENamedThreads::GameThread, [=]() { // 这里可以做上面不能做的事了 });
自定义控制台变量
在调试运行时,使用自定义的控制台变量可以方便的在控制台中随时设置值,从而控制业务逻辑,而且不会出现在最终发布版本中。
例如FAutoConsoleVariable
,支持bool、int32、float和const TCHAR*变量类型。
示例:
static FAutoConsoleVariable isShowExplodeRange(TEXT("c.isShowExplodeRange"), false, TEXT("isShowExplodeRange"), ECVF_Cheat); if (isShowExplodeRange->GetBool()) { // 业务代码 }
程序调试运行时,通过(`)或(~)键打开控制台,输入c.isShowExplodeRange 1
或c.isShowExplodeRange 0
即可修改这个bool值。
日志
1、在当前屏幕打印。
GEngine->AddOnScreenDebugMessage(-1, 2.f, FColor::Red, TEXT("XXXX"));
对应蓝图的Print String
。首参数-1,表示无需更新或刷新此消息,第二个参数表示持续时间。
2、在编辑器的“输出日志”窗口打印。
UE_LOG(LogTemp, Log, TEXT("XXXX")); UE_LOG(LogTemp, Log, TEXT("XXXX:%d"), 233); // 格式化输出