Изменение размера объекта, сохранение переменной и изменение размера от предыдущего размера в Unity C# - PullRequest
0 голосов
/ 30 января 2020

Итак, я написал скрипт для изменения размера объекта, щелкнув по нему и перетащив его.

Проблема, с которой я столкнулся, заключается в том, что когда я прекращаю перетаскивать объект и снова щелкаю по объекту, он возвращается к своему объекту. начальный размер. Я понимаю, что мне нужно сохранить размер, к которому он был ранее изменен, и «начать с этого размера», но я изо всех сил пытаюсь обойти эту логику c.

I Я думаю, что я должен добавить bool hasBeenDragged, который будет выполнен, если переменная amountDragged != 0 onMouseUp ... и сказать в функции обновления, если hasBeenDragged = true && dragging = true - тогда это бит, который я борясь с.

Мне нужно, чтобы он также вычислил amountDragged на основе предыдущей суммы, но я не могу понять, как написать это ..

Любая помощь с логикой c будет признателен, спасибо заранее.

Вот мой сценарий:

public class DragScalingScript : MonoBehaviour
{
    public bool dragging = false;
    public Vector3 currentMousePosition;
    public Vector3 dragStartingPoint;
    public Vector3 temp;
    public float amountDragged;
    private float clampedAmountDragged;

    private void Awake()
    {
        amountDragged = 100.0f;
    }

    // where ever the object is clicked becomes dragStartingPoint
    private void OnMouseDown()
    {
        dragStartingPoint = (Input.mousePosition);
    }

    // if object is dragged, dragging becomes true
    //where ever the position of the mouse drag goes is tracked and stored as currentMousePosition
    private void OnMouseDrag()
    {
        dragging = true;
        currentMousePosition = (Input.mousePosition);
    }

    // when mouse button is released, dragging becomes false
    private void OnMouseUp()
    {
        dragging = false;
    }

    // when dragging:
    private void Update()
    {
        if (dragging == true)
        {
            //find the distance between the dragStartingPoint and currentMousePosition and store in amountDragged variable
            amountDragged = Vector3.Distance(currentMousePosition, 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;
        }
    }
}

1 Ответ

0 голосов
/ 30 января 2020

Не совсем уверен в точном расчете, но в OnMouseDown дополнительно сохраните текущую шкалу, как

private Vector3 startScale;

private void OnMouseDown()
{
    dragStartingPoint = Input.mousePosition;

    startScale = transform.localScale;
}

, а затем умножьте на это значение при масштабировании, используя Vector3.Scale

// No need to get the current localScale here as this is a scale factor now
temp = new Vector3(amountDragged / 100f, amountDragged / 100f, 1);

// Vector3.Scale multiplies both vectors component wise
transform.localScale = Vector3.Scale(temp, startScale);
// Basically the same as
//transform.localScale = new Vector3(temp.x * startScale.x, temp.y * startScale.y, temp.z * startScale.z);

В общем, вы go немного избыточны здесь. Я бы вообще не использовал Update, а просто выполнял бы всю работу в OnMouseDrag, не используя флаг dragging, так как amyway

OnMouseDrag вызывается каждый кадр, когда мышь нажата.

, поэтому просто введите код здесь

// This gets called while dragging the mouse 
private void OnMouseDrag()
{
    currentMousePosition = Input.mousePosition;

    //find the distance between the dragStartingPoint and currentMousePosition and store in amountDragged variable
    amountDragged = Vector3.Distance(currentMousePosition, 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;

    var temp = new Vector3(amountDragged / 100f, amountDragged / 100f, 1);

    //make scale of object equal to temp variable
    transform.localScale = Vector3.Scale(temp, startScale);
}

Также обратите внимание, что в настоящее время это позволяет только масштабировать объект больше. Невозможно вернуть;)


Набрано на телефоне, но я надеюсь, что идея проясняется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...