通过2D Polygon Collider组件拖动精灵

时间:2015-08-11 03:04:49

标签: c# unity3d drag-and-drop position

我有一个可拖动的类,非常适合拖动整个精灵,我试图修改它以仅在精灵对象的定义的2D多边形对撞机组件中注册拖动。当我在多边形对撞机的边界内点击时,我很难让拖拽只能进行注册。现在它仍然在我点击拖动精灵的任何地方拖动,包括在我的多边形对撞机的边界之外。我真的可以在这方面使用一些指导。我还附上了一张图片来说明我想要实现的目标。谢谢!

enter image description here

PolygonCollider2D collider;

    void Start ()
    {
        collider = transform.GetComponent<PolygonCollider2D>();
    }

    public void OnDrag (PointerEventData eventData)
    {
        Vector3 mousePosition = new Vector3(eventData.position.x, eventData.position.y, 0);
        collider.transform.position = mousePosition;                                       

    if(transform.parent.gameObject == partsPanel)
            transform.SetParent(dragLayer.transform);                                      

        if(transform.parent.gameObject == buildBoard)
            transform.SetParent(dragLayer.transform);
    }

2 个答案:

答案 0 :(得分:0)

AFAIK,我们添加到精灵中的多边形对撞机是可编辑的。转到检查器,对撞机组件,并有一个按钮,允许编辑对撞机区域。调整此对撞机的点以覆盖所需区域。这样,只有所需区域才会收到触摸事件。

答案 1 :(得分:0)

好的,我知道这是一个非常老的线程,但我有类似的问题,我找到了一个解决方案,所以我会在这里发布:)

只需使用此代码创建一个类并将其放在您的对象上

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