Масштабирование 2D-игрового объекта с помощью перетаскивания мышью в UnityC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Масштабирование 2D-игрового объекта с помощью перетаскивания мышью в Unity

Сообщение Anonymous »

У меня было несколько попыток и публикаций на эту тему, но они все еще не увенчались успехом. Я хочу следующее поведение:

Есть круг (сфера). Я хочу, чтобы игрок мог щелкнуть его и перетащить наружу, чтобы увеличить, или перетащить внутрь. чтобы сделать его меньше. Раньше я масштабировал объект на основе начальной точки перетаскивания, но это не давало мне возможности снова масштабировать фигуру... только увеличивать ее. Я решил, что мне нужно рассчитать, следует ли нам увеличивать или уменьшать масштаб, основываясь на направлении перетаскивания относительно центра фигуры. Чтобы разобраться в этом, нам нужно проверить положение мыши, при перетаскивании сравнить его с предыдущим кадром и решить, находимся ли мы ближе или дальше от центра. Если мы ближе, то мы тянем внутрь и нам следует масштабировать объект (уменьшить его). Если мы находимся дальше, то мы движемся наружу и должны увеличиваться (увеличивать). У меня есть пара проблем. Кажется, я вообще не могу уменьшить круг. Определение направления перетаскивания кажется ошибочным, поскольку кажется, что мой логический параметр для 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»