How to stop Drag event in OnBeginDrag () in unity 4.6

I have a script that handles dragging and dropping items from and to a given slot. But I want to add a function to stop dragging and dropping certain elements. I think the best place to do this is the OnBeginDrag method, but can not seem to figure a way to stop / cancel the drag and drop itself, here is a bit of my code

 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]); } } } } 

I tried to return the method earlier, but it does nothing, maybe you need to do something with the event data ... I would appreciate it if you tell me how to deal with it.

+7
c # events drag-and-drop unity3d
source share
2 answers

You can create a flag (e.g. IsDragable). For items that you don’t want to drag, you need to return from the drag event handlers:

 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 } 

Another solution is to disable BlockRaycast in the CanvasGroup component.

+2
source share

Just using "return" doesn't cancel anything.

Instead, you can change the PointerEventData information that is passed to the OnBeginDrag function, in particular, set pointerDrag to null. This will cancel the drag:

 eventData.pointerDrag = null; 
+12
source share

All Articles