虚幻引擎中的日志系统

在软件项目中,日志一直扮演着一个及其重要的角色。程序员经常依赖它来定位问题,在某些不方便调试的情况下,日志甚至是唯一一个可以依赖的工具。虚幻作为一个游戏引擎,它的强大体现在各个方面,也包括日志系统。在本文里我就引擎提供的三种打日志的方式来介绍这一系统。

提到日志,大概我们第一个想到的就是在输出终端上打印的日志。对于这类日志引擎提供了UE_LOG宏来实现。UE_LOG不仅仅有了种类众多的预定义(Category)种类,还有日志级别(Verbosity)控制。预定义的日志种类声明可以查看CoreGlobal.h文件。我们选择LogTemp这个预定义的日志种类来举例,比如如下的代码:

 UE_LOG(LogTemp, Log, TEXT("Hit, hit"));
 UE_LOG(LogTemp, Warning, TEXT("Hit, hit"));
 UE_LOG(LogTemp, Error, TEXT("Hit, hit"));

这段程序运行起来后会在引擎编辑器里的Output Log窗口输出这样的日志:


OutputLog.png

UE_LOG宏的第一个参数就是日志种类(Category),第二个是日志级别(Verbosity),剩下的就是日志内容了。我们可以看到编辑器根据日志级别的不同,特意用不同的颜色打印日志,以方便我们查看。当日志数量过多时,我们还可以根据种类(Category)对日志进行过滤,只查看我们感兴趣的类别。

除了使用引擎预定义的日志种类输出,我们还可以自定义日志种类(Category)。比如我们的模块叫FPSGame,我们可以在模块头文件上加上一个声明日志种类的宏:

DECLARE_LOG_CATEGORY_EXTERN(FPSGame, All, All)

然后在模块的CPP文件中加上定义日志种类的宏:

DEFINE_LOG_CATEGORY(FPSGame)

这样我们就可以用FPSGame这个日志类别来输出日志:

UE_LOG(FPSGame, Warning, TEXT("Hit, hit"))

用UE_LOG输出日志只会在编辑器的Output Log窗口里显示,但我们并不只是在编辑器里运行我们的游戏,引擎的开发者为我们也想到了这一点,给我们提供了一个在游戏屏幕上显示日志的函数:AddOnScreenDebugMessage。比如在代码里我需要在玩家往前/右移动时在屏幕上显示移动的数值,像下面这样做:

void AFPSCharacter::MoveForward(float Value)
{
    FString DebugMsg = FString::Printf(TEXT("Move forward:%s"), *FString::SanitizeFloat(Value)); 
    int32 key = 1; 
    GEngine->AddOnScreenDebugMessage(key, 1, FColor::Green, DebugMsg);;
}
void AFPSCharacter::MoveRight(float Value)
{ 
    FString DebugMsg = FString::Printf(TEXT("Move right:%s"), *FString::SanitizeFloat(Value));
    int32 key = 2; 
    GEngine->AddOnScreenDebugMessage(key, 1, FColor::Blue, DebugMsg);
 }

当程序运行起来后,你就可以在游戏窗口左上角看到这样的显示:


ScreenString.PNG

需要提一下的是AddOnScreenDebugMessage的第一个参数是key值,用来控制屏幕上显示日志的唯一性的,也就是说key值相同的日志只会显示一个。另外就是在引擎版本4.19里这个函数有bug会导致日志在屏幕上显示不出来,假如你遇到这样的问题,升级到最新版本应该就好了。

除了在屏幕上显示日志,有时候我们还需要在游戏3D场景里也显示日志,比如我们在射击游戏里标注一下子弹飞行过程中碰撞到了那些位置,为了满足这样的需求,引擎特意提供了DrawDebugString这个函数,使用方式如下:

void AFPSProjectile::OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)
{
    if ((OtherActor != NULL) && (OtherActor != this) && (OtherComp != NULL) && OtherComp->IsSimulatingPhysics()) 
    { 
         OtherComp->AddImpulseAtLocation(GetVelocity() * 100.0f, GetActorLocation());   
        Destroy(); 
    }
    DrawDebugString(GetWorld(), Hit.ImpactPoint, "Hit", nullptr, FColor::Red, 2.0f, true);
}

这段程序运行起来后就会在子弹碰撞的地方都标上红色的“Hit”字样,帮助开发者定位子弹的运动轨迹:


StringInScene.PNG

以上就是虚幻引擎提供的日志功能了。有了这三种打日志的方式,作为使用者的我们要是使用得当,一定能让我们的开发事半功倍。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,975评论 3 119
  • 上肢 项目一:引体向上 -40 12*2, -35 12*2 项目二:高位下拉 25kg 12*4 项目三:哑铃卧...
    oppy阅读 129评论 0 0
  • 毒品是没有希望人的希望。----吉姆·莫里森 第一章 地球新历 2535年6月35日 东8区时间 20:25 来自...
    零重力科幻阅读 707评论 2 3
  • 坦白说,这期2阶班是教得比较辛苦的一个班,除了原有1阶升上来的孩子,又插班加入两个新同学。他们很活跃,英语...
    TinaLiu丹阅读 265评论 0 0
  • 人要想得开,放得下。今天再大的事,明天就是小事;今年再大的事,明年就是故事;今生再大的事,来世就是传说。 ...
    来喜wzf阅读 1,425评论 28 43