如何通过用鼠标拖动来缩放对象?

How do I make an object scale by dragging it with a mouse?

我一直在搜索整个 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;
}

这现在适用于所有轴。但是,似乎有一个错误导致立方体在所有 3 个轴上放大到 10。

而当代码为:scale.x - (mousePositon.x - prevMousePosition.x) * sizingFactor

立方体从 1.0f 开始正常工作和缩放。

我认为您走在正确的轨道上 - 您只是稍微误解了更新循环。在一个 OnMouseDrag 回调中,您的代码看起来像是在尝试查看鼠标位置之间的差异,但它们的值相同:

问题

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

这会产生 startSize + (x - x) * y,与 startSize + 0 相同,当然与 startSize 相同,意思是没有变化。

解决方案

你需要在帧之间区分mousePosition,意思是在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;
}

基本上,这段代码做了两件事:

  1. 将此对象的位置设置为您按住左键单击的位置(我保留了原来的代码,但将其减少为 1 行代码,
  2. 通过比较前一帧的 mousePosition 与本帧的位置来改变 mainObject 的比例,由 sizingFactor 修改。

在您的代码中,您还试图管理鼠标在 z 轴上移动的时间。我不知道你打算如何在三维平面上移动鼠标,我不知道 - 所以我删除了它:)

我也借此机会使代码尽可能简单易读。如果我删除了一些需要的东西,我深表歉意,但我认为大部分代码行都已过时。

我没有尝试过这段代码,如果它没有按预期编译或工作,请告诉我。