Unity 2D鼠标缩放,但放大鼠标点的位置

时间:2017-11-09 13:56:37

标签: c# unity3d zoom mouse

编辑:我需要一个2D实现的答案,而不是3D。所以'Asked Before'问题对我的项目不起作用。

编辑:使用下面接受的答案,这是我的工作脚本。稍微偏离,因为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游戏(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;

  }
}

2 个答案:

答案 0 :(得分:3)

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

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值。

希望这有帮助。

答案 1 :(得分: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;
     }

Camera cam = GetComponent();

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

  }
}