Problema al arrastrar un GameObject con RectTransform en Unity

Hola, Estoy trabajando en un proyecto de Unity donde tengo un mapa de juego en un entorno 2D. El mapa está compuesto por varios GameObjects que forman el fondo y están contenidos dentro de un Canvas. Estoy intentando implementar una funcionalidad que permita a los usuarios arrastrar el fondo para explorar diferentes áreas del mapa. Sin embargo, estoy enfrentando un problema: cuando comienzo a arrastrar el fondo, la esquina inferior izquierda del Canvas se alinea con la esquina inferior izquierda de la pantalla, y el fondo se bloquea en esa posición, sin permitir más movimientos.

La estructura de los GameObjects en la Hierarchy es la siguiente: Canvas (Padre de CampaingMap) - CampaingMap (Empty Gameobject, padre de Background) - Background (Con el script DragBackground y padre del resto de gameobjects) BackgroundStellar, BackgroundPurple, Otros botones y elementos de ui.

He implementado el arrastre usando los interfaces ‘IDragHandler’ y ‘IBeginDragHandler’ de Unity. Aquí está el código que estoy utilizando:

public class DragBackground : MonoBehaviour, IDragHandler, IEndDragHandler
{
    private Vector2 originalLocalPointerPosition;
    private Vector3 originalPanelLocalPosition;
panel privado RectTransformRectTransform;
privado RectTransform parentRectTransform;

void Despierto()
    {
panelRectTransform = transformar como RectTransform;
parentRectTransform = panelRectTransform.parent como RectTransform;
    }

public void OnBeginDrag(datos de PointerEventData)
    {
        if (RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTransform, data.position, data.pressEventCamera, out originalLocalPointerPosition))
        {
            originalPanelLocalPosition = panelRectTransform.localPosition;
        }
    }

public void OnDrag(datos de PointerEventData)
    {
         if (RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTransform, data.position, data.pressEventCamera, out Vector2 localPointerPosition))
    {
        Vector3 offsetToOriginal = localPointerPosition - originalLocalPointerPosition;
        panelRectTransform.localPosition = originalPanelLocalPosition + offsetToOriginal;
    }
    }

Vector3 ClampToWindow(posición Vector3)
    {
Resultado del vector3 = posición;

        Vector3 minPosition = parentRectTransform.rect.min - panelRectTransform.rect.min;
        Vector3 maxPosition = parentRectTransform.rect.max - panelRectTransform.rect.max;

resultado.x = Mathf.Clamp(posición.x, minPosición.x, maxPosición.x);
        result.y = Mathf.Clamp(position.y, minPosition.y, maxPosition.y);

resultado devuelto;
    }
}[/código]

esto no es stack overflow

1 Like

Please look at the available feature forums before posting; this is not the UGUI forum. Please use that forum for questions about it.

I’ll move your thread for you.

Thanks.