2016-07-11 63 views
0

我想使用Unity UI對象創建一個簡單的拖放遊戲。在UI上拖放

我的對象現在是帶有腳本的圖像。我的腳本使用OnBeginDrag,OnDragOnEndDrag事件,當我想要移動圖像對象時它可以正常工作。

但是圖像對象總是正方形的,我只想在鼠標位於特定區域時才檢測拖動。所以我在我的圖像上創建了一個Polygon Collider 2D,並將其調整爲我想要的形狀。不幸的是,我無法讓它工作。

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 - 這可能有助於 – Clint

+0

@Clint謝謝回答,但它不是我所需要的。我知道如何創建複雜的對撞機,因爲我使用了Polygon Collider 2D來創建我想要的形狀。我不知道的是如何應用我的拖放腳本,以便它使用那些碰撞器而不是精靈。當我嘗試將我的腳本應用到沒有圖像的對象時,它根本不起作用。它不檢測任何拖動事件。 –

回答

0

好吧,我GOOGLE了一下,我找到了一個解決方案。只需在裏面創建一個帶有此代碼的類,並將其放在要通過對撞機拖動的對象上。

using 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; 
} 
}