はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】インスペクタ拡張をした際にコンポーネントの左上に文字が表示されてしまうバグ(?)について

はじめに

ほとんどの人があったことがないと思いますが、インスペクター拡張をしていてちょっと面白い現象に出会ったので紹介したいと思います。

インスペクターの表示がおかしくなっている様子

具体的にはコンポーネントの左上に謎の文字がでてくるというバグ(?)です。一応原因らしきものと対策は分かったので、紹介したいと思います。

環境

Unity 2022.3.56f1

概要

実際にこの現象にあったときは以下のようなコードを書いていました。具体的にはtextという値を条件によって出し分けたいためにこのように実装してみた背景があります。

// コンポーネント
public class Sample : MonoBehaviour
{
    [SerializeField]
    [HideInInspector]
    [TextArea(3, 10)]
    private string text;
}
// インスペクター拡張用
[CustomEditor(typeof(Sample))]
public class SampleEditor : Editor
{
    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        // textフィールドをインスペクタから編集できるように
        var textProperty = serializedObject.FindProperty("text");
        EditorGUILayout.PropertyField(textProperty);
        
        serializedObject.ApplyModifiedProperties();
    }
}

挙動としては[HideInInspector]を付与しているのでSerializeしつつもインスペクタに表示しないようにし、インスペクタ拡張により条件によっては編集できるようにしています。(例なので条件はつけてないですが)
docs.unity3d.com

原因

[HideInInspector]と一緒に付与していた[TextArea(3, 10)]が原因でした。

[SerializeField]
[HideInInspector]
[TextArea(3, 10)]
private string text;

Unityの中のコードまで追っていませんが、[TextArea]の有無で表示が正しくなったので描画の際に変な処理になってしまっている箇所があるのだと思います。

対策

EditorGUILayout.PropertyFieldを利用した修正方法が思いつかなかったので、結局EditorGUILayout.TextAreaを代わりに使いました。

var textProperty = serializedObject.FindProperty("text");
textProperty.stringValue = EditorGUILayout.TextArea(textProperty.stringValue, GUILayout.Height(3 * EditorGUIUtility.singleLineHeight));

docs.unity3d.com