エディタウィンドウに簡単にレイヤーマスクを編集するフィールドを簡単に表示してみました。
レイヤーマスクの編集
カメラコンポーネント等はインスペクタにレイヤーマスクを編集できるドロップダウンが表示されます。
EditorGUILayoutには、レイヤーマスクを編集するためのフィールドがないので通常のビットマスクのフィールドで作ってみます。
EditorGUILayout.MaskField
ビットマスクを編集するフィールドはEditorGUILayout.MaskFieldメソッドで表示できます。第一引数にはドロップダウンの左に表示するテキスト、第二引数には現在のビットマスクの値、第三引数には各フラグの名前の配列を渡します。
なので、各レイヤー名の配列を作ればできると思います。
エディタウィンドウを作る
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class LayerMaskFieldTest : EditorWindow
{
[MenuItem("Window/Test/LayerMaskFieldTest")]
public static void CreateWindow()
{
var e = EditorWindow.GetWindow<LayerMaskFieldTest>();
e.SetUp();
}
void SetUp()
{
layerMaskNames = GetLayerMaskNames();
}
// 現在のレイヤーマスク
LayerMask layerMask;
// レイヤー名の配列
string[] layerMaskNames;
private void OnGUI()
{
if (layerMaskNames == null) return;
layerMask = EditorGUILayout.MaskField("レイヤーマスク", (int)layerMask, layerMaskNames);
}
// レイヤー名の配列を取得
string[] GetLayerMaskNames()
{
var layers = new List<string>();
for(int i = 0; i < 32; i++)
{
// i番目のレイヤー名
string layerName = LayerMask.LayerToName(i);
// 名前があればリストに追加
if (layerName != "")
{
layers.Add(layerName);
}
}
// 配列にして返す
return layers.ToArray();
}
}
まずエディタウィンドウを表示するための静的メソッドにMenuItem属性をつけて、メインメニューから実行できるようにしています。
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class LayerMaskFieldTest : EditorWindow
{
[MenuItem("Window/Test/LayerMaskFieldTest")]
public static void CreateWindow()
{
var e = EditorWindow.GetWindow<LayerMaskFieldTest>();
e.SetUp();
}
void SetUp()
{
layerMaskNames = GetLayerMaskNames();
}
// 現在のレイヤーマスク
LayerMask layerMask;
// レイヤー名の配列
string[] layerMaskNames;
表示するとすぐに初期化のためのメソッドを呼んでいます。その中で、レイヤー名の配列を取得します。
レイヤーは最大で32個で、各レイヤーには0~31の整数が割り当てられています。LayerMask.LayerToNameメソッドの引数にその整数を渡すとレイヤー名が返ります。
そこでレイヤー名の配列を取得するメソッドでは、まずstringのリストを作り、各レイヤーの名前を確認して空文字でなければリストに追加しています。それを配列にして返します。
string[] GetLayerMaskNames()
{
var layers = new List();
for(int i = 0; i < 32; i++)
{
// i番目のレイヤー名
string layerName = LayerMask.LayerToName(i);
// 名前があればリストに追加
if (layerName != "")
{
layers.Add(layerName);
}
}
// 配列にして返す
return layers.ToArray();
}
配列があれば、エディタウィンドウにマスクフィールドを表示します。ラベル名と、現在のレイヤーマスク、レイヤー名の配列を引数に渡して、戻り値を現在のレイヤーマスクの変数に入れます。
private void OnGUI()
{
if (layerMaskNames == null) return;
layerMask = EditorGUILayout.MaskField("レイヤーマスク", (int)layerMask, layerMaskNames);
}
これで、エディタウィンドウにレイヤーマスクのフィールドを表示できました。