IDragHandlerを実装するUnityコンポーネントと、IDropHandlerを実装するUnityコンポーネントを実装しました。 IDragHandlerコンポーネントはドラッグするオブジェクトに配置されますが、IDropHandlerコンポーネントはオブジェクトをにドロップでき、はドロップできないオブジェクトはにドロップできます。3D空間内の2Dオブジェクトを持つUnity IDropHandler
私は遠近法カメラで3Dで作業しています。
以下のコードは、3Dオブジェクト上の3Dオブジェクト、2D UIオブジェクト上の3Dオブジェクトをドロップするのには問題ありませんが、3Dオブジェクト上の2D UIオブジェクトまたは2D UIオブジェクト上の2D UIオブジェクトをドロップすることはできません。
私が持っていた問題は、ドラッグしているオブジェクトがOnDropをブロックし、EventSystemのレイキャスティング(そのオブジェクトにIDropHandlerを実装していなくても)のためにそれを取ることです。
3Dオブジェクトの場合、IDragHandlerコンポーネントでドラッグしながらColliderを一時的に無効にして、OnDropを与えるオブジェクトを決定するRaycastがドラッグされたオブジェクトとその背後のオブジェクトを通過することを確認します。 しかし、2DのUIオブジェクトは、ドラッグアンドドロップのためにコライダーでは機能しないため、無効にできるコライダーはありません。 EventSystemレイキャストがドラッグされたオブジェクトをバイパスして、その背後のオブジェクトにOnDropを渡すかどうかを確認する方法はわかりません。
public void OnBeginDrag(PointerEventData eventData)
{
...
if (UIObject)
{
// What to do here?
}
else
{
var collider = gameObject.GetComponent<Collider>();
collider.enabled = false;
}
}
public void OnDrag(PointerEventData eventData)
{
// Move object and stuff
...
}
public void OnEndDrag(PointerEventData eventData)
{
if (UIObject)
{
// What to do here?
}
else
{
var collider = gameObject.GetComponent<Collider>();
collider.enabled = true;
}
}
私がこれまで試してみました物事はにある:
1)一時的にIgnoreRaycast層
2でゲームオブジェクトを配置)オブジェクトにキャンバスグループを追加し、一時的にオフにする「ブロックレイキャスト "と言いました。
私は実際に何らかの理由でオブジェクトを削除するまで、OnBeginDragで何もしないようです。上記の#2を試してみると、オブジェクトがドロップされるまで「ブロックレイキャスト」がオフにならず、オブジェクトがもはやドラッグできなくなってしまいました。