2016-07-24 11 views
0

Ich habe eine example über Drag & Drop-Elemente mit UnityEngine.EventSystems gefolgt und es funktioniert.Funktioniert IDragHandler nur auf Canvas- und UI-Elementen?

using UnityEngine; 
using System.Collections; 
using UnityEngine.EventSystems; 

public class DragHandler : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler 
{ 
    public static GameObject itemBeingDragged; 
    private Vector3 startPosition; 
    private Transform startParent; 

    public void OnBeginDrag(PointerEventData eventData) 
    { 
     itemBeingDragged = gameObject; 
     startPosition = transform.position; 
     startParent = transform.parent; 
     GetComponent<CanvasGroup>().blocksRaycasts = false; 
    } 

    public void OnDrag(PointerEventData eventData) 
    { 
     transform.position = Input.mousePosition; 
    } 

    public void OnEndDrag(PointerEventData eventData) 
    { 
     itemBeingDragged = null; 
     GetComponent<CanvasGroup>().blocksRaycasts = true; 
     if (transform.parent == startParent) 
      transform.position = startPosition; 
    } 
} 

Aber der gleiche Code funktioniert nicht, wenn ich die Skriptkomponente zu einem Sprite außerhalb des Canvas hinzufügen. Also muss ich diesen Code verwenden, um & Drop Sprites zu ziehen.

using UnityEngine; 
using System.Collections; 

public class DragDrop : MonoBehaviour { 

    private Vector3 offset; 

    void OnMouseDown() 
    { 

     offset = gameObject.transform.position - 
      Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 4f)); 
    } 

    void OnMouseDrag() 
    { 
     Vector3 newPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 4f); 
     transform.position = Camera.main.ScreenToWorldPoint(newPosition) + offset; 
    } 
} 

Aber auf diese Weise ich nicht erkennen kann, ob ein Gameobject zum anderen fallen gelassen wurde, die durch IDropHandler.OnDrop in Leinwand getan werden kann.

Also in Unity muss ich IDragHandler und EventSystem nur auf Leinwand und UI-Elemente verwenden?

Gibt es Alternativen zum Auffinden verlorener Gegenstände in einem Spielobjekt ohne Leinwand?

Antwort

2

IDragHandler -> interface in UnityEngine.EventSystems Implementiert interfaces: IEventSystemHandler -> base Klasse, die alle EventSystem Ereignisse aus erben.

Klasse in UnityEngine.EventSystems Erbt von EventSystems.UIBehaviour

So ... IDragHandler und EventSystem Arbeit nur auf Leinwand und UI-Elemente.