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.
c # events drag-and-drop unity3d
Ivan Kuzev
source share