【问题标题】:Unity 2D Mouse Zoom, but zoom in to location of mouse pointUnity 2D鼠标缩放,但放大到鼠标点的位置
【发布时间】:2017-11-09 13:56:37
【问题描述】:

编辑:我需要 2D 实现的答案,而不是 3D。所以“之前询问”的问题不适用于我的项目。

编辑:使用下面接受的答案,这是我的工作脚本。它有点偏离,因为 Vector3 的 0.1F 部分很难正确处理,但它可以工作。不过 Time.deltaTime 不起作用。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraZoom : MonoBehaviour
{

private float zoom = 10;
Vector3 newPosition;

void Update()
{
    if (Input.GetAxis("Mouse ScrollWheel") > 0 && zoom > 9)
    {
        zoom -= 1;
        Camera.main.orthographicSize = zoom;
        newPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        transform.position = Vector3.Lerp(transform.position, newPosition, 0.1F);
    }

    if (Input.GetAxis("Mouse ScrollWheel") < 0 && zoom < 101)
    {
        zoom += 1;
        Camera.main.orthographicSize = zoom;
    }

}

}

原始问题:我有一个用于放大和缩小的基本脚本,但是当我用鼠标滚轮放大时,我想放大到鼠标光标所在的位置。我认为您可以在 Paradox Games(EU4 等)中看到类似的东西,您可以在其中缩小,将鼠标悬停在屏幕左侧的一个国家/地区上,然后放大,该国家/地区会放大并居中。

到目前为止,这是我的基本脚本,附在我的相机上,它只是以直线放大和缩小。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraZoom : MonoBehaviour {

public float zoom = 10F;

void Update () {
    if (Input.GetAxis("Mouse ScrollWheel") > 0 && zoom > 9)
    {
        zoom -= 1;
    }

    if (Input.GetAxis("Mouse ScrollWheel") < 0 && zoom < 101)
    {
        zoom += 1;
    }

    GetComponent<Camera>().orthographicSize = zoom;

  }
}

【问题讨论】:

  • “之前询问”答案的问题在于它是用于 3D 实现的,我需要 2D。它通过转换相机的位置来工作(我认为),但我认为我需要对 2D 的“正交尺寸”做一些事情。
  • 没有标记为重复,但重复也应该可以正常工作
  • 它没有。事实上,副本根本没有做任何事情,因为它移动了相机变换,我相信这在 2D 中没有任何作用。 2D 版本需要更改相机的正交尺寸。我的解决方案还可以,但并不完美。假设人们来这里寻找相同的解决方案,则不应将重复项标记为正确答案,因为它根本不起作用。
  • 好的。请注意,我没有将其标记为重复,但由于该副本不适合您,因此我重新打开了它。
  • 镜头随着 Umair 的回答不断漂移。我希望它仅在鼠标滚轮滚动时放大,否则我不希望视图跟随鼠标,它正在这样做。此外,它实际上并没有正确缩放到该点,但是将 Time.deltaTime 更改为 0.1F 给出了合理的结果。不过没关系,我现在得到的结果是可以接受的,我已经将他添加为最佳答案并将我的新脚本放在上面。

标签: c# unity3d zooming mouse


【解决方案1】:

我自己没有尝试过,但我希望这会奏效。

Vector3 newPosition;
bool canZoom;
bool isMoving;

void Update () 
{
    if (Input.GetAxis("Mouse ScrollWheel") > 0 && zoom > 9)
    {
        zoom -= 1;
        canZoom = true;
    }

    if (Input.GetAxis("Mouse ScrollWheel") < 0 && zoom < 101)
    {
        zoom += 1;
        canZoom = true;
    }

     if (canZoom) 
     {
        isMoving = true;
        Camera.main.orthographicSize = zoom;
        newPosition = Camera.main.ScreenToWorldPoint (Input.mousePosition);
     }
     if (isMoving)
     {
        transform.position = Vector3.Lerp (transform.position,  newPosition, Time.deltaTime);
     }

     if(transform.position == newPosition)
     {
         isMoving = false;
     }

}

注意:如果您希望相机保持一定的相机高度,请在移动前调整 newPosision 的 y 值。

希望这会有所帮助。

【讨论】:

  • 数学似乎是正确的,它似乎工作,唯一的问题是一旦你开始滚动,它会永久滚动并且难以控制。我正在尝试修复它,但我认为基本想法是正确的。
  • 这是为了让你进入正轨。请接受答案。祝你好运
【解决方案2】:

计算世界空间的差异并在缩放时向其移动。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraZoom : MonoBehaviour {

public float zoom = 10F;

void Update () {
    if (Input.GetAxis("Mouse ScrollWheel") > 0 && zoom > 9)
    {
        zoom -= 1;
    }

    if (Input.GetAxis("Mouse ScrollWheel") < 0 && zoom < 101)
    {
        zoom += 1;
    }

     Camera cam = GetComponent<Camera>();
     RaycastHit hit;
     Ray ray = cam.ScreenPointToRay(Input.mousePosition);
     Vector3 targetPos;

     if (Physics.Raycast(ray , out hit))
     {
        targetPos = hit.point;
     }

相机cam = GetComponent();

    cam.orthographicSize = zoom;
    cam.transform.position += (targetPos - transform.position) / 5f;

  }
}

【讨论】:

  • 我是 Unity 新手,遇到一些错误。我认为“Camera Cam”的第二次使用只需要删除,因为它已经被声明了。但是我在“targetPos”的最后一行出现错误,它说“使用未分配的局部变量 targetPos”。我不明白它是如何未分配的,因为它刚刚在上面分配了......
  • 正确,我更新了答案。每当光线投射不会命中时,都不会分配“targetPos”。您可以将最后一行放在 if 块内。但是尝试 Debug.Log 在 else 部分,看看你没有碰到什么东西。鼠标需要使用对撞机悬停在对象上才能进行光线投射。你有地形吗?
猜你喜欢
  • 2020-01-13
  • 2020-05-28
  • 1970-01-01
  • 2013-03-26
  • 2015-04-20
  • 2020-03-16
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多