unity 3D 实现场景旋转、平移、缩放

本文介绍Unity中的鼠标拖拽、滚轮缩放及键盘旋转控制相机移动的完整脚本实现,包括坐标计算、方向判断与摄像机参数调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提将脚本挂载到Camera上

拖拽的原理 :点击左键记录坐标P1,滑动记录当前坐标P2

                      计算P1、P2的坐标差dx、dy,

                     根据dx和dy正负确定移动方向

缩放原理:根据滚轮控制摄像机视野和摄像机的正交投影

旋转原理:鼠标右键不太好控制,于是指定了键盘

                 就是直接给旋转赋值

 

 

完整代码如下:

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

public class MouseMoveandScale : MonoBehaviour
{
    Vector2 p1, p2,p3,p4;//用来记录鼠标的位置,以便计算移动距离
    void Start () {  
 
    }  
    void Update () {

        translationDrag();
        zoom();
        rotate();

    }

    private void translationDrag()
    {
        //通过鼠标X坐标拖动场景
        if (Input.GetMouseButtonDown(0))
        {
            //鼠标左键按下时记录鼠标位置p1 
            p1 = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
        }
        if (Input.GetMouseButton(0))
        {
            //鼠标左键拖动时记录鼠标位置p2   
            p2 = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
            float dx = (float)0.8 * (p2.x - p1.x);
            float dy = (float)0.8 * (p2.y - p1.y);
            //鼠标左右移动  
            if (dx >= 0)
            {
                transform.Translate(-dx * Vector3.right * Time.deltaTime);
            }
            else
            {
                transform.Translate(dx * Vector3.left * Time.deltaTime);
            }
             //上下 移动
            if (dy >= 0)
            {
                transform.Translate(dy * Vector3.down * Time.deltaTime);
            }
            else
            {
                transform.Translate(-dy * Vector3.up * Time.deltaTime);
            }


        }
    }

    private void zoom() 
    {
        //通过鼠标滚轮实现场景缩放
        //鼠标滚轮的效果
        //Camera.main.fieldOfView 摄像机的视野
        //Camera.main.orthographicSize 摄像机的正交投影
        //Zoom out
        if (Input.GetAxis("Mouse ScrollWheel") < 0)
        {
            if (Camera.main.fieldOfView <= 100)
                Camera.main.fieldOfView += 2;
            if (Camera.main.orthographicSize <= 20)
                Camera.main.orthographicSize += 0.5F;
        }
        //Zoom in
        if (Input.GetAxis("Mouse ScrollWheel") > 0)
        {
            if (Camera.main.fieldOfView > 2)
                Camera.main.fieldOfView -= 2;
            if (Camera.main.orthographicSize >= 1)
                Camera.main.orthographicSize -= 0.5F;
        }
    }
    private void rotate() 
    {
        if (Input.GetKey(KeyCode.C))
        {
            transform.Rotate(0, 0, -25 * Time.deltaTime, Space.Self);
        }
        if (Input.GetKey(KeyCode.Z))
        {
            transform.Rotate(0, 0, 25 * Time.deltaTime, Space.Self);
        }


        //通过鼠标X坐标拖动场景
        if (Input.GetMouseButtonDown(1))
        {
            //鼠标左键按下时记录鼠标位置p1 
            p3 = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
        }
        if (Input.GetMouseButton(1))
        {
            //鼠标左键拖动时记录鼠标位置p2   
            p4 = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
            float dx = (float)0.8 * (p4.x - p3.x);
            float dy = (float)0.8 * (p4.y - p3.y);


            if (dx >= 0)
            {
                transform.Rotate(0, 0, -25 * Time.deltaTime, Space.Self);
            }
            else
            {
                transform.Rotate(0, 0, 25 * Time.deltaTime, Space.Self);
            }
            //上下 移动
            if (dy >= 0)
            {
                transform.Rotate(0, 0, -25 * Time.deltaTime, Space.Self);
            }
            else
            {
                transform.Rotate(0, 0, 25 * Time.deltaTime, Space.Self);
            }

        }
    }


}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大不懂

码字不易,一块也是爱,么么

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值