comment arrêter événement Glisser dans OnBeginDrag() dans l'unité de 4,6
J'ai un script qui gère les faisant glisser de l'un des éléments à partir de et vers un emplacement. Mais je veux ajouter une fonction pour arrêter de glisser de l'un des éléments spécifiques. je pense que le meilleur endroit pour le faire est dans le OnBeginDrag
méthode, mais ne peut pas sembler trouver un moyen pour arrêter/annuler l'événement glisser lui-même, ici est un peu mon 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]);
}
}
}
}
J'ai essayé de revenir à la méthode précédente, mais il ne marche pas faire quelque chose, probablement besoin de faire quelque chose avec les données d'événement...je serai reconnaissante si vous me dites comment traiter avec elle.
REMARQUE - voici une très complet, élégant, solution pour glisser/déposer profiter .. stackoverflow.com/a/37473953/294884
OriginalL'auteur Ivan Kuzev | 2015-01-28
Vous devez vous connecter pour publier un commentaire.
Vous pouvez créer drapeau (par exemple, IsDragable). Pour les articles qui vous donn veux pas de drag&drop, vous devez les retourner pour faire glisser des gestionnaires d'événement:
Autre solution est de désactiver BlockRaycast dans CanvasGroup composant.
Il n'y a pas de problème ici. Vous pouvez le vérifier IsDraggable drapeau dans OnDrop événement. Et ne rien faire si c'est faux.
Merci!!!! J'aime BlockRaycast beaucoup mieux depuis ce aussi désactiver tous les déclencheurs (comme les animations) qui dépend de la faire Glisser de l'événement pour que GameObject, tandis que DragHandler n'est pas d'aider la désactivation des événements et déclenche toujours de tir (animations de la lecture).
OriginalL'auteur acoolaum
Juste à l'aide de "retour" n'a pas d'annuler quoi que ce soit.
Au lieu de cela, vous pouvez modifier la PointerEventData info qui est passée dans l'OnBeginDrag - en particulier, à définir pointerDrag à null. Ceci annulera le glisser:
Cette réponse a été publiée deux ans exactement après la accepté de répondre, mais c'est en fait la bonne réponse. Comme indiqué, le réglage
pointerDrag
ànull
n'a, en fait, de prévenir la OnDrag et OnEndDrag événements de même d'être posée. Merci!Fonctionne comme prévu, merci 🙂
OriginalL'auteur Andrew