Arnoya

loading...

UE常用输出调试方法

创建时间2023-11-23
修改时间2023-11-23
617次阅读

前言

在学习和使用 UE 过程中我们时常需要进行一些输出调试,以下为个人总结相对常用的调试输出方法语句,包括一种蓝图方法和两种C++方法

方法一:蓝图

蓝图节点:打印字符串节点,英文版本:print string
最终效果:在屏幕打印(仅供开发调试状态下)
使用方法:

蓝图的调试方法是非常简洁直观且智能的不必像 C++要注意特别多细节
当我们需要特定输出某个所需调试值时只需要把值连接In Text节点即可
操作如下(输出特定的整数):

该蓝图的而外拓展可点击节点下箭头进行其他设置更改,常见更改为输出文本的颜色(Text Color)持续时间(Duration)以下为打印红色字符串到屏幕上的设置持续时间为 2.0f 秒案例


方法二:C++

1. UE_LOG()日志输出

使用规则:UE_LOG(分类,详细级别,文本)
分类:以下是常见的 UE 提供给DEFINE_LOG_CATEGORY宏的类别名称。你可以在位于CoreGlobals.h找到基本提供的分类

  • LogTemp:临时调式日志
  • LogLoad:加载时的事件以及状态的更新日志
  • LogStats:状态日志
  • LogExit:退出时的日志

你也可以自定义类别:以下两部代码均在#inlucde下行使用
.h:DECLARE_LOG_CATEGORY_EXTERN(自定义类名, 详细级别, All)
.cpp:DEFINE_LOG_CATEGORY(自定义类名);
如下代码所示:

  // 头文件下的自定义警告类日志别
  #include "Actor_Debug.generated.h"
  DECLARE_LOG_CATEGORY_EXTERN(MyLog, Log, All);
  //.cpp下使用
  #include "Actor_Debug.h"
  DEFINE_LOG_CATEGORY(MyLog);

详细级别:是一个定义日志记录系统日志详细级别的枚举。它定义了额外的非日志详细级别,允许给定日志换行或设置日志文本的颜色。以下为官方文档提供的列表说明

为了方便看到演示效果,我们对输出日志进行过滤使其只输出:LogTemp,和MyLog
确认其他日志为不勾选,并找到我们所需的日志输出类别



其他说明:日志输出调试更偏向于线上游戏和数据方面的功能开发,在测试网络连接状态,和消息传递上有着显著的优势,是非常轻量且常用的调试方式,而输出的消息会停留在日志上需要手动去清楚,不建议使用其方法调试临时数值
测试代码:

  UE_LOG(MyLog,Warning,TEXT("This a my warming log in diary"))
  UE_LOG(LogTemp,Log,TEXT("this a temp log in diary"))

效果:

相比于蓝图要输出指定的值则需要具备一些类型转换知识,以下为常见转换输出方式以及类型:

	UE_LOG(MyLog,Warning,TEXT("This a my warming log in diary"))
	UE_LOG(LogTemp,Log,TEXT("this a temp log in diary"))
	// 字符串string输出
	UE_LOG(LogTemp, Log, TEXT("An Actor's name is %s"), *this->GetName());
	// 布尔bool值输出
	bool bTempBool=true;
	UE_LOG(LogTemp, Log, TEXT("The bool is %s"), ( bTempBool ? TEXT("true"): TEXT("false") ));
	// 整型int输出
	int TempInteger=8;
	UE_LOG(LogTemp, Log, TEXT("The integer is: %d"), TempInteger);
	// 浮点float输出
	float TempFloat=1.5f;
	UE_LOG(LogTemp, Log, TEXT("The float is: %f"), TempFloat);
	// 向量Vector输出
	FVector TempVector=FVector(0,0,1);
	UE_LOG(LogTemp, Log, TEXT("The vector is: %s"), *TempVector.ToString());
	// 综合输出
	UE_LOG(LogTemp, Warning, TEXT("the actor name is:%s, TempVector is %s, and log tip num is %d"),
		*this->GetName(),*TempVector.ToString(),TempInteger );

效果展示:

2. AddOnScreenDebugMessage()添加至屏幕输出

使用规则:GEngine->AddOnScreenDebugMessage(key, 持续时间, 颜色, Fstring)部分参数可与蓝图对应:
key->key
持续时间->Duration
颜色->Text Color
Fstring->'In Text'

Key:键,通常和打印权限有关,默认情况下-1 即可
持续时间:添加到屏幕后存在的时间,类型为float
颜色:打印出的字符串颜色,通常可以使用 UE 给定的FCOlor来选取输出文本颜色如蓝色FColor::Blue,因为此处只涉及调试输出因此就不阐述其他方式改变调试输出文字颜色了
FString:是UE定义的一种字符串格式其可以配合TEXT()进行赋值转换,如下为代码示例:

    // Fstring的使用
	FVector TempVector=FVector(0,0,5);
	FString TempFstring=FString::Printf(TEXT("the Vector is %s"),*TempVector.ToString());

其他说明:AddOnScreenDebugMessage()相对于UE_LOG()来说要直观一些,可直接在屏幕上看到调试输出的信息。通常用于具体功能上的开发调试,如在测试某个数值的实时变化时使用该方法能更直观的看到数值的变化效果,使用该方法能减少日志输出窗口的负担,让日志窗口少输出不必要的临时消息

测试代码:

	// 普通屏幕输出
	GEngine->AddOnScreenDebugMessage(-1, 2.f, FColor::Blue, TEXT("this is a ScreenDebugMessage"));
	// 综合输出
	int TempInteger=2;
	FVector TempVector=FVector(0,0,5);
	FString DebugMessage = FString::Printf(TEXT("the actor name is:%s, TempVector is %s, and log tip num is %d"),
		*this->GetName(),*TempVector.ToString(),TempInteger);
	GEngine->AddOnScreenDebugMessage(-1, 2.f, FColor::White,DebugMessage);

效果展示:


总结

无论是蓝图还是C++的开发模式,官方都给出了相关的调试方法和案例,在学习和开发过程中不应该局限于一种方式方法,灵活选取调试合适的方法能更快更直观的发现问题的存在并及时修改

文档参考:虚幻引擎官方文档