Search Unity

  1. We are migrating the Unity Forums to Unity Discussions. On July 12, the Unity Forums will become read-only. On July 15, Unity Discussions will become read-only until July 18, when the new design and the migrated forum contents will go live. Read our full announcement for more information and let us know if you have any questions.

Question Problema al arrastrar un GameObject con RectTransform en Unity

Discussion in 'UGUI & TextMesh Pro' started by fcojavierojeda7, Dec 29, 2023.

  1. fcojavierojeda7

    fcojavierojeda7

    Joined:
    Oct 31, 2021
    Posts:
    1
    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:

    Code (CSharp):
    1. public class DragBackground : MonoBehaviour, IDragHandler, IEndDragHandler
    2. {
    3.     private Vector2 originalLocalPointerPosition;
    4.     private Vector3 originalPanelLocalPosition;
    5. panel privado RectTransformRectTransform;
    6. privado RectTransform parentRectTransform;
    7.  
    8. void Despierto()
    9.     {
    10. panelRectTransform = transformar como RectTransform;
    11. parentRectTransform = panelRectTransform.parent como RectTransform;
    12.     }
    13.  
    14. public void OnBeginDrag(datos de PointerEventData)
    15.     {
    16.         if (RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTransform, data.position, data.pressEventCamera, out originalLocalPointerPosition))
    17.         {
    18.             originalPanelLocalPosition = panelRectTransform.localPosition;
    19.         }
    20.     }
    21.  
    22. public void OnDrag(datos de PointerEventData)
    23.     {
    24.          if (RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTransform, data.position, data.pressEventCamera, out Vector2 localPointerPosition))
    25.     {
    26.         Vector3 offsetToOriginal = localPointerPosition - originalLocalPointerPosition;
    27.         panelRectTransform.localPosition = originalPanelLocalPosition + offsetToOriginal;
    28.     }
    29.     }
    30.  
    31. Vector3 ClampToWindow(posición Vector3)
    32.     {
    33. Resultado del vector3 = posición;
    34.  
    35.         Vector3 minPosition = parentRectTransform.rect.min - panelRectTransform.rect.min;
    36.         Vector3 maxPosition = parentRectTransform.rect.max - panelRectTransform.rect.max;
    37.  
    38. resultado.x = Mathf.Clamp(posición.x, minPosición.x, maxPosición.x);
    39.         result.y = Mathf.Clamp(position.y, minPosition.y, maxPosition.y);
    40.  
    41. resultado devuelto;
    42.     }
    43. }[/código]
     
    Last edited: Dec 30, 2023
  2. sildeflask

    sildeflask

    Joined:
    Aug 16, 2023
    Posts:
    329
    esto no es stack overflow
     
    Kurt-Dekker likes this.
  3. MelvMay

    MelvMay

    Unity Technologies

    Joined:
    May 24, 2013
    Posts:
    11,761
    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.