【Unity】実機でConsoleを表示できるOSS『In-game Debug Console for Unity 3D』使い方まとめ

Unityの実機でConsoleを表示できるOSS『In-game Debug Console for Unity 3D』の使い方についてまとめました。

Unity 2020.3.35f1

はじめに

In-game Debug Console for Unity 3D を使うと、Unity の Console のようなウィンドウを実機上で表示することができます。

In-game Debug Console for Unity 3D
https://github.com/yasirkula/UnityIngameDebugConsole より

このツールは GitHub 上で公開されている OSS です。
ライセンスは MIT なのでライセンスの記述を行えば無料で使用できます。

github.com

インストール方法はいくつかあるので上記リポジトリを参照してください。
アセットストアでも公開されています。

assetstore.unity.com

基本的な使い方

使い方は簡単で、IngameDebugConsole.prefab をシーンに配置するだけです。
再生すると以下のようにコンソールウィンドウが表示できるようになります。

コンソール

各ログの行をクリックすると詳細を見ることができます。
Unityエディタの場合は右クリックで該当する箇所のスクリプトを表示することができます。

なおこれは Canvas になっているので、解像度や描画順はプロジェクトに合わせて適宜調整できます。
また子の GameObject として Event System を持っているので、不要だったら非アクティブにしておきます。

コマンド機能

このツールのユニークな点として、文字列でコマンドを指定して実行できる機能があります。
たとえば以下のように prefs コマンドを入力すると PlayerPrefs に値を読み書きできます。

コマンド機能

また、以下のようにしてユーザが独自のコマンドを登録することもできます。

using IngameDebugConsole;
using UnityEngine;

public sealed class Example : MonoBehaviour
{
    [ConsoleMethod("cube", "Creates a cube at specified position")]
    public static void CreateCubeAt(Vector3 position)
    {
        GameObject.CreatePrimitive(PrimitiveType.Cube).transform.position = position;
    }
}

以下の動画は登録したコマンドを使って、Cubeを生成、回転させている例です。

独自コマンドの登録方法

独自のコマンドは主に以下のように、AddCommand メソッドを使う方法と ConsoleMethod アトリビュートをつける方法があります。
コメントにも記載していますが、アトリビュートの方は public static なメソッドである必要があります。

using IngameDebugConsole;
using UnityEngine;

public sealed class Example : MonoBehaviour
{
    private void Start()
    {
        // AddCommandメソッドを使ってコマンドを登録する
        DebugLogConsole.AddCommand<Vector3>("sphere", "Creates a sphere",
            position => { GameObject.CreatePrimitive(PrimitiveType.Sphere).transform.position = position; });
    }

    // アトリビュートを使ってコマンドを登録する
    // public なクラス内に public static なメソッドとして定義する必要がある
    [ConsoleMethod("cube", "Creates a cube")]
    public static void CreateCubeAt(Vector3 position)
    {
        GameObject.CreatePrimitive(PrimitiveType.Cube).transform.position = position;
    }
}

また、メソッド名を文字列で指定する方法もあります。

using IngameDebugConsole;
using UnityEngine;

public sealed class Example : MonoBehaviour
{
    private void Start()
    {
        // 文字列でstaticメソッドを登録する
        DebugLogConsole.AddCommandStatic("cube", "Creates a cube", "CreateCubeAt", typeof(Example));

        // 文字列で非staticメソッドを登録する
        DebugLogConsole.AddCommandInstance("sphere", "Creates a sphere", "CreateSphereAt", this);
    }

    private static void CreateCubeAt(Vector3 position)
    {
        GameObject.CreatePrimitive(PrimitiveType.Cube).transform.position = position;
    }

    private void CreateSphereAt(Vector3 position)
    {
        GameObject.CreatePrimitive(PrimitiveType.Sphere).transform.position = position;
    }
}

また、以下のように独自の型の引数をパースして使うこともできます。

using System.Collections.Generic;
using IngameDebugConsole;
using UnityEngine;

public sealed class Example : MonoBehaviour
{
    private void Start()
    {
        // CustomParam型の引数のパーサを登録
        DebugLogConsole.AddCustomParameterType(typeof(CustomParam), ParseCustomParam);

        // CustomParamを引数に取るコマンドを登録
        DebugLogConsole.AddCommand<CustomParam>("Test", "Custom Param Test",
            x => { Debug.Log($"{x.Value1} / {x.Value2}"); });
    }

    private static bool ParseCustomParam(string input, out object output)
    {
        // 入力文字列を分解する
        var inputSplit = new List<string>(2);
        DebugLogConsole.FetchArgumentsFromCommand(input, inputSplit);

        if (inputSplit.Count != 2)
        {
            output = null;
            return false;
        }

        // Value1をintに変換する
        if (!DebugLogConsole.ParseInt(inputSplit[0], out var value1))
        {
            output = null;
            return false;
        }

        // Value2をstringに変換する
        if (!DebugLogConsole.ParseString(inputSplit[1], out var value2))
        {
            output = null;
            return false;
        }

        // CustomParamを作成する
        var customParam = new CustomParam
        {
            Value1 = (int)value1,
            Value2 = (string)value2
        };
        output = customParam;

        return true;
    }

    public class CustomParam
    {
        public int Value1;
        public string Value2;
    }
}

参考

github.com

assetstore.unity.com