【UE4C++-ActionRougelike-05】调试工具
1、调试信息
1.1 日志信息
UE_LOG(CategoryName, Verbosity, Format)
/*
函数参数:
CategoryName:日志种类名,可以为不同模块日志可以添加不同的类别名
Verbosity:日志级别(Log,Warning,Error)
Format:日志内容,TEXT()用于将字符串转为UE所需格式
*/
在油桶碰撞中添加日志信息
void ASExplosionBarrel::OnActorHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)
{
//日志种类为临时日志,级别为Log,输出内容
UE_LOG(LogTemp, Log, TEXT("OnActorHit in Explosive Barrel"));
//日志种类为临时日志,级别为Warning,输出碰撞的Actor名,以及游戏内的时间
UE_LOG(LogTemp, Warning, TEXT("OtherActor: %s, at game time:%f"), *GetNameSafe(OtherActor), GetWorld()->TimeSeconds);
//调试绘制字符串,在游戏中碰撞的位置输出CombinedString字符串。头文件:DrawDebugHelpers.h
DrawDebugString(GetWorld(), Hit.ImpactPoint, CombinedString, nullptr, FColor::Green, 2.0f, true);
//ForceComp释放作用力
ForceComp->FireImpulse();
}
效果如下:
2、断点调试
3、断言
类似于if判断会验证一个表达式的真假,一旦断言检查到不符合预期,程序会直接中断甚至抛出异常,利于开发者定位问题;且断言只在debug阶段有效,对于打包好的程序是不会生效的。ensure就是UE中的断言函数。此外还有check,但两者不同之处在于ensure提示错误但不会中断程序,check会直接结束你的关卡测试,所以通常使用ensure。(参考文章:作者:surkea https://www.bilibili.com/read/cv19004443 出处:bilibili)
if (ensure(ProjectileClass)) {
// 获取模型右手位置
FVector RightHandLoc = GetMesh()->GetSocketLocation("Muzzle_01");
// 朝向角色方向,在角色的右手位置生成
FTransform SpawnTM = FTransform(GetActorRotation(), RightHandLoc);
// 此处设置碰撞检测规则为:即使碰撞也总是生成
FActorSpawnParameters SpawnParams;
SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
SpawnParams.Instigator = this;
GetWorld()->SpawnActor<AActor>(ProjectileClass, SpawnTM, SpawnParams);
}