UnityEditor内に画像をドラッグアンドドロップしてゲームで画像を使用する

## はじめに
Unityのデフォルトの挙動だと、Gameウィンドウに何かしらをドラッグアンドドロップすることはできないので、ゲームウィンドウへのファイルのドラッグアンドドロップは一々ビルドしたゲームでテストする必要がありました。

この記事では、Gameウィンドウではなく、カスタムウィンドウを作成することで、一々ビルドしなくてもファイルのドラッグアンドドロップが試せるようにするということをやっていきます。

ビルド後にドラッグアンドドロップを判定しているコードは参考元のコードを確認して下さい。

## 環境
- Unity6000.0.23f1
- Windows11

## 参考元
#### ビルド後にドラッグアンドドロップ判定
https://qiita.com/ReoNagai/items/7d80b9c0d13190569cea

#### Editor拡張でのドラッグアンドドロップ
https://qiita.com/matsumotokaka11/items/fbb9820cdfa99e2dfb28

https://light11.hatenadiary.com/entry/2024/04/17/195943


## 先にまとめ
:::note alert
EditorのGameウィンドウに直接ファイルをドラッグアンドドロップできない

![2024-12-01 14-27-15_3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951067/4e1ea5ac-28a8-9a38-ab3a-18584e891876.gif)
:::

:::note info
上記参考元を真似すると、ビルド後ならドラッグアンドドロップの判定を取得できる

![2024-12-01 14-27-15_6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951067/96c42d65-95a2-bd06-9f00-54568f048c2e.gif)
:::

:::note info
Editor内のカスタムウィンドウを作成すれば、Editorでの実行時でもゲーム画面にファイルをドラッグアンドドロップしたときと同じ挙動をテストできる
![2024-12-01 14-27-15_4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951067/67044110-acc6-44bb-fda1-ef3c88d582ba.gif)
:::

## 行ってみよう(僕らと今~アドベンチャーのくーにへぇぃ)
#### ドラッグアンドドロップ用のカスタムウィンドウを作る
```
#if UNITY_EDITOR

using UnityEditor;
using UnityEngine;

namespace WANWANCAT
{    
    public class DragAndDropWindow : EditorWindow
    {
        /// <summary>
        /// ドラッグアンドドロップ用ウィンドウ作成
        /// </summary>
        [MenuItem("Window/DragAndDropWindow")]
        public static void ShowWindow()
        {
            //ウィンドウの名前を設定する
            GetWindow<DragAndDropWindow>("DragAndDropWindow");
        }
            
        /// <summary>
        /// D&Dイベント監視
        /// </summary>
        private void OnGUI()
        {
            GUILayout.Label("画像をドラッグアンドドロップするとこ", EditorStyles.boldLabel);

            // ドラッグイベントを監視
            Event evt = Event.current;
            Rect dropArea = GUILayoutUtility.GetRect(0, 150, GUILayout.ExpandWidth(true));
            GUI.Box(dropArea, "ここにドラッグアンドドロップしてちょ");

            // ドロップエリア内でのイベント処理
            switch (evt.type)
            {
                case EventType.DragUpdated:
                case EventType.DragPerform:
                    
                    //ドロップされた位置がドロップエリア外
                    if (!dropArea.Contains(evt.mousePosition)) return;
                    
                    //カーソルのアイコンを変更する
                    DragAndDrop.visualMode = DragAndDropVisualMode.Copy;

                    //ドロップされた時の処理
                    if (evt.type == EventType.DragPerform)
                    {
                        //Unity内のオブジェクト用ドラッグアンドドロップ承認
                        DragAndDrop.AcceptDrag();
                        
                        //todo:ゲームの方のドラッグアンドドロップクラスの関数等を実行する
                        //上記参照記事の例で行くと、
                        //void OnFiles(List<string> aFiles, POINT aPos)
                        //が該当。aPosはゲームに必要なら、ドラッグアンドドロップする
                        //ウィンドウをgameウィンドウと同じサイズにするとかでできそう
                    }
                    
                    //イベントの消費
                    Event.current.Use();
                    break;
            }
        }
    }
}
#endif
```

これでWindow/DragAndDropWindow　という項目ができるので、それを選択してウィンドウを表示する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951067/61d42bc8-6b95-860b-9bf2-cc953af075d9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951067/836ec494-f203-419b-3997-55ee307e9987.png)


このEditor拡張のtodo:の部分でメインのドラッグアンドドロップクラスに繋いであげれば、一々ビルドしなくてもドラッグアンドドロップの挙動を確認できます。

## 上記コードについてのおまけ

#### EventTypeについて
EventTypeのドラッグアンドドロップ系のタイプ
- EventType.DragExited     : ドラッグ対象がエリア外に出た時
- EventType.DragUpdated    : ドラッグ対象がエリア内で更新されている時
- EventType.DragPerform    : ドラッグ対象がエリア内でドロップされた時

https://docs.unity3d.com/ja/2019.4/ScriptReference/EventType.html


#### カーソルのアイコンを変更する
DragAndDrop.visualMode = DragAndDropVisualMode.Copy;
↑で、マウスカーソルをコピーする場合のカーソルアイコンに変更している。
DragAndDropVisualMode.Copy以外にも以下のパターンがある。
- DragAndDropVisualMode.Copy
- DragAndDropVisualMode.Move
- DragAndDropVisualMode.Link
- DragAndDropVisualMode.Rejected
- DragAndDropVisualMode.None

https://docs.unity3d.com/ja/2019.4/ScriptReference/DragAndDropVisualMode.html


#### ドラッグアンドドロップの承認
DragAndDrop.AcceptDrag();の部分。
これを実行することで、ドラッグしているUnityEditor内のオブジェクトがドラッグアンドドロップの対象として受け入れられるらしいが、試しにDragAndDrop.AcceptDrag();をしなくてもpathが取得できたので、何が変わっているのかよくわかってない。

https://docs.unity3d.com/ja/2022.3/ScriptReference/DragAndDrop.AcceptDrag.html

#### イベントの消費
Event.current.Use();の部分。
これでイベントを消費して、他の箇所でこれ以上使われないようにしているらしい。

https://docs.unity3d.com/ja/current/ScriptReference/Event.Use.html


## 以上

最近ピップマグネループを使い始めたのですが、めちゃくちゃオススメです。
映画300の途中で仲間に入れてくれって言ってきた奴くらい姿勢が悪くて肩首終わってたのですが、

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951067/798a4874-a64e-ef2b-feb9-a4f1eb4a6526.png" width=25%>


つけ始めてから肩首が無くなった位快適です。肩首終わってる同士は是非。

では。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951067/65079c23-eedf-4c7d-6ede-ef7bb430dfaf.jpeg" width=25%>