10分で作れて、500分くらい節約になる気がする便利なエディター拡張

題名の通りです。
注意事項等をよく守って、健全な拡張をして、どんどん楽して行こう。

#注意事項
ソースコード内で出てくる関数等の中には、基底クラスで作成しているクラスを使用していることがあり、そのままコピーだけしても動かないようになっています。

それらの関数は、いい感じに解釈してお使いください。
また、この記事のエディター拡張はUnityを少し便利にするという広義の意味を含みます。


#使用環境
Unity2017.1f1


#指定のコンポーネントのついているオブジェクトを探す

用途：ヒエラルキー上にある、オブジェクトに思っているコンポーネントがどれくらいついているか？などを確認する事が出来る。

まだ書いてないと思ってたら、すでにあったので、これを参考にしてください。

このScriptついているオブジェクトってどれだっけ？を解決するための拡張。UnityEditor拡張その２
https://qiita.com/herieru/items/ede2561f18ec5c092bfc



#指定のリソースのパスを調べる

用途：リソースのパスを何らかの場所に記述、もしくは出力が必要な際に。
主にリソースロードを行う際のパスなどが必要な際に活躍する拡張です。



以下サンプルソース

```c#
Label("パスを調べたいオブジェクトを参照として入れてください");
var _new_set_object = EditorGUILayout.ObjectField(serch_object, typeof(Object), true, GUILayout.ExpandWidth(true));
EditorGUILayout.TextField(path, GUILayout.ExpandWidth(true));

if(GUI.changed)
{
     serch_object = _new_set_object;
     path = AssetDatabase.GetAssetPath(serch_object);
}
```

####説明
説明するほどのものではないけど、
オブジェクトをセットして
そのオブジェクトの情報を基に、AssetDatabaseクラスからパスを取得する事が出来ます。
パス表示をラベルではなくTextFieldにしているのは、コピペの容易のため。

#ベクトルとかのデバックを行いやすくするための拡張

以下サンプルコード

```c#
public static void DrawArrow(Vector3 _start_pos,Vector3 _dir,Color _color)
        {
            UnityEngine.Debug.DrawLine(_start_pos, _start_pos + _dir, _color);
            Vector3 _invers_dir = -_dir.normalized;
            Vector3 _finish_pos = _start_pos + _dir;
            Vector3 _left_dir =  Quaternion.Euler(0, 30, 0) * _invers_dir;
            Vector3 _right_dir = Quaternion.Euler(0, -30, 0) * _invers_dir;
            UnityEngine.Debug.DrawLine(_finish_pos, _finish_pos + _left_dir  *100, _color);
            UnityEngine.Debug.DrawLine(_finish_pos, _finish_pos + _right_dir * 100, _color);
        }
```

Unityでの基本機能だと、どうしても、ラインしか描画されず、そのベクトルがわからない事ってありませんか？

その時のこの関数で全て解決出来るといったもの。
引数にベクトルの向きを渡していますが、これを改造して、ポジション同士の引数で、内部で向きだけ生成すれば問題なく使えます。
ただし、大量に出すと線だらけになるのが欠点。


#DefineFieldの設定をすぐに切り替えるための拡張


```c#
/// <summary>
    /// このクラスの初期化
    /// </summary>
    public DefineChanger()
    {
        display_data = new DisplayData();
    }

    /// <summary>
    /// 描画用のクラス
    /// </summary>
    public class DisplayData
    {
        public int select_number;

        //デバック用のフラグ
        public bool debug_flg { get; set; }
        //リリース用のフラグ
        public bool release_flg { get; set; }

        public DisplayData()
        {
            debug_flg = true;
            release_flg = false;
        }


    }

    public DisplayData display_data;



    /// <summary>
    /// 描画部分
    /// </summary>
    public void OnGUI()
    {
        if (null == display_data)
        {
            return;
        }

        switch_develop_select();
        button_area();
    }

    int select = 0;

    //現在の開発環境
    string[] _dev_env_array = new string[] { "Debug","Release" };

    /// <summary>
    /// ラジオボタンによるモードの選択
    /// </summary>
    private void switch_develop_select()
    {
        Label("設定する開発設定");
        BlockHorizontal("", () => 
        {
            select = Radio(select, _dev_env_array, null, GUILayout.ExpandWidth(true));
            GUILayout.FlexibleSpace();
        },
        GUILayout.ExpandWidth(true));
        
    }

    /// <summary>
    /// 編集と、設定を変えるためのもの
    /// </summary>
    private void button_area()
    {
        BorderLine(GUILayout.Height(1f),GUILayout.ExpandWidth(true));
        BlockHorizontal("", () =>
         {
             Button("変更する", button_action_change_setting, GUILayout.ExpandWidth(true));
         },
        GUILayout.ExpandWidth(true));
    }

    /// <summary>
    /// 選んでいる内容によって、編集内容の中身を決定する。
    /// </summary>
    private void button_action_change_setting()
    {
        var _target = get_setting_group_info();
        var _settings = PlayerSettings.GetScriptingDefineSymbolsForGroup(_target);

        _settings = get_define_symbol(select);

        PlayerSettings.SetScriptingDefineSymbolsForGroup(_target, _settings);
    }


    /// <summary>
    /// 現在選択されているビルドターゲットを取得する。
    /// </summary>
    /// <returns></returns>
    private BuildTargetGroup get_setting_group_info()
    {
        var _build_target = EditorUserBuildSettings.selectedBuildTargetGroup;
        return _build_target;
    }

    private enum Mode
    {
        Debug,
        Release,
    }

    /// <summary>
    /// Defineの定義を変更する中身を返す。
    /// </summary>
    /// <param name="_select"></param>
    /// <returns></returns>
    private string get_define_symbol(int _select)
    {
        var _mode = (Mode)_select;

        switch (_mode)
        {
            case Mode.Debug:
                return "UNITY_DEBUG;EDITOR_DEBUG;DEBUG;";

            case Mode.Release:
                return "RELEASE";
        }

        return "";

    }
```

####説明
ラジオボタンで設定しているものに対して、変更を行う為のもの。get_define_symbol内で設定している定義に設定しなおします。
これの便利な所は、Unity内で、定義されているProject全体としてのDefineをここで切り替える事が出来ます。
もちろんメニューからも切り替える事も出来ますが、メニューからの場合は、およそ3クリック＋define定義をしなければいけません。
個人での開発だと、全然問題ないように思えるかもしれませんが、大型の開発環境において、環境によって切り替えなどは多くあり得る事かと思います。
開発環境、本番と同等環境、本番環境など。
ちなみに、個人においても、（タッチとかを使うゲームだと）Editor環境、スマホ環境などの組み分けとかは少なくとも必要になってくるので、この切り替えめんどくさくなってくるかと思います。


#終わりに
いずれも一回2-3分で終わるようなものですが、回数を重ねるものとかになるとどうしても、面倒になってしまったり、わかりにくかったり、そこまでのメニューのクリックだったり面倒なものを改善しました。


皆さんに良いUnityLifeを。