はてなブログに投稿しました
Inspectorで表示される変数の文字列に変換する - 青空の月
http://t.co/x6WNE7LhHj
— namagasi (@namagasi048) 2013, 11月 24
上記のブログで紹介されてる関数を使えばプロパティ名などをInspectorで表示されるような
ちょっと見やすい形に整形できるとのこと。
何かの役に立つかな?とのことなのでちょっと考えてみた。
考えてみた。
プロパティ名を手打ちしてまで使うものじゃないなー↓
プロパティを自動取得すれば使えるなー
↓
そのまま列挙すればデバッグ時に便利じゃない?
ToString()でそのオブジェクトの内容を表示できるので
ToString2()みたいな関数を作ってより詳しい内容を表示しよう。
書いてみた。
MonoBehaviourExtensionsってクラスを作成using System;
using System.Reflection;
using UnityEngine;
using UnityEditor;
public static class MonoBehaviourExtensions
{
/// <summary>
/// MonoBehaviourを継承したクラスの内容を文字列として返します。
/// </summary>
public static string ToString2<T> (this T obj) where T : MonoBehaviour
{
Type t = typeof(T);
var txt = new System.Text.StringBuilder ();
// GameObject名を取得
txt.Append (((MonoBehaviour)obj).name);
// Get Public Fields
FieldInfo[] fields = t.GetFields ();
foreach (FieldInfo f in fields) {
string fName = ObjectNames.NicifyVariableName (f.Name);
string fValue = f.GetValue (obj).ToString ();
txt.Append (string.Format (" [{0}:{1}]", fName, fValue));
}
return txt.ToString ();
}
}
こんな感じかな?ポイント
・各クラスに実装するのが面倒だったので拡張メソッドで定義(MonoBehaviourを継承してToStringをOverrideでもいいけど)
・呼び出しクラスのPublicな変数一覧を取得
・変数名と値を取得
・変数名を紹介されてた関数を使って整形
・整形した変数名と値を列挙して返す
使ってみた。
適当なGameObjectにMyScriptという名前でスクリプトを追加using UnityEngine;
public class MyScript : MonoBehaviour {
public int PublicIntXXX = 10;
public string PublicStringABC = "ABC";
public int PublicPropertyIntYYY {get;set;}
private int myPrivateIntXXX = 3;
void Start () {
Debug.Log(this.ToString2());
}
}
こんな感じで内容を表示したいクラス内でToString2関数を呼ぶだけ。Debug.Logで使うぐらいしかないけど…。
うまく表示できた。
これは地味に便利かもしれないね。
プロパティやPrivateメンバは省いてる。
PublicFieldメンバだけだと足りないかもしれないから
必要に応じてカスタマイズしよう。
→Unity系記事まとめ