Как изменить размер UI объекта Unity
Вопрос такой - как менять размер UI панели с помощи мыши(Например как в Windows - взялся за край и начал менять, тягая то вправо, то влево.)?
Пытался сделать так, пускай размеры и менялись, но совсем-совсем не так:
public void SetDirectionSize(string direction) => directionSize = direction;
public void SetSizeApp(GameObject obj)
{
if (directionSize == "leftRight")
{
Vector2 pos = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
obj.GetComponent<RectTransform>().sizeDelta += new Vector2(Camera.main.ScreenToWorldPoint(pos).x, Camera.main.ScreenToWorldPoint(pos).y);
}
}
Объект края(Границы):
Ответы (1 шт):
Автор решения: Yaroslav
→ Ссылка
- UI это не объект сцены, а лейаут поверх рендера камеры, и находится не в
WorldPoint, а RectTransformUtility.ScreenPointToLocalPointInRectangle. - Ты присваиваешь размеру, позицию... думаю даже нет смысла пояснять почему это не работает.
- ВОТ КАК выглядят обработчики
EventTrigger, так-же как у IPointerDownHandler и всего семейства интерфейсов, коими он на самом деле и является. Как аргумент тамPointerEventData, из которого можно узнать ScreenPosition импута! PointEnterэто не место клика и вообще к клику отношения не имеет! ЧИТАЙ документацию!- По X может меняться ничего/правй край/левый край, по Y может меняться ничего/вырхний край/нижний край. X и Y не зависят друг от друга и считаются отдельно, складываясь в результативный Vector2... где это все?
- Зная позицию импута, центра, размеры прямоугольника и школьные уроки математики 3го класса, где мы только слагаем и вычитаем, без деления, умножения и вычисления квадратных корней, не составит труда посчитать что участвует по пункту 5!
- Далее при драг остается только пересчитать новый центр прямоугольника и размеры относительно центра и размеров того, что было до начала резайза, все та-же математика не перешагивающая 3ий класс.
using UnityEngine.EventSystems;
public class RectBorderResize : MonoBehaviour, IBeginDragHandler, IDragHandler
{
private enum BorderX { None, Right, Left }
private enum BorderY { None, Top, Bottom }
[SerializeField] private float _borderDragThickness = 16;
private Vector2 _originalCenter;
private Vector2 _originalSize;
private BorderX _targetBorderX;
private BorderY _targetBorderY;
public void OnBeginDrag (PointerEventData eventData)
{
Vector2 position = GetParentLocalPosition(eventData.position);
UpdateOriginalRectValues();
UpdateTargetBorders();
}
public void OnDrag (PointerEventData data)
{
Vector2 position = GetParentLocalPosition(eventData.position);
RectTransform rect = transform as RectTransform;
rect.anchoredPosition = GetRecalculatedRectPosition(position);
rect.sizeDelta = GetRecalculatedRectSize(position);
}
private void UpdateOriginalRectValues ()
{
RectTransform rect = transform as RectTransform;
_originalCenter = rect.anchoredPosition;
_originalSize = rect.sizeDelta;
}
private void UpdateTargetBorders (Vector2 parentPositionInput)
{
...
_targetBorderX = ...
_targetBorderY = ...
}
private Vector2 GetRecalculatedRectPosition (Vector2 parentPositionInput)
{
...
}
private Vector2 GetRecalculatedRectSize (Vector2 parentPositionInput)
{
...
}
private Vector2 GetParentLocalPosition (Vector2 screenPosition)
{
RectTransform rect = transform.parent as RectTransform;
RectTransformUtility.ScreenPointToLocalPointInRectangle(rect, screenPosition, null, out Vector2 point);
return point;
}
}
