74 lines
2.9 KiB
Markdown
74 lines
2.9 KiB
Markdown
|
---
|
|||
|
title: UE4 Gameplay Debug技巧
|
|||
|
date: 2022-12-09 11:30:54
|
|||
|
excerpt: Debug
|
|||
|
tags:
|
|||
|
rating: ⭐
|
|||
|
---
|
|||
|
## debug技巧
|
|||
|
### 在release模式下开启断点的方法
|
|||
|
如果要debug代码可以用一个非常古典的办法用
|
|||
|
`#pragma optimize("",off)` 与`#pragma optimize("",on)` 来将一部分代码排除在优化以外
|
|||
|
|
|||
|
### Ue4中的可视化debug法——vlog
|
|||
|
http://api.unrealengine.com/CHN/Gameplay/Tools/VisualLogger/index.html
|
|||
|
实现GrabDebugSnapshot接口,之后调用UE_VLOG()宏。
|
|||
|
```c++
|
|||
|
#if ENABLE_VISUAL_LOG
|
|||
|
/** Appends information about this actor to the visual logger */
|
|||
|
virtual void GrabDebugSnapshot(FVisualLogEntry* Snapshot) const override;
|
|||
|
#endif
|
|||
|
#if ENABLE_VISUAL_LOG
|
|||
|
void AGDCCharacter::GrabDebugSnapshot(FVisualLogEntry* Snapshot) const
|
|||
|
{
|
|||
|
Super::GrabDebugSnapshot(Snapshot);
|
|||
|
const int32 CatIndex = Snapshot->Status.AddZeroed();
|
|||
|
FVisualLogStatusCategory& PlaceableCategory = Snapshot->Status[CatIndex];
|
|||
|
PlaceableCategory.Category = TEXT("GDC Sample");
|
|||
|
PlaceableCategory.Add(TEXT("Projectile Class"), ProjectileClass != nullptr ? ProjectileClass->GetName() : TEXT("None"));
|
|||
|
}
|
|||
|
#endif
|
|||
|
void AGDCCharacter::OnFire()
|
|||
|
{
|
|||
|
// try and fire a projectile
|
|||
|
if (ProjectileClass != NULL)
|
|||
|
{
|
|||
|
const FRotator SpawnRotation = GetControlRotation();
|
|||
|
// MuzzleOffset is in camera space, so transform it to world space before offsetting from the character location to find the final muzzle position
|
|||
|
const FVector SpawnLocation = GetActorLocation() + SpawnRotation.RotateVector(GunOffset);
|
|||
|
UWorld* const World = GetWorld();
|
|||
|
if (World != NULL)
|
|||
|
{
|
|||
|
// spawn the projectile at the muzzle
|
|||
|
World->SpawnActor<AGDCProjectile>(ProjectileClass, SpawnLocation, SpawnRotation);
|
|||
|
UE_VLOG(this, LogFPChar, Verbose, TEXT("Fired projectile (%s) from location (%s) with rotation (%s)"),
|
|||
|
*ProjectileClass->GetName(),
|
|||
|
*SpawnLocation.ToString(),
|
|||
|
*SpawnRotation.ToString());
|
|||
|
}
|
|||
|
}
|
|||
|
// try and play the sound if specified
|
|||
|
if (FireSound != NULL)
|
|||
|
{
|
|||
|
UGameplayStatics::PlaySoundAtLocation(this, FireSound, GetActorLocation());
|
|||
|
}
|
|||
|
// try and play a firing animation if specified
|
|||
|
if(FireAnimation != NULL)
|
|||
|
{
|
|||
|
// Get the animation object for the arms mesh
|
|||
|
UAnimInstance* AnimInstance = Mesh1P->GetAnimInstance();
|
|||
|
if(AnimInstance != NULL)
|
|||
|
{
|
|||
|
AnimInstance->Montage_Play(FireAnimation, 1.f);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
之后就可以在visual logger里看到实时数据。除此之外还有一些可视的形状log:
|
|||
|
1. UE_VLOG_SEGMENT
|
|||
|
2. UE_VLOG_LOCATION
|
|||
|
3. UE_VLOG_BOX (axis aligned box)
|
|||
|
4. UE_VLOG_OBOX (oriented box)
|
|||
|
5. UE_VLOG_CONE
|
|||
|
6. UE_VLOG_CYLINDER
|
|||
|
7. UE_VLOG_CAPSULE
|