【Unity】SRDebuggerの使い方と拡張方法の紹介

# はじめに

本記事は[Unity Advent Calendar 2017](https://qiita.com/advent-calendar/2017/unity)の3日目の記事です。

昨日は [takashicompany](https://qiita.com/takashicompany) さんの[<font color="LimeGreen">プレイヤーの見ている画面とは別視点からのリプレイ動画を
お手軽に作れないか頑張った話【Unity Advent Calendar 2017】</font>](http://takashicompany.hatenablog.com/entry/2017/12/02/172136)でした！

# SRDebugger

- 実機でコンソールログを確認したい
- 実機でプロファイラーを確認したい
- 特定の状態を再現するためにキャラクターのステータスなどを変更したい

上記のような機能が必要になる場面は多々あると思います。
それらの要望を手軽に実現出来るアセットが[SRDebugger - Console & Tools On-Device](https://www.assetstore.unity3d.com/jp/#!/content/27688)です。

[![2017-12-02_19h49_04.png](https://qiita-image-store.s3.amazonaws.com/0/126970/66fd51e4-2f90-18e6-3664-3326644dd65d.png)](https://www.assetstore.unity3d.com/jp/#!/content/27688)

## 導入方法

[SRDebugger](https://www.assetstore.unity3d.com/jp/#!/content/27688)をプロジェクトにインポートするだけで導入出来ます。
シーンを実行すると必要なプレハブやEventSystemが生成されるため、
すぐにSRDebuggerを起動することが出来ます。

※ 初期設定では左上に隠れている矩形UIを3回タップ(クリック)することで起動することが出来ます
![ss1.gif](https://qiita-image-store.s3.amazonaws.com/0/126970/6d9f6f84-94d5-a20f-9972-c8e4f4dbd1d9.gif)

## 設定の変更

`Window > SRDebugger > Settings Window`から設定を変更することが出来ます。
![2017-12-02_22h43_11.png](https://qiita-image-store.s3.amazonaws.com/0/126970/026f4574-6ab6-e3a6-40a9-25b8ff2a2aad.png)
![2017-12-02_22h52_01.png](https://qiita-image-store.s3.amazonaws.com/0/126970/d45f56d7-46a6-edac-f9d9-8d358126ba05.png)

| | 機能 | Disabled | Prefab | Automatic |
|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|
| ① | ロード方法 | SRDebugger.Init()メソッドを手動で呼び出す | SRDebugger.Initプレハブをシーンに配置する | シーン実行時に自動でロードする |

| | 機能 | Triple Tap | Tap And Hold | Double Tap |
|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|
| ② | 起動方法 | 3回タップする | 0.9秒間長押しする | 2回タップする |

| | 機能 | System Information | Options | Console | Profiler | Bug Reporter |
|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|
| ③ | 起動時のデフォルトタブ | 端末情報やUnityのバージョンを表示するタブ | 自作のデバッグ機能を表示するタブ | コンソールログを表示するタブ | プロファイラーを表示するタブ | バグレポートを送信するタブ |

![2017-12-03_00h24_30.png](https://qiita-image-store.s3.amazonaws.com/0/126970/759c35f9-0af0-867b-7a7c-41b8715817a2.png)

## 実機でコンソールログを確認する

![ss2.gif](https://qiita-image-store.s3.amazonaws.com/0/126970/c6a15852-05a7-ee16-8375-275abce6ebc0.gif)

コンソールタブからログを見ることが出来ます。
フィルタリングやログのクリアも可能です。

余談ですが、Unity2017.1.0f1から実機をUnityエディタのコンソールに繋いで
ログを出力することが出来るようになったみたいです。
[Unity2017.1.0f1のリリースノート日本語訳 その2](http://www.shibuya24.info/entry/unity2017_1releasenote2)

## 実機でプロファイラーを確認する

![ss3.gif](https://qiita-image-store.s3.amazonaws.com/0/126970/482d1966-94c2-ff46-54ae-029887bd1365.gif)

FPSやメモリ使用量を見ることが出来ます。
ガベージコレクションやリソースの解放を行うことも可能です。

SRDebuggerのタブはピン留めをして常駐させることが出来ます。
上記のgif画像ではピン留めをしてから100個ずつプリミティブなオブジェクトを生成した後に
Debug.Logを100回呼び出しており、著しく処理負荷が掛かっていることが分かります。

> Unityエディタのプロファイラーほどの精度はありません
> CPUかGPUのどちらがボトルネックになっているかを識別するためのツールです

![2017-12-03_03h56_59.png](https://qiita-image-store.s3.amazonaws.com/0/126970/0dac6f03-addf-b1e3-7969-be7a2b473adc.png)

## オプションタブにデバッグ機能を実装する

### デバッグ機能の実装

デバッグ機能を実装するためにスクリプトを作成します。
今回はSROptions.Generalスクリプトを作成しました。
本クラスはSROptionsクラスのpartialクラスであるため.で区切る命名規則にしています。

![2017-12-03_09h46_04.png](https://qiita-image-store.s3.amazonaws.com/0/126970/5caff777-3c2e-418e-8c8a-815129cdbba6.png)

```csharp
using UnityEngine;
using System;
using System.ComponentModel;


/// <summary>
/// 全般のデバッグ機能
/// </summary>
public partial class SROptions
{
    #region 定数

    /// <summary>
    /// 全般カテゴリ
    /// </summary>
    private const string GeneralCategory = "General";

    #endregion


    #region デバッグ機能

    [Category(GeneralCategory)]
    [DisplayName("TimeScale")]
    [Sort(0)]
    [Increment(0.1)]
    [NumberRange(0.0, 10.0)]
    public float TimeScale
    {
        get { return Time.timeScale; }
        set { Time.timeScale = value; }
    }

    [Category(GeneralCategory)]
    [DisplayName("DisplayDateTime")]
    [Sort(1)]
    public void DisplayDateTime()
    {
        Debug.Log(DateTime.Now.ToString("yyyy/MM/dd"));
    }

    [Category(GeneralCategory)]
    [DisplayName("LightEnabled")]
    [Sort(2)]
    public bool LightEnabled
    {
        get { return GameObject.FindObjectOfType<Light>().enabled; }
        set { GameObject.FindObjectOfType<Light>().enabled = value; }
    }

    #endregion
}
```

### カスタムアトリビュートの紹介

| カスタムアトリビュート名 | 機能 |
|:-----------|:-----------|
| Category | カテゴリを設定する |
| DisplayName | 表示名を設定する |
| Sort | カテゴリ内の表示順序を設定する |
| Increment | 増減する任意の値を設定する |
| NumberRange | 値の下限と上限を設定する |

### 実行結果

![ss4.gif](https://qiita-image-store.s3.amazonaws.com/0/126970/d6116aa1-8f0e-abb9-0faf-ed362d0117ab.gif)

## タブの拡張方法

画像アップロード容量の上限のため下記の記事にまとめました。
### [<font color="LimeGreen">**【Unity】SRDebuggerのタブの拡張方法**</font>](https://qiita.com/tomoriaki/items/83666ad18edba56fdc29)

# 参考記事

[公式ドキュメント](https://www.stompyrobot.uk/tools/srdebugger/documentation/)

# おわりに

[SRDebugger](https://www.assetstore.unity3d.com/jp/#!/content/27688)は導入の手軽さと拡張性の高さを兼ね備えた素晴しいアセットです。
興味を惹かれた方はお手に取ってみてはいかがでしょうか。

明日の[Unity Advent Calendar 2017](https://qiita.com/advent-calendar/2017/unity)は [tsubaki_t1](https://qiita.com/tsubaki_t1) さんの[<font color="LimeGreen">【Unity】Timelineで敵の”出現タイミング”や”動き”を制御してみる</font>](http://tsubakit1.hateblo.jp/entry/2017/12/04/115255)です！