Как сделать масштаб объекта, перетаскивая его мышью? - PullRequest
1 голос
/ 04 июля 2019

Я искал в Google и нигде не смог найти решения.В основном, что я ищу, так это то, что у меня есть объект куба и объект стрелки, и я хотел бы изменить размер объекта куба, перетаскивая объект стрелки с помощью мыши.

Я пробовал почти все частично выполненныерешение, которое я мог найти, но безрезультатно.

private GameObject mainObject;
 private float positionZ = 5.0f;
 public float sizingFactor = 0.03f;
 private float startSize;
 private float startX;
 private float startY;
 private float startZ;

 // Use this for initialization
 void Start()
 {
     mainObject = GameObject.Find("Cube");
 }

 // Use this when user has clicked on object and still holding it
 void OnMouseDrag()
 {

     //When user has left clicked
     if (Input.GetMouseButton(0))
     {
         //Move the blue box by mouse
         Vector3 positionRight = mainObject.transform.position;
         Vector3 mousePosition = new Vector3(Input.mousePosition.x, 
         Input.mousePosition.y, Input.mousePosition.z);
         startX = mousePosition.x;
         startY = mousePosition.y;
         startZ = mousePosition.z;
         Vector3 objPosition = 
         Camera.main.ScreenToWorldPoint(mousePosition);
         //Set the blue box by x axis of mouse and y,z axises of empty- 
         object right one
         transform.position = new Vector3(objPosition.x, objPosition.y, 
         enter code hereobjPosition.z);
         startSize = mainObject.transform.localScale.x;
     }

     if (Input.GetMouseButton(0))
     {
         //Scale green box by blue box
         Vector3 scale = mainObject.transform.localScale;
         scale.x = startSize + (Input.mousePosition.x - startX) * 
         sizingFactor;
         Debug.Log(scale.x);
         scale.y = startSize + (Input.mousePosition.y - startY) * 
         sizingFactor;
         scale.z = startSize + (Input.mousePosition.z - startZ) * 
         sizingFactor;
         Debug.Log(scale.z);
         mainObject.transform.localScale = scale;

     }

 }

 void OnMouseUp()
 {
 }

Это то, что я нашел и попытался изменить, но безрезультатно.Любая помощь будет чрезвычайно признательна.

РЕДАКТИРОВАТЬ:

Vector2 prevMousePosition;
private GameObject mainObject;
public float sizingFactor = 0.03f;
Vector3 minimumScale;

private void Start()
{
    mainObject = GameObject.Find("Cube");
    minimumScale = new Vector3(1.0f, 1.0f, 1.0f);
}

void OnMouseDrag()
{
    Vector2 mousePosition = Input.mousePosition;

    if (Input.GetMouseButton(0))
    {
        transform.position = Camera.main.ScreenToWorldPoint(mousePosition);

        Vector3 scale = mainObject.transform.localScale;
        scale.x = scale.x + (mousePosition.x - prevMousePosition.x) * sizingFactor;
        scale.y = scale.x;
        scale.z = scale.x;
        mainObject.transform.localScale = scale;

        if (scale.x < minimumScale.x)
        {
            mainObject.transform.localScale = minimumScale;
        }
    }

    prevMousePosition = mousePosition;
}

Это теперь будет работать для всех осей.Однако, как представляется, ошибка приводит к тому, что куб масштабируется до 10 по всем 3 осям.

Принимая во внимание, когда код имеет вид: scale.x - (mousePositon.x - prevMousePosition.x) * sizingFactor

Куб работает и масштабируется нормально от 1.0f.

1 Ответ

0 голосов
/ 04 июля 2019

Я думаю, вы на правильном пути - вы просто неправильно поняли цикл обновления. В одном обратном вызове OnMouseDrag ваш код выглядит так, как будто он пытается увидеть разницу между позициями мыши, но они будут иметь одинаковое значение:

Проблема

startX = mousePosition.x;
// [...]
scale.x = startSize + (Input.mousePosition.x - startX) * sizingFactor;

это дает startSize + (x - x) * y, что совпадает с startSize + 0, что, конечно, совпадает с startSize, что означает отсутствие изменений.

Решение

Вам необходимо различать мышиную позицию между кадрами , то есть между OnMouseDrag() обратными вызовами:

Vector2 prevMousePosition;

void OnMouseDrag()
{
    Vector2 mousePosition = Input.mousePosition;

    if (Input.GetMouseButton(0))
    {                
        transform.position = Camera.main.ScreenToWorldPoint(mousePosition);

        Vector3 scale = mainObject.transform.localScale;
        scale.x = scale.x * (mousePosition.x - prevMousePosition.x) * sizingFactor;
        scale.y = scale.y * (mousePosition.y - prevMousePosition.y) * sizingFactor;
        mainObject.transform.localScale = scale;
    }

    prevMousePosition = mousePosition;
}

Так что в основном этот код выполняет 2 вещи:

  1. Установите позицию этого объекта так, чтобы вы удерживали нажатой левую кнопку мыши (я оставил этот код как есть, но уменьшил его до 1 строки кода,
  2. Измените масштаб mainObject, сравнив позицию мыши предыдущего кадра с позицией этого кадра, измененную с помощью sizingFactor.

В вашем коде вы также пытаетесь управлять, когда мышь перемещается по оси Z. Как вы собираетесь перемещать мышь в третьем измерении на 2d плоскости, я не знаю - поэтому я убрал это :)

Я также воспользовался возможностью, чтобы сделать код максимально простым и легким для чтения. Мои извинения, если я удалил что-то, что было необходимо, но я думаю, что большинство строк кода устарели.

Я не пробовал этот код, пожалуйста, дайте мне знать, если он не компилируется или работает должным образом.

...