LoginSignup
0
0

More than 5 years have passed since last update.

[Unity][IMGUI] デフォルトでBoxのStyleを使ってくれるGUILayout.***Scope拡張クラス

Posted at

初めに

Unityでエディタ拡張を書いているとサクッとレイアウトをグループ分けするためにGUILayout.VerticalScopeだとかGUILayout.HorizontalScopeを使うことが多く、ついでに見た目的にも分かりやすくするために引数のGUIStyleに標準のBoxのStyleを渡すことが多いなと個人的に感じていました

using (new GUILayout.VerticalScope(GUI.skin.box)
{
    // 省略
}

しかし、何度もこれを書いていると GUI.skin.box を引数に渡すのが面倒になってきました

ということで、引数に渡さずにデフォルトでBoxのStyleを使ってくれるように派生クラスを作りました

実装コード

BoxGUILayout.cs
using UnityEngine;

// 本家の機能の派生(拡張)だとわかりやすい?ようにクラス構成・ネーミングを似せている
public static class BoxGUILayout
{
    public class VerticalScope : GUILayout.VerticalScope
    {
        public VerticalScope(params GUILayoutOption[] options) : base(GUI.skin.box, options)
        {
        }

        public VerticalScope(string text, params GUILayoutOption[] options) : base(text, GUI.skin.box, options)
        {
        }

        public VerticalScope(Texture image, params GUILayoutOption[] options) : base(image, GUI.skin.box, options)
        {
        }

        public VerticalScope(GUIContent content, params GUILayoutOption[] options) : base(content, GUI.skin.box, options)
        {
        }
    }

    public class HorizontalScope : GUILayout.HorizontalScope
    {
        public HorizontalScope(params GUILayoutOption[] options) : base(GUI.skin.box, options)
        {
        }

        public HorizontalScope(string text, params GUILayoutOption[] options) : base(text, GUI.skin.box, options)
        {
        }

        public HorizontalScope(Texture image, params GUILayoutOption[] options) : base(image, GUI.skin.box, options)
        {
        }

        public HorizontalScope(GUIContent content, params GUILayoutOption[] options) : base(content, GUI.skin.box, options)
        {
        }
    }

    public class AreaScope : GUILayout.AreaScope
    {
        public AreaScope(Rect screenRect) : this(screenRect, GUIContent.none)
        {
        }

        public AreaScope(Rect screenRect, string text) : base(screenRect, text, GUI.skin.box)
        {
        }

        public AreaScope(Rect screenRect, Texture image) : base(screenRect, image, GUI.skin.box)
        {
        }

        public AreaScope(Rect screenRect, GUIContent content) : base(screenRect, content, GUI.skin.box)
        {
        }
    }

    public class ScrollViewScope : GUILayout.ScrollViewScope
    {
        public ScrollViewScope(Vector2 scrollPosition, params GUILayoutOption[] options) : base(scrollPosition, GUI.skin.box, options)
        {
        }

        public ScrollViewScope(Vector2 scrollPosition, bool alwaysShowHorizontal, bool alwaysShowVertical, params GUILayoutOption[] options)
            : this(scrollPosition, alwaysShowHorizontal, alwaysShowVertical, GUI.skin.horizontalScrollbar, GUI.skin.verticalScrollbar, options)
        {
        }

        public ScrollViewScope(Vector2 scrollPosition, GUIStyle horizontalScrollbar, GUIStyle verticalScrollbar, params GUILayoutOption[] options)
            : this(scrollPosition, false, false, horizontalScrollbar, verticalScrollbar, options)
        {
        }

        public ScrollViewScope(Vector2 scrollPosition, bool alwaysShowHorizontal, bool alwaysShowVertical, GUIStyle horizontalScrollbar, GUIStyle verticalScrollbar, params GUILayoutOption[] options)
            : base(scrollPosition, alwaysShowHorizontal, alwaysShowVertical, horizontalScrollbar, verticalScrollbar, GUI.skin.box, options)
        {
        }
    }
}

GUILayout.VerticalScope(GUI.skin.box)(37文字)
BoxGUILayout.VerticalScope(28文字)
これで9文字ほど節約です!

9文字の節約のために80行近いクラスファイルを追加してるので元を取るためには一体幾つ宣言する必要があるのやら
引数に"box"でも同じ内容になるので実は2文字しか稼げない

0
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
0
0