はじめに
Unityでは、Debug.LogやMonoBehaviour.printでUnityエディタ上のコンソールにログを吐き出すことができます。
1 2 3 4 5 6 7 8 9 10 |
using UnityEngine; public class Sample: MonoBehaviour { private void Start() { print("Hello World"); } } |
処理を通っているか確認したり、その時点の変数の中身を確認する用途でちょくちょくお世話になるわけですが、あちこち埋めこんでいくとどこに埋め込んだやつか分からなくなってきます。そのため、埋め込んだファイル名や行番号も表示できるようにロギング関数を拡張してみようと思います。
Caller Info アトリビュートでロギングクラスを作る
ファイル名や行数を表示するには、ロギング関数を呼んだ時点の呼び出し元のファイル名と行数の情報がないといけません。C#5から、それらの値を取得するCaller Info アトリビュートが追加されています。その機能を使ってLoggingクラスを作ってみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using System.Runtime.CompilerServices; using UnityEngine; public class Logging { public static void Log(string message = "", [CallerFilePath] string filePath = "", [CallerMemberName] string methodName = "", [CallerLineNumber] int line = 0) { Debug.Log($"{filePath}\nMethod:{methodName}|Line:{line}|Message:{message}"); } } |
上のLogメソッドでは、message引数の他に3つのアトリビュート付きの変数がつけられています。
・[CallerFilePath]の付いた引数は、呼び出し元のファイルパスで置き換えられます。
・[CallerMemberName] の付いた引数は、呼び出し元のメソッド名で置き換えられます。
・[CallerLineNumber] の付いた引数は、呼び出し元の行番号で置き換えられます。
Caller Info アトリビュートは、オプショナル引数に対して設定できますので0などのデフォルト値を付けないとコンパイルエラーになります。上のLogging.Logでは、4つ引数が要求されていますが、 Caller Info アトリビュートを付けた引数は、呼び出し元の情報で引数が自動的に設定されるため、第二引数以降は、コードから渡してあげる必要はありません。
使ってみる
元のサンプルクラスのログ関数を置き換えてみると、確かに呼び出し元の情報が出力されることがわかります。
1 2 3 4 5 6 7 8 9 10 |
using InfinitySolitaire.Script; using UnityEngine; public class Sample : MonoBehaviour { private void Start() { Logging.Log("Hello World"); } } |