Unity Standaloneアプリケーションで使えるクラッシュレポート解析ツール

本記事は、[サムザップ Advent Calendar 2020 #2](https://qiita.com/advent-calendar/2020/sumzap2) の12/25の記事です。

クラッシュレポート解析ツールをStandaloneアプリケーションでも使えるようにした時のことを執筆していこうと思います。

# ツール選び
調べてみると世の中には意外と多くのクラッシュレポート解析ツールがあるんですね。
候補となったツールは以下の通りです。

|ツール名|対応プラットフォーム|
|:--|:--|:--|:--|
|[Smart Beat](https://smrtbeat.com/)|Android, iOS, Webアプリ|
|[Firebase Crashlytics](https://firebase.google.com/docs/crashlytics)|Android, iOS|
|[Unity Cloud Diagnostics](https://unity3d.com/jp/unity/features/cloud-diagnostics)|PC, Mac, Linux, Android, iOS, WebGL|
|[App Center Diagnostics](https://docs.microsoft.com/ja-jp/appcenter/diagnostics/)|Android, iOS|
|[Unity BackTrace](https://unity.com/ja/products/backtrace)|Xbox, Google Stadia, PS4, iOS, Android, Windows, Mac, Linux|
|[Splunk MINT](https://mint.splunk.com/)|iOS, Android, HTML5, Windows 8, Windows Phone|
|[Crittercism](https://www.vmware.com/products/workspace-one/intelligence-consumer-apps.html)|iOS, Android, Windows Phone, HTML5||
|[DeployGate](https://deploygate.com/)|iOS, Android|
|[Bugsnag](https://www.bugsnag.com/)|iOS, Android, macOS, Windows, WebGL|
|[RAYGUN](https://raygun.com/)|Windows Desktop, Mac, iOS, Android|
|[Countly](https://count.ly/)|iOS, Android, Windows|
|[InstaBug](https://instabug.com/)|iOS, Android|

Windowsに対応されているもので、Unityプラグインがあって、料金もそこそこで、レポート数の上限がそこそこ多くて、[Smart Beat](https://smrtbeat.com/)と同じような機能を備えてて…(けっこう条件が厳しい)
最終選考まで通過したのは[Bugsnag](https://www.bugsnag.com/)と[RAYGUN](https://raygun.com/)で、最終的に選んだのは[Bugsnag](https://www.bugsnag.com/)の方でした！
iOS, Android, macOS, Windows, WebGLに対応されており、必要だったのはWindowsですが、将来Macも対応することになっても安心。

今回はそんな[Bugsnag](https://www.bugsnag.com/)の使い方をご紹介します。

# Bugsnag紹介
ダッシュボードを開くとレポートの一覧が現れます。同じレポートはまとめて表示してくれてます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543556/bb488570-ac94-e89f-2ff4-39912f2290c0.png">

レポートを選択すると、まとめられたレポートが全件表示されます。
レポート毎にスタックトレースや端末情報、ユーザ情報が確認でき、パンくずも見れます。
パンくずはアプリ側で自由に設定できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543556/404f08df-beec-02c6-4957-96d98e32d629.png">

# Bugsnag実装
## まずはUnityパッケージ入手
Bugsnagトップページから[Prices](https://www.bugsnag.com/pricing)を選択すると各プランごとのお値段が現れます。
LiteプランでもStandardプランでもどちらでも良いので「START FREE TRIAL」ボタンを押してメールアドレスなどを登録するとUnityパッケージとAPIキー(後述)が入手できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543556/9fd2f01d-9f29-191d-123f-b5e27b73fed8.png">

## 準備をしよう
UnityパッケージをインポートしたらUnity側でレポートを通知するための準備をしていきましょう。
Bugsnagの[Unityガイド](https://docs.bugsnag.com/platforms/unity/)があるので簡単です。
英語だけど画像もあり、すごくわかりやすい。

GameObjectを作成します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543556/ea3d9141-d210-d4ad-61ab-1e1044e3c93a.png" width=75%>

作成したGameObjectにBugsnagBehaviourをAddComponentします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543556/5ea6240d-dfbb-efe9-45f0-84f3dd074462.png" width=75%>

BugsnagBehaviourのインスペクタにAPIキーを登録します。
APIキーはBugsnagのアカウントを登録した際に発行されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543556/4159fc4d-a095-860c-86ba-bcaa6d8a7d8f.png" width=75%>

GameObjectを作らずコードからでもBugsnagの初期化が行なえます。

```csharp
Bugsnag.Init("your-api-key-here");
```

## レポートを送信しよう
Excptionが発生した場合や、エラーログが出力された場合は自動的にBugsnagがレポートの送信を行います。
レポートを自動送信するログレベルはBugsnagBehaviourのインスペクタ`Notify Level`から設定できます。
コードからでも設定できます。

```csharp
Bugsnag.Configuration.NotifyLevel = LogType.Warning;
```

レポートを意図的に送信することもできます。

```csharp
Bugsnag.Notify(new System.Exception("Non-fatal"));
```

## カスタマイズしてみよう
送信するレポートをカスタマイズすることができます。
以下の方法でレポートに任意の情報を付加させることができます。

```csharp
Bugsnag.Metadata.Add("system", new Dictionary<string, string>() {
  { "subsystem", "Player Mechanics" }
});
```

## パンくずを使ってみよう
レポートが送信されるまでにどのような遷移をたどったのかを設定したりできます。
使用用途は自由なので任意の情報を残すことができます。

```csharp
Bugsnag.LeaveBreadcrumb(
  "Button clicked",
  BreadcrumbType.Navigation,
  new Dictionary<string, string>() {{ "panel", panel.Name }}
);
```

## ユーザーIDを設定しよう
各レポートの影響を受けるユーザ数を調査するのに役立ちます。
デフォルトで一意のIDが設定されますが、ソシャゲであればおそらくユーザーを一意に識別するIDが存在するかと思います。
ゲーム内でのユーザーIDを設定しておけば、対象のユーザーに起きた事象を調査することができます。

```csharp
Bugsnag.User.Id = "userId";
```

# 最後に
Bugsnagいかがでしたでしょうか？
自分は実装してみてなんて簡単なんだ！と驚きました。

SmartBeatより劣る点としてはスクリーンショット撮影機能がないことですね。
スマホのゲーム制作を開始する段階でPCでの配信も視野に入れている場合はBugsnagを検討してみても良いかと思います。

※説明を端折った部分もあるのでもっと詳しく知りたい方は[公式ドキュメント](https://docs.bugsnag.com/platforms/unity/)を参考にしてみてください。

以上となります。
メリークリスマス＆良いお年を！