2016-07-11 14 views
0

Ich möchte ein einfaches Drag & Drop-Spiel mit Unity UI-Objekten erstellen.Drag & Drop auf der Benutzeroberfläche

Meine Objekte sind jetzt Bilder mit Skripten an sie angehängt. Mein Skript verwendet OnBeginDrag, OnDrag und OnEndDrag Ereignisse, die gut funktionieren, wenn ich Bildobjekte verschieben möchte.

Allerdings sind Bildobjekte immer quadratisch und ich möchte nur dann ziehen, wenn sich die Maus auf einem bestimmten Bereich befindet. Also habe ich einen Polygon Collider 2D auf meinem Bild erstellt und an die gewünschte Form angepasst. Leider kann ich es nicht funktionieren lassen.

public void OnBeginDrag(PointerEventData eventData) 
{ 
    var canvas = FindInParents<Canvas>(gameObject); 

    itemBeingDragged = gameObject; 
    m_DraggingPlane = canvas.transform as RectTransform; 
} 

public void OnDrag(PointerEventData eventData) 
{ 
    SetDraggedPosition(eventData); 
} 

public void OnEndDrag(PointerEventData eventData) 
{ 
    itemBeingDragged = null; 
    int i = 0; 
    foreach (Vector3 hex in otherHexes) 
    { 
     Vector3 rayBeginning = hex + transform.position; 
     rays = Physics2D.RaycastAll(rayBeginning, Vector2.zero); 


     if (rays.Length > 1)                    //if there are other elements in RayCast 
     { 
      foreach (RaycastHit2D ray in rays) 
      { 
       if (ray.transform.gameObject != gameObject && ray.transform.tag == "Hex")     //if element is not self and is a HexGrid 
       { 
        SuccessfulDrag(ray, i); 
       } 
       else if (ray.transform.gameObject != gameObject && ray.transform.tag == "GetOut")   //if element is not self and is another puzzle 
       { 
        FailedDrag(); 
        break; 
       } 
      } 
     } 
     else if (rays.Length == 1 && rays[0].transform.gameObject == gameObject)        //if there is only one element and it's self 
     { 
      FailedDrag(); 
      break; 
     } 
     i++; 
    } 
} 
+0

http://answers.unity3d.com/questions/423378/how-do-you-create-complex-collision-geometry-to-ma.html - diese – Clint

+0

@Clint Vielen Dank für Antwort helfen kann, aber es ist nicht das, was ich brauche. Ich weiß, wie man komplexe Collider erstellt, als ich Polygon Collider 2D benutzte, um die gewünschte Form zu erzeugen. Was ich nicht weiß, ist, wie ich mein Drag & Drop-Skript anwenden kann, so dass es diese Collider anstelle von Sprite verwendet. Wenn ich versuche, mein Skript auf ein Objekt ohne Bild anzuwenden, funktioniert es einfach nicht. Es werden keine Drag-Events erkannt. –

Antwort

0

Ok, ich googelte ein bisschen mehr und ich fand eine Lösung. Erstellen Sie einfach eine Klasse mit diesem Code und legen Sie sie auf das Objekt, das Sie durch den Collider ziehen möchten.

mit UnityEngine;

[RequireComponent(typeof(RectTransform), typeof(Collider2D))] 
public class Collider2DRaycastFilter : MonoBehaviour, ICanvasRaycastFilter 
{ 
Collider2D myCollider; 
RectTransform rectTransform; 

void Awake() 
{ 
    myCollider = GetComponent<Collider2D>(); 
    rectTransform = GetComponent<RectTransform>(); 
} 

public bool IsRaycastLocationValid(Vector2 screenPos, Camera eventCamera) 
{ 
    var worldPoint = Vector3.zero; 
    var isInside = RectTransformUtility.ScreenPointToWorldPointInRectangle(
     rectTransform, 
     screenPos, 
     eventCamera, 
     out worldPoint 
    ); 
    if (isInside) 
     isInside = myCollider.OverlapPoint(worldPoint); 
    return isInside; 
} 
}