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

## 初めに

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

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

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

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

## 実装コード

```csharp: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文字しか稼げない~~