BlueRoseNote/03-UnrealEngine/Gameplay/Debug/UE4 Gameplay Debug技巧.md
2023-06-29 11:55:02 +08:00

74 lines
2.9 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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