Unity 2D перетаскивание в iDropHandler - PullRequest
0 голосов
/ 09 января 2019

У меня есть перетаскиваемый игровой объект (кирпич), который реализует IBeginDragHandler, IDragHandler, IEndDragHandler

У меня также есть другой игровой объект (слот), в который можно поместить кирпич, который реализует IDropHandler

Беглый взгляд на метод OnBeginDrag в Bricks:

public static GameObject itemBeingDragged;
Vector3 startPosition;
Transform startParent;

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



}

Когда я опускаю кирпич в слот, кирпич принимает слот в качестве родителя, а также принимает положение слотов, как в коде метода IDDHandler OnDrop:

public void OnDrop(PointerEventData eventData)
    {
            DragHandler.itemBeingDragged.transform.SetParent(transform);
            DragHandler.itemBeingDragged.transform.position = transform.position;
    }

Проблема в том, что когда я перетаскиваю кирпичик, я хочу, чтобы он был слегка смещен относительно позиции кирпичей (например, на мобильном телефоне, чтобы при перетаскивании кирпича кирпич не скрывался визуально моим пальцем). )

Итак, в коде Bricks OnDrag у меня есть что-то подобное для визуального смещения:

public void OnDrag(PointerEventData eventData)
{

    Vector3 offset = new Vector3(0, 100, 0);
    transform.position = Input.mousePosition + offset;


}

Я знаю, что выше для положения мыши, но в конечном итоге я хочу, чтобы это было положение касания.

При перетаскивании это выглядит хорошо, однако при перетаскивании его в слот метод OnDrop слота вызывается только тогда, когда указатель мыши находится над слотом, а не когда кирпич находится над слотом. То есть, когда я отпускаю перетаскивание, когда кирпич находится над слотом, OnDrop не вызывается. Он вызывается только тогда, когда я отпускаю кирпич снаружи слота таким образом, чтобы указатель мыши находился внутри слота. Имеет смысл?

Есть ли способ заставить OnDrop работать с положением кубиков, а не с мышью?

Спасибо Kevin

1 Ответ

0 голосов
/ 09 января 2019

Это, в конечном счете, хак, и именно поэтому мне нравится делать свою собственную логику перетаскивания с событиями указателя вниз / вверх, но в любом случае: сделать визуал дочерним объектом игрового объекта с прикрепленным сценарием кирпича, затем перемещайте только визуальный элемент вверх, когда начинается перетаскивание. Когда перетаскивание завершено, переместите визуальный элемент на место.

И, кстати, вы используете SetParent(transform) на что-то похожее на RectTransform. Как правило, вы хотите использовать SetParent(transform, false) с прямоугольными преобразованиями, потому что иначе вы испортите систему разметки и в любом случае потеряете преимущества прямоугольных преобразований.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...