[UE4] ブロック崩しを作る #5 Debug (C++)

# はじめに
この記事は [[UE4] ブロック崩しを作る #4 PlayerController (C++)](https://qiita.com/jamaican/items/1e968afd31825249c70b) の続きになります。
第3, 4回では C++ を使いましたが、C++がうまく動かなかった時に、その原因を調べるデバッグ手法についてまとめます。

# 参考リンク

[[UE4] UE_LOGについてあれこれ](https://historia.co.jp/archives/5532/)


# ログ出力(コンソール画面)
**UE_LOG** を使って UE4 Editor の Output log にログを表示させる事ができます

### 使用例

```C++:PlayerController_BB.cpp
void APlayerController_BB::BeginPlay()
{
    :
    UE_LOG(LogTemp, Display, TEXT("Display log"));
    UE_LOG(LogTemp, Warning, TEXT("Warning log"));
    UE_LOG(LogTemp, Error, TEXT("Error log"));
```

### 出力例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39286/24f02dd5-930e-8364-321b-0502211a30ad.png)


* 第一引数に指定している LogTemp は**カテゴリー**です
* 第二引数に指定している Display などは**Verbosity**です
* それぞれの引数にどのような値を指定できるかは下記のヒストリア様の記事が詳しいです
* また、こちらのログファイルとしても出力されています。
  * 出力される場所は プロジェクトフォルダの Saved → Logs の中のです。

https://historia.co.jp/archives/5532/

# ログ出力(ゲーム画面)
**AddOnScreenDebugMessage** はゲーム画面にログを表示させる事ができます。
（使いどころとしてはログではなくデバッグ出力？）

### 使用例

```C++:PlayerController_BB.cpp
void APlayerController_BB::BeginPlay()
{
    :
    GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, "Log");
    GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Blue, "Log2");
    GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Green, "Log3");
```

### 出力例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39286/c0a827dc-39ae-0e53-60ec-ba15c4a24971.png)

* 第１引数に指定している -1 は **Key** です
  * 同じ Key の表示は１つしか画面に表示されません (Key = -1 だけは例外で同時にも表示できる)
  * 使用例の Key = -1 を全て Key = 0 に変えると、最後の Green しか表示されなくなります
* 第２引数に指定している 10.0f は **表示時間** です。(10.0f = 10秒)
* それぞれの引数にどのような値を指定できるかは公式のドキュメントが詳しいです
  * ドキュメントにあるように第５引数、第６引数も指定できます
  * 第５引数 **bool bNewerOnTop**
  * 第６引数 **const FVector2D & TextScale**
 
https://docs.unrealengine.com/4.27/en-US/API/Runtime/Engine/Engine/UEngine/AddOnScreenDebugMessage/1/

# Assert

UE4 では Assert というキーワードは使わず **check**, **verify**, **ensure** を使うようです。

https://docs.unrealengine.com/4.27/ja/ProgrammingAndScripting/ProgrammingWithCPP/Assertions/

### 使用例
```C++:PlayerController_BB.cpp
void APlayerController_BB::BeginPlay()
{
    Super::BeginPlay();
    APawn* pPawn = GetPawn();
    check(pPawn == nullptr); // わざと assert に引っかかるように判定を変更
    :
```

### 出力例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39286/eea3999d-abb5-a32d-0e78-56016e914519.png)

* なんと check では **Editorごと終了してしまいます**
  * 例外が発生したファイル名やその行数なども表示されるのですが、開発中にはちょっと使いづらそうです
* **check** だけではなく **verify** もエディタごと終了してしまうのは同様のようです
* **ensure** はエディタは終了しませんが、ゲームも止まることはありません
  * Output Log には下記のようなログが出力されます
* check, verify, ensure も次に紹介する Visual Studio で Attach している状態であれば発生時にデバッガで捕まるようになります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39286/311fd39b-a024-1a97-2282-6f9bc796bd30.png)


# ブレークポイント
Visual Studio でブレークポインを貼れるようにするには下記の手順が必要です

* [UE4デバッグシンボルのインストール](#ue4デバッグシンボルのインストール)
* [Visual Studio でコード内にブレークポイントを追加](#visual-studio-でコード内にブレークポイントを追加)
* [Visual Studio から UE4 Editor に Attach](#visual-studio-から-ue4-editor-に-attach)
* [UE4 Editor で Play を行う](#ue4-editor-で-play-を行う)

## UE4デバッグシンボルのインストール

* 「Epic Games Launcher」を開く
* 「Unreal Engine」→「Library」を選択して UE4 の Options を表示させる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39286/df20bbc1-fb68-cb5b-35fd-32a60241ecc3.png)

* 表示された Options から「Editor symbols for debugging」にチェックを入れて「Apply」をクリック
  * **36GB超え!** のファイルがダウンロードされます 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39286/b26b7c05-5795-06b3-baef-e237b1327d44.png)

## Visual Studio でコード内にブレークポイントを追加
コード内の止めたい場所にブレークポイントを追加します

## Visual Studio から UE4 Editor に Attach
Project と Visual Studio を起動します
Visual Studio の上部メニューから「Debug」→「Attach to Process...」を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39286/a204b815-02a2-7db0-0a94-15e6e186ff3d.png)

表示されたウィンドウから「UE4Editor.exe」を選択し、「Attachボタン」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39286/950ed536-55a0-1d8f-6767-c5b8f7565e60.png)

## UE4 Editor で Play を行う
UE4 Editor の Play を行うと、ブレークポイントまで処理が進んだ際に、ブレークポイントの場所で止まるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39286/5e71a929-42fc-65df-5218-6f6ef752d613.png)

#まとめ

* 引数の範囲チェックなど普段使いでは **UE_LOG** の色付きログ(Warning や Error)で出力するのが良さそうです
* Assert目的には **ensure** を使うのがいいかもしれません(Editorが落ちないので)
* どうしても不明なバグに遭遇したら追加でログを仕込んだり **ブレークポイント** で引っ掛けて確認するのが良さそうです
* 他にも有用なデバッグ手法はあると思いますので、調べがついたらこの記事に追記してゆきます

# 次回
次回はブロック崩しのスコア表示を行います。
スコア表示のための UE4 での UI 作成方法、表示方法、C++ からの UI内容の更新方法 についてまとめます。