特定のスロットとの間のアイテムのドラッグを処理するスクリプトがあります。しかし、特定のアイテムのドラッグを停止する機能を追加したいと思います。 OnBeginDrag
メソッドが最適だと思いますが、ドラッグイベント自体を停止/キャンセルする方法がわからないようです。ここに私のコードを少し示します。
public class SlotBehaviour : MonoBehaviour, IDropHandler, IPointerEnterHandler, IPointerExitHandler, IBeginDragHandler, IDragHandler, IEndDragHandler,IPointerClickHandler
{
public void OnBeginDrag(PointerEventData eventData)
{
if (eventData.button != PointerEventData.InputButton.Left)
{
return;
}
if (this.Empty) return;
var canvas = imageItem.canvas;
if (canvas == null) return;
GUIManager.mouseBusy = true;
// We have clicked something that can be dragged.
// What we want to do is create an icon for this.
m_DraggingIcon = new GameObject("icon");
m_DraggingIcon.transform.SetParent(canvas.transform, false);
m_DraggingIcon.transform.SetAsLastSibling();
var image = m_DraggingIcon.AddComponent<Image>();
// The icon will be under the cursor.
// We want it to be ignored by the event system.
m_DraggingIcon.AddComponent<IgnoreRaycast>();
image.Sprite = imageItem.Sprite;
image.rectTransform.sizeDelta = imageItem.rectTransform.sizeDelta;
m_DraggingPlane = transform as RectTransform;
SetDraggedPosition(eventData);
}
public void OnDrag(PointerEventData data)
{
if (m_DraggingIcon != null)
SetDraggedPosition(data);
}
private void SetDraggedPosition(PointerEventData data)
{
if (data.pointerEnter != null && data.pointerEnter.transform as RectTransform != null)
m_DraggingPlane = data.pointerEnter.transform as RectTransform;
var rt = m_DraggingIcon.GetComponent<RectTransform>();
Vector3 globalMousePos;
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(m_DraggingPlane, data.position, data.pressEventCamera, out globalMousePos))
{
rt.position = globalMousePos;
rt.rotation = m_DraggingPlane.rotation;
}
}
public void OnEndDrag(PointerEventData eventData)
{
if (m_DraggingIcon != null)
{
Destroy(m_DraggingIcon);
}
GUIManager.mouseBusy = false;
//if you drop it somewhere where its not wanted(or just nowhere)
if (eventData.used == false)
{
if (eventData.pointerCurrentRaycast.gameObject == null)// if its nowhere offer to drop it on ground
{
GUIManager.instance.DropItem((int)ItemsDatabase.container[containerID].items[indexInContainer]);
}
}
}
}
以前にメソッドを返してみましたが、何も実行されません。おそらくイベントデータで何かを行う必要があります...対処方法を教えていただければ幸いです。
フラグを作成できます(たとえば、IsDragable)。ドラッグアンドドロップしたくないアイテムの場合は、ドラッグイベントハンドラーから戻る必要があります。
public class DragHangler : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler {
public bool IsDragable;
#region IBeginDragHandler implementation
public void OnBeginDrag (PointerEventData eventData)
{
if (!IsDragable) return;
Debug.Log ("OnBeginDrag:Do something");
}
#endregion
#region IDragHandler implementation
public void OnDrag (PointerEventData eventData)
{
if (!IsDragable) return;
Debug.Log ("OnDrag: Do something");
}
#endregion
#region IEndDragHandler implementation
public void OnEndDrag (PointerEventData eventData)
{
if (!IsDragable) return;
Debug.Log ("OnEnd: Do something");
}
#endregion
}
他の解決策は、CanvasGroupコンポーネントでBlockRaycastを無効にすることです。
「return」を使用しただけでは、何もキャンセルされません。
代わりに、OnBeginDrag関数に渡されるPointerEventData情報を変更できます。具体的には、pointerDragをnullに設定します。これにより、ドラッグがキャンセルされます。
eventData.pointerDrag = null;