はじめに
Unityのデフォルトの挙動だと、Gameウィンドウに何かしらをドラッグアンドドロップすることはできないので、ゲームウィンドウへのファイルのドラッグアンドドロップは一々ビルドしたゲームでテストする必要がありました。
この記事では、Gameウィンドウではなく、カスタムウィンドウを作成することで、一々ビルドしなくてもファイルのドラッグアンドドロップが試せるようにするということをやっていきます。
ビルド後にドラッグアンドドロップを判定しているコードは参考元のコードを確認して下さい。
環境
- Unity6000.0.23f1
- Windows11
参考元
ビルド後にドラッグアンドドロップ判定
Editor拡張でのドラッグアンドドロップ
先にまとめ
行ってみよう(僕らと今~アドベンチャーのくーにへぇぃ)
ドラッグアンドドロップ用のカスタムウィンドウを作る
#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 という項目ができるので、それを選択してウィンドウを表示する。
この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の途中で仲間に入れてくれって言ってきた奴くらい姿勢が悪くて肩首終わってたのですが、
つけ始めてから肩首が無くなった位快適です。肩首終わってる同士は是非。
では。