在 Unity 中放大和缩小

Zoom In & Zoom Out in Unity

所以,大家好。我是 Unity 的新手,我正在尝试一个非常简单的代码,允许玩家放大和缩小。这是它的代码:

[Header("Vertical Zooming")]
[SerializeField] private float zoomSpeed;

private void Update()
{
    VerticalZooming();
}

private void VerticalZooming()
{
    Vector3 initialPosition = new Vector3();
    // bool canMove = false;

    if (Input.GetMouseButtonDown(0))
    {
        initialPosition = mCamRef.ScreenToViewportPoint(Input.mousePosition);
        Debug.Log(initialPosition.y);
       
    }

    if (Input.GetMouseButton(0))
    {
        Vector3 newPosition = mCamRef.ScreenToViewportPoint(Input.mousePosition);
        Debug.Log("newPosition" + newPosition.y);

        if (newPosition.y < initialPosition.y)
        {    
            Zoom((zoomSpeed * Time.deltaTime) * -1f);
        }
        if (newPosition.y > initialPosition.y)
        {
            Zoom(zoomSpeed * Time.deltaTime);
        }

       intialPosition = newPosition;
    }
}

private void Zoom(float inZoomSpeed)
{
    transform.Translate(mCamRef.transform.position.z * inZoomSpeed * transform.forward);
}

所以,如果你看到上面的代码。在 mousebuttondown 上,我们记下初始位置,在按住鼠标按钮时,我们不断跟踪新位置。我想要的很简单。关于我最初的鼠标点击,我正在检查我的新位置是否在 y 中更大,是的,我需要缩小。如果新位置低于 y 轴的初始位置。他们,我需要放大。我做了,但由于某种原因它不起作用。 这里有两个问题:

  1. 虽然如果 newposition 没有变化,即即使我的 newposition 变量和初始位置变量都在同一个位置,我的相机移动(在我的情况下是缩小)不应该发生。只有当我的 newPosition.y 变量大于 initialposition.y 的变量时才会发生这种情况。我无法弄清楚为什么会这样。我尝试使用 bool 条件来执行此操作,但失败了。
  2. 如果我在我的手机上玩测试这个..它只会在一个方向上进行。在我的例子中,它只是在满足我的放大条件的情况下不断缩小。但是在统一游戏中进行游戏测试时 window。当我的鼠标离开游戏屏幕时,放大功能起作用。因为它只能在游戏外工作 screen.This 是它不能在移动设备上工作的原因,因为没有 space 外部移动显示。我不知道为什么会这样,也不知道如何克服。

告诉我为什么!我坚持了很长时间,没有任何想法。谢谢 <3

如果有任何疑问,请告诉我。对不起,一个巨大的解释。只是想在这个问题上非常精确。 我见过有人建议通过使用 FOV 来放大缩小。但我想使用平移或移动相机本身来做到这一点。

所以您的问题在于计算 screenToViewPort 点。 而不是试试这个..


if (Input.GetMouseButtonDown(0))
{
     mInitialPosition = Input.mousePosition.y;
}
            
if (Input.GetMouseButton(0))
{
     mChangedPosition = Input.mousePosition.y;

     if (mChangedPosition == mInitialPosition)
     {
         return;
     }
     if (mChangedPosition < mInitialPosition)
     {
         Zoom((mZoomSpeed * -1f) * Time.deltaTime);
     }
     if (mChangedPosition > mInitialPosition)
     {
         Zoom(mZoomSpeed * Time.deltaTime);
     }
}
      
private void Zoom(float inZoomSpeed)
{
    transform.Translate(mCamRef.transform.position.z * inZoomSpeed * transform.forward);
}

不确定 ScreenToViewport 点是如何工作的......但我想这段代码应该为你带来魔力......在这里我直接点击并按住 mouse.y 值并做了与您执行的功能相同,并告诉它在 y 值相同且 return 函数时不要执行任何操作...所以这意味着您的代码本身已经包含了所有内容...祝您有美好的一天