VRC用の拡張Editorを作ってみよう(1)



#目次
1.Editorフォルダを作成する
2.スクリプトファイルを作成する
3.EditorWindowを作成する
4.Avatarをセットできるようにしてみる
5.次回

#1.Editorフォルダを作成する
まずはじめにスクリプトを入れるEditorフォルダーを作成していきます
Assetsで右クリックして__Create/Folder__を選択します
フォルダーが作成されたら、名前は__"Editor"__に変更しておきましょう
フォルダーが完成しました
![Editor2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/0f753a45-772a-7c02-9452-7dcf8159b265.png)

#2.スクリプトファイルを作成する
先ほど作成したフォルダーにスクリプトファイルを作成します
__Editor__フォルダーを開き右クリックして__Create/C#Script__を選択します
スクリプトが作成されたら名前を変更しましょう
私は__TestEditor__に変更しました
これでスクリプトファイルは作成されました
![Script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/0c94a5c7-c9f9-3fe8-6e60-4c36fcc39a9e.png)

#3.EditorWindowを作成する
###最初にスクリプトファイルを開いてみる
先ほど作成したスクリプトファイルを開きます
スクリプトエディターが開くとこのようなものが作成されているかと思います

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestEditor : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
```
確認できましたね

####まずはEditorを扱うためにUnityEditorを追加していきます
__using UnityEngine__の下に __using UnityEditor__ を追加しましょう。
追加ができたら必要のない__void Start__と__void Update__も削除してしまいましょう

これらが済むとこんな感じになると思います

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class TestEditor : MonoBehaviour
{
    
}
```

####次にEditorWindowを継承します
EditorWindowの機能を使うために継承を行います
__MonoBehaviour__から

```c#
public class TestEditor : MonoBehaviour
```
__EditorWindow__に変更します

```c#
public class TestEditor : EditorWindow
```

変更ができるとこんな感じになると思います

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class TestEditor : EditorWindow
{
    
}
```

###準備が整ったのでEditorWindowを開けるようにしていきます
まずはメニューバーに表示するためのMenuItemを作成していきます

```c#
public class TestEditor : EditorWindow
{
    [MenuItem("TestEditor/TestEditor")]
}
```

次にウィンドウを取得して表示できるようにします
ウィンドウを開くために__EditorWindow.GetWindow__を使用します

```c#
EditorWindow.GetWindow<"クラス名">("フローティングのユーティリティウィンドウを作成するか", "タイトル");
```

これらを設定していきます
今回の場合はこんな感じです

```c#
EditorWindow.GetWindow<TestEditor>(true, "TestEditor");
```

これを書き加えて...

```c#
public class TestEditor : EditorWindow
{
    [MenuItem("TestEditor/TestEditor")]

	public static void ShowWindow()
	{
		EditorWindow.GetWindow<TestEditor>(true, "TestEditor");
	}
}
```

これでEditorを開く準備ができました
Ctrl + Sで__保存__してUnityで開いてみましょう

![Menubar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/8df5a322-de6e-d914-c105-2842c34ae3c5.png)


MenuItemに設定した名前がメニューバーに追加されていると思います

![Editor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/56f5c1ea-ad40-c394-f779-c55f04847a69.png)

開きました

#4.Avatarをセットできるようにしてみる
###まずはOnGUIを使って描画処理を出来るようする

先ほど作成した__ShowWindow__の下に__OnGUI__を書きます

```c#
public static void ShowWindow()
	{
		EditorWindow.GetWindow<TestEditor>(true, "TestEditor");
	}

	private void OnGUI()
	{
		
	}
```

###次にアバターをセットするための変数を宣言します
変数を宣言する前に__VRCAvatarDescriptor__を使用するためのusingを追加していきます
__unityにVRC3SDKをインポートしていなければ、インポートしてください。__
__UnityEditor__の下に__VRC.SDK3.Avatars.Components__を追加します

```c#
using UnityEditor;
using VRC.SDK3.Avatars.Components;
```

これで準備はできました

準備ができたら変数を宣言します
__private__な__VRCAvatarDescriptor__タイプの__Avatar__変数を、グローバルな変数として宣言するためにメソッド外で宣言します
今回はOnGUIの上で作成します

```c#
private VRCAvatarDescriptor avatar;
private void OnGUI()
{
		
}
```

これで変数はできました

###変数にObjectを入れるためのObjectFieldを作る
箱を作るために__EditorGUILayout.ObjectField__を使用します

```c#
EditorGUILayout.ObjectField("フィールドのラベル", "フィールドを表示するオブジェクト", "割り当てることのできるタイプ", "オブジェクトを選択できるようにするか");
```

これらを設定していきます
今回はこのようになりました

```c#
EditorGUILayout.ObjectField("Avatar", avatar, typeof(VRCAvatarDescriptor), true);
```

ObjectField完成しました

###ObjectFieldからavatarに代入する
avatar変数へ代入します

```c#
avatar = EditorGUILayout.ObjectField("Avatar", avatar, typeof(VRCAvatarDescriptor), true);
```

できました...？
いいえ、このままではエラーが出ているはずです
>エラー 型 'UnityEngine.Object' を 'VRC.SDK3.Avatars.Components.VRCAvatarDescriptor' に暗黙的に変換できません。明示的な変換が存在します

だそうです。
明示的な変換をしていきます。
今回はキャストするために__as__を使用します
このようになればエラーは消えるはずです

```c#
avatar = EditorGUILayout.ObjectField("Avatar", avatar, typeof(VRCAvatarDescriptor), true) as VRCAvatarDescriptor;
```

これでObjectFieldからavatar変数へ代入することができました
全体のコードはこうなります

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using VRC.SDK3.Avatars.Components;

public class TestEditor : EditorWindow
{
    [MenuItem("TestEditor/TestEditor")]

	public static void ShowWindow()
	{
		EditorWindow.GetWindow<TestEditor>(true, "TestEditor");
	}


	private VRCAvatarDescriptor avatar;
	private void OnGUI()
	{
		avatar = EditorGUILayout.ObjectField("Avatar", avatar, typeof(VRCAvatarDescriptor), true) as VRCAvatarDescriptor;
	}
}
```

Ctrl + Sで__保存__して確認してみましょう
![EditorAvatar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/62018f0a-df8c-958a-3ef4-8d4e71701b35.png)
出来てますね
次に__VRCAvatarDescriptorが入っているアバター__を__ObjectField__に入れてみましょう
![AvatarDiscrip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/31fbf13d-f529-2539-c745-240361c52d43.png)
入れることができるか確認できたと思います
####これで今回は終了です

#5.次回
次回は今回取得したAvatarにオブジェクトを入れるエディターを作成していきたいと思います

[VRC用の拡張Editorを作ってみよう(2)](https://qiita.com/Milcia/items/096450604caf01cbcc75)