当拖动开始时,防止对象跳到中心点

本文关键字:对象 中心点 拖动 开始时 | 更新日期: 2023-09-27 18:07:29

我有一个用于拖动GameObjects的脚本,但是现在,每当我开始拖动对象时,它就会跳到指针的中心。我想实现的是,不管我从哪里开始拖拽对象,它都会在那个点开始拖拽,而不是首先跳到对象中心。我需要在我的OnDrag或OnBeginDrag方法中修改什么来实现这个?

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.EventSystems;
using System.Collections.Generic;
public class DragHandling : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerClickHandler
{
    public float partScale;
    [HideInInspector] public Transform placeholderParent = null;
    [HideInInspector] public Transform parentToReturnTo = null;
    [HideInInspector] public GameObject trashCan; 
    [HideInInspector] public GameObject partsPanel;
    [HideInInspector] public GameObject partsWindow;
    [HideInInspector] public GameObject buildBoard;
    GameObject placeholder = null;
    GameObject dragLayer;
    Vector3 buildPanelScale;
    Vector3 partsPanelScale = new Vector3(1.0f, 1.0f, 1.0f);
    Vector3 startPosition;
    // PolygonCollider2D collider;
    void Start ()
    {
        dragLayer = GameObject.FindGameObjectWithTag("DragLayer");
        buildBoard = GameObject.FindGameObjectWithTag("Board");
        partsPanel = GameObject.FindGameObjectWithTag("Parts");
        partsWindow = GameObject.FindGameObjectWithTag("PartsWindow");
        trashCan = GameObject.FindGameObjectWithTag("Trash");
        // collider = transform.GetComponent<PolygonCollider2D>();
    }
    #region IPointerClickHandler implementation
    public void OnPointerClick (PointerEventData eventData)
    {
        if(transform.parent.gameObject == buildBoard)
            transform.SetAsLastSibling();
    }
    #endregion
    #region IBeginDragHandler implementation
    public void OnBeginDrag (PointerEventData eventData)
    {
        // create placeholder gap and hold correct position in layout
        placeholder = new GameObject();
        placeholder.transform.SetParent(transform.parent);
        placeholder.transform.SetSiblingIndex(transform.GetSiblingIndex());
        parentToReturnTo = transform.parent;                                    // store original parent location
        placeholderParent = parentToReturnTo;                                   // set placeholder gameobject transform
        startPosition = transform.position;
        GetComponent<CanvasGroup>().blocksRaycasts = false;                     // turn off image raycasting when dragging image in order to see what's behind the image            
    }
    #endregion
    #region IDragHandler implementation
    public void OnDrag (PointerEventData eventData)
    {
        Vector3 mousePosition = new Vector3(eventData.position.x, eventData.position.y, 0);
        transform.position = Input.mousePosition;                                           // set object coordinates to mouse coordinates
        if(transform.parent.gameObject == partsPanel)
            transform.SetParent(dragLayer.transform);                                       // pop object to draglayer to move object out of parts Panel
        if(transform.parent.gameObject == buildBoard)
            transform.SetParent(dragLayer.transform);
    }
    #endregion
    #region IEndDragHandler implementation
    public void OnEndDrag (PointerEventData eventData)
    {
        transform.SetParent(parentToReturnTo);                                  // Snaps object back to orginal parent if dropped outside of a dropzone
        transform.SetSiblingIndex(placeholder.transform.GetSiblingIndex());     // Returns card back to placeholder location
        GetComponent<CanvasGroup>().blocksRaycasts = true;                      // turn Raycast back on
        Destroy(placeholder);                                                   // kill the placeholder if object hits a drop zone or returns to parts panel
        if(transform.parent.gameObject == buildBoard)
        {
            buildPanelScale = new Vector3(partScale, partScale, partScale);
            transform.localScale = buildPanelScale;
            transform.SetAsLastSibling();                                       // always place last piece on top
        }
        if(transform.parent.gameObject == partsPanel)
            transform.localScale = partsPanelScale;
    }
    #endregion
}

当拖动开始时,防止对象跳到中心点

我从未使用过任何接口来实现这一点,但解决方案应该与使用精灵的OnMouseDown, OnMouseUp和OnMouseDrag相同。用你当前的实现

试试这个
 using UnityEngine;
using System.Collections;
public class Drag : MonoBehaviour {
    private Vector3 offset = Vector3.zero;
    void OnMouseDown () {
        Vector3 worldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        worldPos.z = transform.position.z;
        offset = worldPos - transform.position;
    }

    void OnMouseDrag () {
        Vector3 worldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        worldPos.z = transform.position.z;
        worldPos = worldPos - offset;
        transform.position = worldPos;
    }

    void OnMouseUp () {
        offset = Vector3.zero;
    }
}

我在Sprites上使用了这个方法。希望对你有帮助。

编辑

尝试在您的代码中使用UI元素实现接口。它正在像预期的那样工作。唯一要做的就是将画布设置为ScreenSpace-Camera,在各自的接口

中实现代码

你的问题有点令人困惑,如果我是正确的,你说的是你开始拖动的对象一直移动到屏幕中间,如果你不想要,只要在OnEndDrag中更新被拖动对象的变换