自己紹介
U/DAYに参加できそうで、ニコニコな大学生
今回やること
前回…
前回、上記の記事でSubClassSelector
と呼ばれるエディター拡張をUI Toolkitで再現してみるというのをやりました。
その続き
今回はその続きで、SerializeReference
に登録したクラスがもつSerializeField
をInspectorから触れるようにします。
ソースコード
// CreatePropertyGUIの中(詳しくは前回の記事で)
foreach (SerializedProperty serializedField in property.Copy())
{
var element = new PropertyField(serializedField, serializedField.displayName);
root.Add(element);
}
propertyをforeachで回す
property
をforeach
で回すと、その子であるSerializedField
がすべて取得できます。
これちょっとわかりにくいですね。
よく分からないPropertyの仕様
当初以下のコードを書いていました。
foreach (SerializedProperty serializedField in property)
{
var element = new PropertyField(serializedField, serializedField.displayName);
root.Add(element);
}
Copy
メソッドを使っていないんですね。
これをすると、2回目以降に大きなバグが発生しました。
propertyが参照する値が、別の変数に置きわかっているようです。
詳細を追う時間もなく、技術もなかったので詳しくは不明ですが、for文を直接回すことで内部的に何かが変わるんでしょうね(適当)
もしわかる人がいたら教えてほしいです。
回避方法
Copy
メソッドを使って、回避することができました。
ここでCopy
しているのにもかかわらず、正しく値が更新されるのも不思議な挙動ですよね。
まとめ
あとは一段ずらすだけなのですが、まぁUSSの問題ですし本題とはそれるので、この辺で。
SerializePropertyやその周辺知識があればもっと簡単だったのでしょうが、私はまだまだ勉強不足で、まぁまぁ苦戦しました。