Объект перемещается в центр при перетаскивании - PullRequest
0 голосов
/ 19 мая 2018

Как вы используете IBeginDragHandler и устанавливаете положение перетаскивания, чтобы оно оставалось единообразным, а не внезапно переключалось на центр GameObject?

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

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

public class Draggable : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler {
    public void OnBeginDrag(PointerEventData eventData) {
        Debug.Log ("Started dragging");

    }

    public void OnDrag(PointerEventData eventData) {
        Debug.Log ("Currently dragging");
        this.transform.position = eventData.position;
    }

    public void OnEndDrag(PointerEventData eventData) {
        Debug.Log ("Ended dragging");
    }

}

1 Ответ

0 голосов
/ 19 мая 2018

Вам нужно использовать смещение.Получить смещение при вызове OnPointerDown.Примените это смещение назад, когда вызывается OnDrag.

Для 2D Sprite:

Camera mainCamera;
float zAxis = 0;
Vector3 clickOffset = Vector3.zero;

// Use this for initialization
void Start()
{
    zAxis = transform.position.z;
}

public void OnPointerDown(PointerEventData eventData)
{
    clickOffset = transform.position - mainCamera.ScreenToWorldPoint(new Vector3(eventData.position.x, eventData.position.y, zAxis));
}

public void OnDrag(PointerEventData eventData)
{
    //Use Offset To Prevent Sprite from Jumping to where the finger is
    Vector3 tempVec = mainCamera.ScreenToWorldPoint(eventData.position) + clickOffset;
    tempVec.z = zAxis; //Make sure that the z zxis never change

    transform.position = tempVec;
}

public void OnEndDrag(PointerEventData eventData)
{

}

Для объекта пользовательского интерфейса смещение остается тем же решением, но также следует использовать ScreenPointToLocalPointInRectangle.

public class Draggable : MonoBehaviour, IDragHandler, IBeginDragHandler
{
    public Canvas parentCanvas;
    Vector3 Offset = Vector3.zero;

    public void OnPointerDown(PointerEventData eventData)
    {
        Vector2 pos;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(parentCanvas.transform as RectTransform, eventData.position, parentCanvas.worldCamera, out pos);
        Offset = transform.position - parentCanvas.transform.TransformPoint(pos);
    }

    public void OnDrag(PointerEventData eventData)
    {
        Vector2 movePos;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(parentCanvas.transform as RectTransform, eventData.position, parentCanvas.worldCamera, out movePos);
        transform.position = parentCanvas.transform.TransformPoint(movePos) + Offset;
    }
}
...