EditorGUILayout.Popup()
の不思議な挙動に出くわしたので、原因(?)とその対策のメモ。
環境
- Unity2021.3.0f1
再現方法
InspectorHeaderGUI.cs
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
[InitializeOnLoad]
internal static class InspectorHeaderGUI
{
private static readonly string[] _displayedOptions =
{
"aaa",
"_bbb",
"ccc _ccc",
"ddd _ddd ddd",
"_eee eee eee",
"5: aaa",
"6: _bbb",
"7: ccc _ccc",
"8: ddd _ddd ddd",
"9: _eee eee eee",
};
static InspectorHeaderGUI()
{
Editor.finishedDefaultHeaderGUI -= OnGUI;
Editor.finishedDefaultHeaderGUI += OnGUI;
}
private static void OnGUI(Editor editor)
{
var gameObject = editor.target switch
{
GameObject go => go,
Component component => component.gameObject,
_ => null,
};
if (gameObject == null) return;
EditorGUI.BeginChangeCheck();
var selected = EditorGUILayout.Popup("Strange Behaviour", gameObject.layer, _displayedOptions);
if (EditorGUI.EndChangeCheck())
{
gameObject.layer = selected;
}
}
}
#endif
このスクリプトを適当なところに置いてHierarchy上の GameObject
をクリックしてInspectorを確認すると、ヘッダーが拡張されてこんな感じになります。
←ポップアップ 実際のコード→


上から3番目の ccc _ccc
の後半の _ccc
など、ポップアップの中ではなぜか一部の文字列が消えてしまっています。
どうやら以下のルールに従ってるように見えます。
- スペースが入ってなければそのまま表示
- スペースで区切ったときに最後の塊が
_
で始まってたらそれ以降は空文字
ちなみにクリックして開く前は正しい文字列で表示されます( 6: _bbb
になってる)。
対策方法
スペースが含まれなければいいみたいなので、通常のスペースを他のスペースっぽい適当な文字コードに変換してあげます。
for (var i = 0; i < _displayedOptions.Length; i++)
{
_displayedOptions[i] = _displayedOptions[i].Replace(" ", "\u00A0");
}
結果:


最後に
たまたま遭遇したけど条件が限定的なので自分以外経験者いなさそう。
詳しい人いたら教えて下さい。