トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

ReorderableListでListの表示を変えるの大変だった【Unity】

Listを作った時、Inspectorで要素の順番変えたり簡単に消去できないのが辛い。

f:id:bibinbaleo:20200820095127p:plain

環境:Unity2019.4.17

ReorderableList

Editor拡張でいい感じにしてくれるのあるだろうと検索したらあった!

ReorderableList!Unityデフォルトの?機能らしい!!

f:id:bibinbaleo:20200820093049p:plain

よくUnityのSettingとかで見るやつだ~! 

f:id:bibinbaleo:20200820093221p:plain

+-で追加して、順番も入れ替える

 

公式のはずなのに、リファレンスない?

この機能は公式としてドキュメント化されておらず非推奨扱いとなっていますが、Animator や Tag and Layer の設定画面で長い間使われているので、すぐに使えなくなることはないと思います。

第14章 ReorderbleList - エディター拡張入門

だって

Unity組み込みなんだから簡単に使えるのかと思ったら、スクリプトごとにEditorファイル作らないといけないっぽい?

 

使う

synamon.hatenablog.com

こちらの記事の方が作ったEditor拡張のアセットみたいなのを使う

github.com

Releaseからunitypackageを落としてUnityにいれる。

 

Listが含まれるスクリプトはすでにあるとして、このクラス名(test)とリスト名(NameList)を、Editor拡張で使う。

using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour
{
   public List<stringNameList;
}

この時点ではまだListはいつもの形式。

f:id:bibinbaleo:20200820095546p:plain

数字入れて要素増やすやつ

f:id:bibinbaleo:20200820095127p:plain

Editor拡張作る

アセットダウンロードしたからと言って、Editor拡張を自分で作らなくていいわけではないらしい

 

どこかにEditorフォルダを作って、その中に適当なスクリプトを作る。

ReorderableListEditor.csにした。

f:id:bibinbaleo:20200820094832p:plain

中身こんな感じにする

using UnityEditor;
using UnityEditorInternal;
using UnityEngine;

namespace Mochineko.SimpleReorderableList.Samples.Editor
{
[CustomEditor(typeof(test))]
public class ReorderableListEditor : UnityEditor.Editor
{

		private ReorderableList reorderableList;

		private void OnEnable()
		{
			reorderableList = new ReorderableList(
				serializedObject.FindProperty("NameList")
			);
		}

		public override void OnInspectorGUI()
		{
			serializedObject.Update();

			EditorGUI.BeginChangeCheck();
			{
				EditorFieldUtility.ReadOnlyComponentField(target as MonoBehaviour, this);

				if (reorderableList != null)
					reorderableList.Layout();
			}
			if (EditorGUI.EndChangeCheck())
			{
				serializedObject.ApplyModifiedProperties();
			}
		}
	}
}

 

書き換え

 

・[CustomEditor(typeof(test))]

testの部分は使いたいクラス名

・serializedObject.FindProperty("NameList")

NameListにリスト名

つまづいたとこ

namespace Mochineko.SimpleReorderableList.Samples.Editorを付ける

usingだとだめだった。

・public class ReorderableListEditor : UnityEditor.Editor

UnityEditorつけないとダメ

完成

これでできた!

f:id:bibinbaleo:20200820100450p:plain

f:id:bibinbaleo:20200820100446p:plain

自作クラスで使う

自作クラスのリストでもできる!

f:id:bibinbaleo:20200820101411p:plain

自作クラスの作り方はここ

bibinbaleo.hatenablog.com

他のプロパティが表示されない><

指定のList以外に他のプロパティを設定しても表示されない

f:id:bibinbaleo:20200820102516p:plain

Editorスクリプトで指定したものしか表示されないんだけど・・・

f:id:bibinbaleo:20200820101411p:plain

どうしたらいいんだろう。Editor拡張分からな過ぎて、アセットの問題なのかも分からない。他のReorderableListで試さないと

別の使う①

こちら

qiita.com

これはEditorスクリプトは書かずに、使いたいプロパティに[ReorderableList]を付けるタイプ!

f:id:bibinbaleo:20200820111112p:plain

しかもListじゃない他のプロパティと組み合わせれた!

f:id:bibinbaleo:20200820111058p:plain

ただ、用意されていない型は自分でどうにかしないといけない。

あとScriptableObjectで使ったら変にならないかな?

今回の私の用途にはいろいろ問題ありそう

別の使う②(えらー→解決)

最初この記事をまねしてたけど

qiita.com

Editorのスクリプトでエラー出た

f:id:bibinbaleo:20200820093044p:plain

1個目のserializedObject

f:id:bibinbaleo:20200820104335p:plain

仕様が変わったのか??

えーーーん

解決

FindPropertyRelativeをFindPropertyにしたらエラー消えた。

    void OnEnable() {
        reorderableList = new ReorderableList(serializedObject,
                serializedObject.FindProperty("BlogList")
            );
    }

これで使えるようになった!ほかのプロパティも表示されている。

f:id:bibinbaleo:20200825093151p:plain

通常のList表示はそのまま、Inspectorの一番下にReordavleListもタイトルだけ追加で表示されるという不思議な形式。

でも上の普通のリスト表示と動きは同期しているので、内容は上のリストに書いて、順番を変えたり要素の追加消去はReordableListで変更できるようになりました。

(おまけ)プロパティとフィールド

publicがプロパティで、privateがフィールド?

そういう単純な問題じゃなさそう

今回のListはプロパティかな?

qiita.com

www.it-swarm.dev

 

 

最後に

 

 

UnityのRoadMapにあるらしい!

 本当だ!

f:id:bibinbaleo:20200820111721p:plain

早く出てほしい

結局やりたいことできなかった・・・

私が死ぬしかない