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]