2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-12-01

はじめに

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

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

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

環境

  • Unity6000.0.23f1
  • Windows11

参考元

ビルド後にドラッグアンドドロップ判定

Editor拡張でのドラッグアンドドロップ

先にまとめ

EditorのGameウィンドウに直接ファイルをドラッグアンドドロップできない

2024-12-01 14-27-15_3.gif

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

2024-12-01 14-27-15_6.gif

Editor内のカスタムウィンドウを作成すれば、Editorでの実行時でもゲーム画面にファイルをドラッグアンドドロップしたときと同じ挙動をテストできる
2024-12-01 14-27-15_4.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
image.png

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

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

EventTypeについて

EventTypeのドラッグアンドドロップ系のタイプ

  • EventType.DragExited : ドラッグ対象がエリア外に出た時
  • EventType.DragUpdated : ドラッグ対象がエリア内で更新されている時
  • EventType.DragPerform : ドラッグ対象がエリア内でドロップされた時

カーソルのアイコンを変更する

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

  • DragAndDropVisualMode.Copy
  • DragAndDropVisualMode.Move
  • DragAndDropVisualMode.Link
  • DragAndDropVisualMode.Rejected
  • DragAndDropVisualMode.None

ドラッグアンドドロップの承認

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

イベントの消費

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

以上

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

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

では。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?