inspectorの情報にヘルプとボタンを作る

## やりたいこと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/ff463d03-e208-f51e-a8b6-b32212de30c6.png)

ヘルプのテキスト情報とButtonを配置する。Test1ボタンをおすと関数が呼ばれる。

## ヘルプのテキストを追加する。

ヘルプだけなら問題はないがヘルプとボタンをEditor拡張するため、複数拡張できるようにCanEditMultipleObjectsをクラスに追加する。

```
//複数選択有効
[CanEditMultipleObjects]
public class Test : MonoBehaviour
{
```

ヘルプを追加したいクラスにの上にEditorを継承したクラスを作成
```
using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(Test))]
public class PlayerInputEditor : Editor
{
    public override void OnInspectorGUI()
    {
        var helpTxt = 
            "ヘルプ情報aaaaaaaaaaaaaaaaaaaaa\n" +
            "fdsasdfdddddddddddddddddddddddd\n";
        EditorGUILayout.HelpBox(helpTxt, MessageType.None);

        //元のInspectorを表示
        base.OnInspectorGUI();
        //スペースを追加
        GUILayout.Space(20);
    }
}
//複数選択有効
[CanEditMultipleObjects]
public class Test : MonoBehaviour
```
ustomEditor(typeof(Test)でEditor拡張したいクラスをしていする。

HelpBoxでテキストの表示

base.OnInspectorGUI();
もとのInspector情報が上書きされるので、元情報も表示する。

あとは好きにヘルプを修正する。

## ボタンを追加する。
### Attributeクラスを追加
```
    [SerializeField, Button("Test1")]
    private bool ButtonLabel;
```
最終的にこの形で使用する。

Attributeクラスを作成

```
    /// <summary>
    /// ButtonAttribute inspectorにボタンを追加するために必要
    /// </summary>
    public class ButtonAttribute : PropertyAttribute
    {
        public string methodName;
        public string buttonName;
        /// <summary>
        /// ボタンを押したときにメソッドを実行する。
        /// </summary>
        /// <param name="methodName">実行するメソッド名</param>
        /// <param name="buttonName">ボタンの表示名（省略可能）</param>
        /// <returns>void</returns>
        public ButtonAttribute(string methodName, string buttonName = null)
        {
            this.methodName = methodName;

            if (buttonName == null)
            {
                this.buttonName = methodName;
            }
            else
            {
                this.buttonName = buttonName;
            }

        }
```

ボタンの名前とメソッド名を変更できる機能も実装している。


この記事参考

https://note.com/dobunezumi06/n/n47c3ee7ac7f8

### EditorフォルダにButtonDrawerクラスを作成

UnityにはResoucesフォルダのようにEditorという名の特別なフォルダがある。
なければ自分でつくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/e2f74ff8-0e03-0d20-a83b-941251ec014e.png)

```
[CustomPropertyDrawer(typeof(ButtonAttribute))]
public class ButtonDrawer : PropertyDrawer
{
    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        ButtonAttribute buttonAttribute = (ButtonAttribute)attribute;

        // プロパティ名のラベルを描画し、ラベル以外のrectを返す
        Rect rect_content = EditorGUI.PrefixLabel(position, label);

        // ボタンを描画
        if (GUI.Button(rect_content, buttonAttribute.buttonName))
        {
            try
            {
                // メソッド名からメソッドを取得、実行
                MethodInfo method = property.serializedObject.targetObject.GetType().GetMethod(buttonAttribute.methodName);
                method.Invoke(property.serializedObject.targetObject, null);
            }
            catch
            {
                Debug.Log(buttonAttribute.methodName + " を実行できません");
            }
        }
    }
}
```
typeof(ButtonAttribute)にさっき作ったクラスを指定
これで準備完了

### つかう
```
//複数選択有効
[CanEditMultipleObjects]
public class Test : MonoBehaviour
{
    [SerializeField, Button("Test1")]
    private bool ButtonLabel;

    public void Test1()
    {
        Debug.Log("Test1_start");
    }
```
Test1()はpublicで設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/d3dac3fe-f4cd-8fca-2287-938e5f9e0732.png)

やったね。