Есть круг (сфера). Я хочу, чтобы игрок мог щелкнуть его и перетащить наружу, чтобы увеличить, или перетащить внутрь. чтобы сделать его меньше. Раньше я масштабировал объект на основе начальной точки перетаскивания, но это не давало мне возможности снова масштабировать фигуру... только увеличивать ее. Я решил, что мне нужно рассчитать, следует ли нам увеличивать или уменьшать масштаб, основываясь на направлении перетаскивания относительно центра фигуры. Чтобы разобраться в этом, нам нужно проверить положение мыши, при перетаскивании сравнить его с предыдущим кадром и решить, находимся ли мы ближе или дальше от центра. Если мы ближе, то мы тянем внутрь и нам следует масштабировать объект (уменьшить его). Если мы находимся дальше, то мы движемся наружу и должны увеличиваться (увеличивать). У меня есть пара проблем. Кажется, я вообще не могу уменьшить круг. Определение направления перетаскивания кажется ошибочным, поскольку кажется, что мой логический параметр для isDragingOut в основном всегда верен, я не могу понять, почему. Другая проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я нажимаю на кружок, он возвращается к исходному размеру.
Я пытаюсь выполнить следующие шаги в своем коде :
- При перетаскивании мышью: проверьте текущее положение мыши.
- проверьте расстояние до предыдущей позиции. положение мыши
- проверить расстояние до текущей позиции
- определить, перетаскивает ли игрок внутрь или наружу. Если текущее расстояние больше, чем расстояние в предыдущем кадре, мы проводим перетаскивание.
- Если это правда, то вычисляем расстояние между начальной точкой перетаскивания и текущим положением мыши, и соответствующим образом масштабируем
- Если расстояние меньше предыдущего кадра, значит, мы перетаскиваем
- затем рассчитаем расстояние между начальной точкой перетаскивания и текущую позицию мыши и соответствующим образом масштабировать (здесь я попытался применить обратный расчет расчета масштабирования — это может быть неправильно)
- Последнее, что я делаю в своем коде, это сделать текущую позицию равной переменной previousPosition, чтобы ее можно было сравнить в следующем кадре.
{
public Vector3 temp;
public Vector3 dragStartingPoint;
public Vector3 centreOfShape;
public Vector3 currentDragPosition;
public Vector3 previousDragPosition;
public bool isDraggingOut;
public float previousDistance;
public float currentDistance;
public float amountDragged;
public float clampedAmountDragged;
private void Awake()
{
centreOfShape = transform.position;
}
private void OnMouseDown()
{
dragStartingPoint = Input.mousePosition;
}
private void OnMouseDrag()
{
//check where current position is
currentDragPosition = (Input.mousePosition);
//check distance of previous position
previousDistance = Vector3.Distance(previousDragPosition, centreOfShape);
//check distance of current position
currentDistance = Vector3.Distance(currentDragPosition, centreOfShape);
//determine whether player is dragging in or out. If current distance is
// more than the distance in the previous frame, we are dragging out
if (currentDistance > previousDistance)
{
isDraggingOut = true;
}
else
{
isDraggingOut = false;
}
if (isDraggingOut == true)
{
amountDragged = Vector3.Distance(currentDragPosition, dragStartingPoint);
// set minimum and maximum drag amount and store in clampedAmountDragged variable
clampedAmountDragged = Mathf.Clamp(amountDragged, 100f, 300f);
// set amountDragged to clampedAmount to apply minimum and maximum
amountDragged = clampedAmountDragged;
temp = transform.localScale;
temp.x = amountDragged / 100;
temp.y = amountDragged / 100;
//make scale of object equal to temp variable
transform.localScale = temp;
}
// else we are dragging in
else if (isDraggingOut == false)
{
amountDragged = Vector3.Distance(currentDragPosition, dragStartingPoint);
// set minimum and maximum drag amount and store in clampedAmountDragged variable
clampedAmountDragged = Mathf.Clamp(amountDragged, 100f, 300f);
// set amountDragged to clampedAmount to apply minimum and maximum
amountDragged = clampedAmountDragged;
amountDragged = amountDragged - 300;
amountDragged = Mathf.Abs(amountDragged);
temp = transform.localScale;
temp.x = amountDragged / 100;
temp.y = amountDragged / 100;
//make scale of object equal to temp variable
transform.localScale = temp;
}
currentDragPosition = previousDragPosition;
}
}```
Подробнее здесь: https://stackoverflow.com/questions/600 ... g-in-unity