はじめに
Unity開発において、Debug.Logはよく使うと思います。
実はDebug.Logメソッドは、二つのオーバーロードが存在します。
public static void Log(System.Object message)
public static void Log(System.Object message, UnityEngine.Object context)
1つ目のオーバーロードは良く使う方も多いと思います。ところで2つ目の方のオーバーロード、ご存知でしたか?お恥ずかしながら僕は知りませんでした。
ログを吐いたコンポーネントを所持するゲームオブジェクトを識別できる
public static void Log(object message, Object context)
のドキュメントには次のように説明されています。
When you select the message in the console a connection to the context object will be drawn. This is very useful if you want know on which object an error occurs.
なるほど、試してみましょう。
次のようなSample.csを用意します。
using UnityEngine;
public class Sample : MonoBehaviour
{
void Start ()
{
Debug.Log ("Hello Log with context.", gameObject);
}
}
新規シーンを作成、空のゲームオブジェクトを作ってSampleコンポーネントを付与した後、実行します。
コンソールウィンドウで表示された「Hello Log with context.」というログをクリックすると。次の画像の通り、ヒエラルキー中のSampleコンポーネントが付与されているゲームオブジェクトがハイライトされました。
この機能、あるコンポーネントが複数のGameObjectに付与されていた場合などで、どのGameObjectのものか識別できて便利かもしれませんね。コンソールウィンドウ中のログをダブルクリックすると該当コードが開く事は知っていましたが、これは知りませんでした。
ところで、
Debug.Log ("Hello Log with context.", gameObject);
を
Debug.Log ("Hello Log with context.", this);
に変えても、同じようにハイライトされました。ヒエラルキービュー中のゲームオブジェクトに加えて、インスペクタに表示されているSampleコンポーネントもハイライトされる、なんてことはありませんでした。
ちなみにこれは、Debug.Logだけでなく、
でも同様のオーバーロードを持っています。むしろこれらのメソッドでの活用の方が多そうですね。
呼び出したGameObject以外もハイライトできる
呼び出したGameObject以外もハイライトできました。
例えば、
- インスペクタから設定したプレファブ
- Resource.Load<T>で読みこんだリソース
などは、ヒエラルキービュー中でなくプロジェクトビュー中のオブジェクトがハイライトされました。
まとめ
結構使う機会がありそうですね。知らなかったです。Debug.Logより、Debug.Warningnなどで使う方が多いかもしれませんが。
もしかして常識ですか?だったら恥ずかしい。
蛇足ですが、個人的なUnityへの不満(もう改善のしよいがない系のものなのですが)の一つに、UnityEngine.Objectクラスのクラス名が、System.Objectと区別がつきづらくてしょうがない、というものがあります。
public static void Log(object message, Object context)
objectはSystem.Object、ObjectはUnityEngine.Objectですが、ぱっと見て非常にわかりずらい。