Unity摄像机以鼠标点进行缩放

我希望在Unity里实现,当三维场景运行的时候,可以通过鼠标进行摄像机的缩放、旋转、平移功能。网上虽然有很多的脚本,但是都不是以当前鼠标的位置作为中心点来进行这些操作的,我希望可以实现以下功能:
1)滑动鼠标滚轮,以当前鼠标所在的位置作为基准点进行视图的缩放
2)按下鼠标左键拖拽,以当前鼠标所在的位置作为基准点进行视图的旋转
3)按下鼠标左键中键,以当前鼠标所在的位置作为基准点进行视图的平移。
有没有会的帮忙实现一下,代码完整一些,麻烦认真看一下需求谢谢。

要实现在Unity中通过鼠标进行摄像机的缩放、旋转和平移功能,并且以当前鼠标位置作为中心点,你可以创建一个自定义脚本并将其附加到摄像机对象上。以下是一个基本的脚本示例,实现了你所描述的功能:

using UnityEngine;

public class CameraController : MonoBehaviour
{
    public float zoomSpeed = 5f;
    public float rotateSpeed = 5f;
    public float panSpeed = 0.1f;

    private Vector3 lastMousePosition;

    void Update()
    {
        // 视图缩放
        float scrollDelta = Input.GetAxis("Mouse ScrollWheel");
        ZoomCamera(scrollDelta);

        // 视图旋转
        if (Input.GetMouseButtonDown(0)) // 0: Left Mouse Button
        {
            lastMousePosition = Input.mousePosition;
        }
        else if (Input.GetMouseButton(0))
        {
            RotateCamera(Input.mousePosition);
        }

        // 视图平移
        if (Input.GetMouseButtonDown(2)) // 2: Middle Mouse Button
        {
            lastMousePosition = Input.mousePosition;
        }
        else if (Input.GetMouseButton(2))
        {
            PanCamera(Input.mousePosition);
        }
    }

    void ZoomCamera(float delta)
    {
        Vector3 zoomVector = transform.forward * delta * zoomSpeed;
        transform.position += zoomVector;
    }

    void RotateCamera(Vector3 newMousePosition)
    {
        Vector3 mouseDelta = newMousePosition - lastMousePosition;
        Vector3 rotateVector = new Vector3(-mouseDelta.y, mouseDelta.x, 0f) * rotateSpeed;

        transform.Rotate(rotateVector, Space.World);

        lastMousePosition = newMousePosition;
    }

    void PanCamera(Vector3 newMousePosition)
    {
        Vector3 mouseDelta = newMousePosition - lastMousePosition;
        Vector3 panVector = new Vector3(-mouseDelta.x, -mouseDelta.y, 0f) * panSpeed;

        transform.Translate(panVector, Space.Self);

        lastMousePosition = newMousePosition;
    }
}

将这个脚本附加到你的摄像机对象上,然后根据需要调整zoomSpeedrotateSpeedpanSpeed这些参数来控制缩放、旋转和平移的速度。

请注意,这只是一个基本示例,可能还有其他细节和功能可以添加,比如边界限制等。你可以根据自己的需求对脚本进行扩展和修改。


望采纳。

缩放 、旋转、平移大致代码如下:


/ /缩放  
        if (Input.GetAxis("Mouse ScrollWheel") != 0)  
        {  
            Vector3 direction = new Vector3(Input.GetAxis("Mouse ScrollWheel"), 0, 0);  
            transform.localScale += direction * zoomSpeed;  
        }  
  
        // 旋转  
        if (Input.GetMouseButtonDown(0))  
        {  
            Vector3 rotationDelta = new Vector3(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"), 0);  
            rotationDelta *= rotateSpeed * Time.deltaTime;  
            transform.Rotate(rotationDelta);  
        }  
  
        // 平移  
        if (Input.GetMouseButton(2)) // 中键按下  
        {  
            Vector3 movement = new Vector3(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"), 0);  
            movement *= moveSpeed * Time.deltaTime;  
            camera.transform.position += movement;  
        }  

代码思路如下:通过检测鼠标输入来实现摄像机的缩放、旋转和平移功能,其中缩放根据鼠标滚轮输入改变摄像机的正交大小,旋转根据鼠标左键拖拽的水平移动改变摄像机的旋转角度,平移根据鼠标左键中键拖拽的水平和垂直移动改变摄像机的位置
需要详细代码回复我,截图

img

要在Unity中实现通过鼠标进行摄像机的缩放、旋转和平移功能,并以当前鼠标位置作为基准点,可以使用以下步骤:

  1. 缩放功能:

    • 在摄像机上添加一个脚本,用于控制缩放操作。
    • 在脚本中使用Input.GetAxis("Mouse ScrollWheel")来获取鼠标滚轮的滑动值。
    • 使用Camera.ScreenToWorldPoint(Input.mousePosition)将当前鼠标位置转换为世界坐标。
    • 将摄像机的位置设置为以当前鼠标位置为基准点进行缩放。
  2. 旋转功能:

    • 在摄像机上添加一个脚本,用于控制旋转操作。
    • 在脚本中使用Input.GetMouseButton(0)来检测是否按下了鼠标左键。
    • 使用Input.GetAxis("Mouse X")Input.GetAxis("Mouse Y")来获取鼠标在X和Y轴上的移动值。
    • 根据鼠标移动值调整摄像机的旋转角度,并以当前鼠标位置为基准点进行旋转。
  3. 平移功能:

    • 在摄像机上添加一个脚本,用于控制平移操作。
    • 在脚本中使用Input.GetMouseButton(2)来检测是否按下了鼠标中键。
    • 使用Input.GetAxis("Mouse X")Input.GetAxis("Mouse Y")来获取鼠标在X和Y轴上的移动值。
    • 将摄像机的位置根据鼠标移动值进行平移,并以当前鼠标位置为基准点进行平移。

你自己也可以的,原理非常简单,计算鼠标偏移量映射到相机上,这就是平移
旋转缩放的话就没啥好说的了,网上一抓一大把
实在不行的话GPT一下,让他帮你写


using UnityEngine;
public class CameraController : MonoBehaviour
{
    private float rotationSpeed = 5f;  // 旋转速度
    private float zoomSpeed = 5f;      // 缩放速度
    private float panSpeed = 0.1f;     // 平移速度
    void Update()
    {
        // 获取鼠标滚轮的滚动值
        float scroll = Input.GetAxis("Mouse ScrollWheel");
        // 鼠标右键按下时,进行旋转
        if (Input.GetMouseButton(1))
        {
            float rotationX = Input.GetAxis("Mouse X") * rotationSpeed;
            float rotationY = Input.GetAxis("Mouse Y") * rotationSpeed;
            // 围绕世界坐标系的Y轴进行旋转
            transform.Rotate(Vector3.up, -rotationX, Space.World);
            // 围绕局部坐标系的X轴进行旋转
            transform.Rotate(Vector3.right, rotationY, Space.Self);
        }
        // 鼠标中键按下时,进行平移
        if (Input.GetMouseButton(2))
        {
            float panX = -Input.GetAxis("Mouse X") * panSpeed;
            float panY = -Input.GetAxis("Mouse Y") * panSpeed;
            // 平移摄像机位置
            transform.Translate(new Vector3(panX, panY, 0));
        }
        // 滚轮滚动时,进行缩放
        if (scroll != 0)
        {
            // 缩放摄像机的位置
            transform.Translate(0, 0, scroll * zoomSpeed, Space.Self);
        }
    }
}

挂载在摄像机上