как остановить событие перетаскивания в OnBeginDrag () в unity 4.6
у меня есть скрипт, который обрабатывает перетаскивание элементов из и в данный слот. Но я хочу добавить функцию, чтобы остановить перетаскивание определенных элементов. я думаю, что лучшее место для этого-в 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]);
}
}
}
}
Я попытался вернуть метод раньше, но он ничего не делает, вероятно, нужно что-то сделать с данными события...я буду благодарен если вы скажите как бороться с он.
2 ответов
вы можете создать флаг (например, 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
}
другое решение-отключить BlockRaycast на CanvasGroup компонент.
просто использование "return" ничего не отменяет.
вместо этого вы можете изменить информацию PointerEventData, которая передается в функцию OnBeginDrag - в частности, установите pointerDrag в значение null. Это отменит перетаскивание:
eventData.pointerDrag = null;