だらだら〜自由自在〜

インディーゲーム制作チーム GAME GABURI でプログラム担当してます

中だるみ

昨日一昨日に比べてやっぱ作業に移るのが億劫になってくる。エディタに向かうまでが勝負なんだよなぁ、改めて言うまでも無いけどw

やりたいやつとは違うプロパティだけど、PropertyField()使えた。なぜこいつだとおkなんだ?彼我の違いというのを探る必要あり。あと、EditorWindowでもう一度やってみるのもお勧めする。

まずEditorWindowでやってみた、やっぱりPropertyField使えた。WindowかInspectorかはやっぱり関係なかったのか。じゃあProperyの拾い方かまずいか、そもそも拾えないものを拾ってこようとしてるかだ。

[System.Serializable]
public class TestClass
{
	public int	_x;
	public int	_y;
};
〜〜〜
public TestClass	_tc = new TestClass();

これで_tcをPropertyFieldすると、一応インスペクタに表示されるものの_x,_yのメンバ変数が表示されない。

[System.Serializable]
public class SettingInfo
{
/*色んなメンバ変数*/
};
〜〜〜
[System.Serializable]
public class SettingArray
{
	public SettingInfo[]		_settingArray = new SettingInfo[ ( int )BulletType.Max ] {
		new SettingInfo(BulletType.Simple),
		new SettingInfo(BulletType.Wait),
		new SettingInfoIR(BulletType.IntermittentRotate),
	};
	public int	GetCount() { return _settingArray.Length;	}
	public SettingInfo	this[ BulletType type ] {
		get { return (int)type<GetCount() ? _settingArray[ (int)type ] : null;	}
	}
};
〜〜〜
public SettingArray		_settings = new SettingArray();

ではこれではどうか?これだとUnityがクラッシュする。エラーとしてはDirectX系のエラーが出る。ということは描画?まぁ理由はわからんが落ちる。

SerializedPropertyType

TestClassのSerializedPropertyTypeをトレースしてみた。
SerializedPropertyType.Genericらしい。リファレンスを探したがこいつについてだけ説明が無い。値も-1が当ててある。なんか無効な値とかエラーっぽいんだけど…

Property>>>PropertyObject>>>Propertyもダメ

public override void OnInspectorGUI() {
〜〜〜〜

_sProp = _sObj.FindProperty( "_tc" );
EditorGUILayout.PropertyField( _sProp ); // ▼TC って出る(インスペクタに)
Debug.Log( _sProp.propertyType ); // genericって出る

SerializedProperty sprop = _sProp.serializedObject.FindProperty( "_x" );
EditorGUILayout.PropertyField( sprop ); // エラーウィンドウが沢山出てUnityクラッシュ

//こうやっても同じ
//SerializedProperty sprop = _sProp.serializedObject.GetIterator();
//do {
//    EditorGUILayout.PropertyField( sprop );
//}while( sprop.NextVisible( false ) );

やっぱりGenericっていうのが怪しい。成功したときはEnumだったもんな。

発見

Ctrl+Rでエディタを更新出来る。エディタ系スクリプトを修正したとき、リフレッシュを待つ必要が無い。

もう辞めるか

PropertyFieldに関連する資料が少なすぎる。公式WikiとForumにも無い。Forumで似たような質問出してる人が居たけど(質問の趣旨は多分、配列メンバのPropertyField表示はできますか?なんかできないんですが。って感じと思う)
http://answers.unity3d.com/questions/6938/customizing-the-inspector-array-handling
結局出来ないっていわれてる?(最初の回答者の答えは質問文読んでないと言わざるを得ない気がする)2番目の回答者は、『配列内の要素をPropertyFieldで一個ずつやりゃいいじゃん』って言ってる(と思う)けど今のところユーザー定義の複合体にもこれしかないのかなぁ?(↑のコードのdo-whileでProperty走査しようとしたらダメッぽかったけど)
今の自分の結論は。あきらめる。にしておこう。どうやらUnity2.6でPropertyFieldは実装されたようだけど、まだ機能的に不足があるってことなのかねぇ??
何にせよ今必須なわけじゃないから3.0リリースまで待つのもいいかも。でもこれってインスペクタやエディタの作り方に大きく影響しそうだから……まぁいいや。