Unityの実機でConsoleを表示できるOSS『In-game Debug Console for Unity 3D』の使い方についてまとめました。
Unity 2020.3.35f1
はじめに
In-game Debug Console for Unity 3D を使うと、Unity の Console のようなウィンドウを実機上で表示することができます。
https://github.com/yasirkula/UnityIngameDebugConsole より
このツールは GitHub 上で公開されている OSS です。
ライセンスは MIT なのでライセンスの記述を行えば無料で使用できます。
インストール方法はいくつかあるので上記リポジトリを参照してください。
アセットストアでも公開されています。
基本的な使い方
使い方は簡単で、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を生成、回転させている例です。
『In-game Debug Console for Unity 3D』
— Haruki Yano / Haruma-K (@harumak_11) 2022年6月21日
ただ実機でConsoleが見れるだけじゃなく、実機でコマンド入力で操作できる機能があるのがユニークですね👀
独自のコマンドも簡単に追加可能、図はコマンドでCube作成して回転させている例ですhttps://t.co/B0sQz25Eem pic.twitter.com/SQTxPYrrh6
独自コマンドの登録方法
独自のコマンドは主に以下のように、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; } }