LoginSignup
2
0

More than 1 year has passed since last update.

CustomEditorで変数を表示しているラベルがマウスオーバーしないと更新されない問題

Posted at

問題

以下のコードは値を保持してChangeValue()が呼ばれた時だけ値を変更するシンプルなスクリプトと、それを表示するEditor拡張です。

HaveValue.cs
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif

internal class HaveValue : MonoBehaviour
{
    private string value = "";

    public void ChangeValue(string value)
    {
        this.value = value;
    }

#if UNITY_EDITOR
    [CustomEditor(typeof(HaveValue), true)]
    public class HaveValueEditor : Editor
    {
        public override void OnInspectorGUI()
        {
            var _target = target as HaveValue;
            EditorGUILayout.LabelField($"{_target.value}");
        }
    }
#endif
}

これでも確かに値は表示されますが、マウスオーバーしないと表示を更新してくれないという欠点があります。

解決法

以下の一行を追加するだけです。

Add.cs
public override bool RequiresConstantRepaint() => true;

Repaint、つまり再描画がEditor拡張なりEditorWindowを作る時に度々問題になるようです。
(頭の片隅に入れておこう、またこの単語は検索する気がする)
幾つか描画を更新できそうな方法は見つけましたが、
今回はシンプル故、ボタン操作のタイミングで再描画をするといった対応が出来ないため、
RequiresConstantRepaint()が最も目的に合っていると思います。

最終コード

HaveValue.cs
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif

internal class HaveValue : MonoBehaviour
{
    private string value = "";

    public void ChangeValue(string value)
    {
        this.value = value;
    }

#if UNITY_EDITOR
    [CustomEditor(typeof(HaveValue), true)]
    public class HaveValueEditor : Editor
    {
        public override bool RequiresConstantRepaint() => true;

        public override void OnInspectorGUI()
        {
            var _target = target as HaveValue;
            EditorGUILayout.LabelField($"{_target.value}");
        }
    }
#endif
}

参考

こちらの記事を見つけて解決しました。感謝です。

Qiita上だとRequiresConstantRepaint()が書かれた記事はこれしか見つけられませんでしたが、
実装例までは書かれていなかったので本記事を書きました。
こちらの記事はその一歩先の話をされています。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0