Here’s a technique I’ve used for getting game code to call editor code. Rather than calling directly (which you can’t do), you can create an event delegate in the game code to which the editor code attaches itself.
So for your component that wants to tell the editor code to repaint itself, add something like this:
public class MyComponent : MonoBehaviour
{
// Declare the method signature of the delegate to call.
// For a void method with no parameters you could just use System.Action.
public delegate void RepaintAction();
// Declare the event to which editor code will hook itself.
public event RepaintAction WantRepaint;
// This private method will invoke the event and thus the attached editor code.
private void Repaint()
{
// If no handlers are attached to the event then don't invoke it.
if (WantRepaint != null)
{
WantRepaint();
}
}
...
}
Then in your custom inspector, have it attach its Repaint method to this event:
[CustomEditor(typeof(MyComponent))]
public class MyComponentEditor : Editor
{
// I like having the typecast to my component in one place, instead of everywhere I refer to target.
private MyComponent Target
{
get { return (MyComponent)target; }
}
// When you enable the inspector, attach to the game code that wants to call it.
void OnEnable()
{
Target.WantRepaint += this.Repaint;
}
// And then detach on disable.
void OnDisable()
{
Target.WantRepaint -= this.Repaint;
}
...
}
And now whenever your game code (in MyComponent
) calls Repaint
, the call will get dispatched via the event hook-up into the inspector, and a repaint will happen. So you can call Repaint as often or as little as you like.
A similar approach can be used any time you want activity in game code to trigger results in editor code. (I usually wrap all the game code side of this in #if UNITY_EDITOR
, so it gets compiled away in a build.)
Good but Editor.Repaint() is only for scripts using UnityEditor I want to have game code (non editor scripts) while running to trigger this event repaint event so can watch the gameplay values refresh in editor. Does the editor have an update that can check a value to see if Editor repaint is needed? It seems I could do this with an EditorWindow as it has update functions but what about extending the editor class?
– UnunaFor scriptable objects you also need to call serializedObject.Update(); at the beginning of the OnInspectorGUI() so that the data updates. EditorUtility.SetDirty() for some reason is not sufficient.
– Miosis