うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】EditorWindow を UnityEditor の中心に持ってくる処理

EditorWindow を取得して CenterOnMainWin を呼び出せば中心に持ってこられる

var window = GetWindow<SampleEdiorWindow>();
window.CenterOnMainWin();
public static class EditorWindowExtensions
{
    public static void CenterOnMainWin(this EditorWindow self)
    {
        var main = GetEditorMainWindowPos();
        var pos = self.position;
        var w = (main.width - pos.width) * 0.5f;
        var h = (main.height - pos.height) * 0.5f;
        pos.x = main.x + w;
        pos.y = main.y + h;
        self.position = pos;
    }
 
    private static Type[] GetAllDerivedTypes(this AppDomain aAppDomain, Type aType)
    {
        var result = new List<Type>();
        var assemblies = aAppDomain.GetAssemblies();
        foreach (var assembly in assemblies)
        {
            var types = assembly.GetTypes();
            foreach (var type in types)
                if (type.IsSubclassOf(aType))
                    result.Add(type);
        }

        return result.ToArray();
    }

    private static Rect GetEditorMainWindowPos()
    {
        var containerWinType = AppDomain.CurrentDomain
            .GetAllDerivedTypes(typeof(ScriptableObject))
            .FirstOrDefault(t => t.Name == "ContainerWindow");
        
        if (containerWinType == null)
            return Rect.zero;
        
        var showModeField = containerWinType.GetField("m_ShowMode", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
        var positionProperty = containerWinType.GetProperty("position", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
        
        if (showModeField == null || positionProperty == null)
            return Rect.zero;
        
        var windows = Resources.FindObjectsOfTypeAll(containerWinType);
        foreach (var win in windows)
        {
            var showMode = (int) showModeField.GetValue(win);
            if (showMode == 4) // main window
            {
                var pos = (Rect) positionProperty.GetValue(win, null);
                return pos;
            }
        }

        return Rect.zero;
    }
}