2013年11月25日月曜日

【Unity】デバッグ用にクラスのメンバ変数を列挙してみた

Twitterで気になる発言を発見。
上記のブログで紹介されてる関数を使えば
プロパティ名などを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系記事まとめ

スポンサーリンク

Related Posts Plugin for WordPress, Blogger...