なにそれ
Unity には UnityEditor 名前空間に ObjectNames.NicifyVariableName という静的メソッドがあります。これを使うと文字列をインスペクターなどに表示されるような記法に変換してくれます。
例を挙げると、以下の文字列はすべて「Hoge Hoge」になります。
・hogeHoge
・_hogeHoge
・m_hogeHoge
・kHogeHoge
使いどころ
これの使いどころとして「エディタ拡張でインスペクターをカスタマイズする際にそのままフィールドを出したい場合にラベルに使う」というのがまず思いついたのですが、これはあまり推奨しません。
理由は簡単で EditorGUILayout.PropertyField というピンポイントなメソッドが元からあるからです。
こっちよりも、
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
public class MyInspector : MonoBehaviour
{
[SerializeField]
private int _hogeHoge = 0;
#if UNITY_EDITOR
[CustomEditor(typeof(MyInspector))]
public class MyInspectorEditor : Editor
{
public override void OnInspectorGUI()
{
var self = target as MyInspector;
self._hogeHoge = EditorGUILayout.IntField(ObjectNames.NicifyVariableName(nameof(_hogeHoge)), self._hogeHoge);
}
}
#endif
}
こっちの方がいいです。自動的に Undo/Redo にも対応します。
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
public class MyInspector : MonoBehaviour
{
[SerializeField]
private int _hogeHoge = 0;
#if UNITY_EDITOR
[CustomEditor(typeof(MyInspector))]
public class MyInspectorEditor : Editor
{
public override void OnInspectorGUI()
{
var self = target as MyInspector;
EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(self._hogeHoge)));
serializedObject.ApplyModifiedProperties();
}
}
#endif
}
じゃあ他には…ということですが、例えばエラーなどの時にフィールドを明示する際に利用できるかと思います。
ただ、ログとかに出すならむしろ余計な加工はしてほしくないと思うので、「Unity をツールとして使っているユーザーに見せたいとき」みたいなやや限られた状況になる気がします。
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
public class MyInspector : MonoBehaviour
{
[SerializeField]
private GameObject _hogeHoge = null;
#if UNITY_EDITOR
[CustomEditor(typeof(MyInspector))]
public class MyInspectorEditor : Editor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
var self = target as MyInspector;
if (self._hogeHoge == null)
{
EditorGUILayout.HelpBox($"{ObjectNames.NicifyVariableName(nameof(_hogeHoge))} を割り当ててください!", MessageType.Error);
}
}
}
#endif
}
小ネタ
このメソッドの性質を利用 (悪用?) してこんなことができます。
using UnityEngine;
public class MyInspector : MonoBehaviour
{
[SerializeField]
private GameObject _ = null;
[SerializeField]
private GameObject m_ = null;
}
コメント