元ネタ:
http://answers.unity3d.com/questions/176422/debug-wrapper-class.html
実際にやってみたので備忘録程度にメモ。
Debugクラスのラッパーを作るとまずぶつかる問題となる
Unityのコンソールをダブルクリックするとラップしたログ出力を呼んだ地点ではなくてラップ先のDebug.Logなどのところに飛んでしまう というものについての対処方法の一例になります。
手順
今回 VisualStudio2010でやったのでそれ準拠での説明
新規ライブラリプロジェクトを作る
- Visual C# -> クラスライブラリ を選択
- 名前 には実際に使用する名前空間名を入力
- 場所 には今回作成するライブラリプロジェクトの親フォルダを指定する
- ソリューション名 にはこのライブラリプロジェクトのフォルダ名になるものを指定する
参照設定
ソリューションエクスプローラ内 参照設定 を右クリックし、 参照の追加 を選択後、
使用するUnityEngine.dllのパスを指定する(Unity/Editor/Data/Managed の中とかにあるはず)
Debugクラスコードを書く
こんな感じのやつを Class1.cs に書く
using System.Diagnostics;
using UnityEngine;
namespace DebugTest {
public static class Debug
{
[Conditional("DEBUG_WRAP")]
public static void Log(object message)
{
Debug.Log(message);
}
}
}
ビルド
普通に ビルド から [プロジェクト名]のビルド を実行
bin/Debug フォルダに [namespace名].dll が出来上がっているはずなので
それをUnity側のプロジェクトのAssets以下にコピー
使う
先の例の場合 Conditional を付けているので、ログを出したい場合は DEBUG_WRAP を Scripting Define Symbols に書く
後はこんなかんじで使う
using UnityEngine;
using DebugTest; // コレが要る
public class Test : MonoBehaviour {
void Start() {
DebugTest.Debug.Log("Test");
}
}
実際に出力されたログをダブルクリックして飛ぶと、普通にラップするパターンと違いきちんとTestクラスの DebugTest.Debug.Log() の行にジャンプします。
問題
最初に挙げた問題についての対処はできますが、その代わり普通に無名名前空間にDebugクラスを定義してラップする方式と違って以下の問題が発生します。
- まず使用するのに専用のusingが必要
- プロジェクト用のnamespaceを切ってたりするとまだマシかも
- 元々のUnityのDebugクラスをラッピングするわけではないので、外部Assetでログ出力が行われていても防げない
- これとは別に無名名前空間でDebugクラス定義してどうにかするのもアリかも 5.4なんかだともう Logging の設定が出来るのでそれでもいいかもしれないが…
とりあえずやってみたらできた!というところから勢いで記事を書いたので、他にも色々問題あるかもしれません…;