(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

多次元のListをInspectorに表示する【Unity】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 5.3.0f4 Personal

はじめに

Unityでは[SerializeField]を使う事で、

privateな変数であってもInspectorに表示できます。

[SerializeField]
private int _value;

[SerializeField]
private List<int> _valueList;

f:id:kan_kikuchi:20151217134654p:plain


しかし以下のようにListのなかにListを入れた、いわゆる多次元のListは表示できません。

//Inspectorに表示されない
[SerializeField]
private List<List<int>> _valueListList; 


今回はこのような多次元のListをInspectorに表示する方法の記事になります。


多次元Listをインスペクターに表示

早速方法ですが、Listを持ったクラスを作成し、そのクラスをListとして持たせるだけです。

具体的には以下ような感じです。

//Inspectorに複数データを表示するためのクラス
[System.SerializableAttribute]
public class  ValueList{
  public List<int>  List = new List<int>();

  public ValueList(List<int>  list){
    List = list;
  }
}

//Inspectorに表示される
[SerializeField]
private List<ValueList> _valueListList = new List<ValueList> ();

f:id:kan_kikuchi:20151217135219p:plain


なお、ValueListは[SerializableAttribute]を付けてシリアル化可能にしています。


3次元以上の配列

お察しの通り、上記のコードでは2次元の配列しか表示できません。

一応、以下のようにひたすら配列を持ったクラスのListを使っていけば、

何次元でも可能ではありますが……。

[System.SerializableAttribute]
public class ValueList{
  public List<int> List = new List<int>();

  public ValueList(List<int>  list){
    List = list;
  }
}

[System.SerializableAttribute]
public class ValueList2{
  public List<ValueList> List = new List<ValueList>();

  public ValueList2(List<ValueList>  list){
    List = list;
  }
}

[System.SerializableAttribute]
public class ValueList3{
  public List<ValueList2> List = new List<ValueList2>();

  public ValueList3(List<ValueList2>  list){
    List = list;
  }
}

[System.SerializableAttribute]
public class ValueList4{
  public List<ValueList3> List = new List<ValueList3>();

  public ValueList4(List<ValueList3>  list){
    List = list;
  }
}

[System.SerializableAttribute]
public class ValueList5{
  public List<ValueList4> List = new List<ValueList4>();

  public ValueList5(List<ValueList4>  list){
    List = list;
  }
}

//Inspectorに表示される
[SerializeField]
private List<ValueList5> _valueListList = new List<ValueList5> ();

f:id:kan_kikuchi:20151217135659p:plain


可能なだけで、絶対使いませんね……。


おわりに

2次元までなら使えそうですが、それ以上となると今回の方法ではきつそうです。

そもそも3次元以上の配列使う機会なんてそうそうない気はしますが(:3っ)∋〜