unity围绕物体旋转、缩放、移动

unity围绕物体旋转、缩放、移动

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意三个物体的位置!!!

using System;
using UnityEngine;
using UnityEngine.EventSystems;

public class Obj_Rotation : MonoBehaviour
{
    [Header("摄像机父物体位置信息")]
    public Transform camPrent_tranasform;
    [Header("摄像机位置信息")]
    public Transform cam_transform;
    [Header("旋转参数")]
    public Camera_Rotation_Parameter rotation_Parameter;
    [Header("缩放参数")]
    public Camera_Zoom_Parameter zoom_parameter;
    [Header("拖拽参数")]
    public Camera_Drag_Parameter drag_parameter;
    [Header("鼠标在UI上是否能操作")]
    public bool isUI;
    //旋转参数
    float rotatedAngleX, rotatedAngleY; //预设角度(当前角度加上将要增加/减少的角度)

    //缩放参数
    private float cameraDistance;//摄像机的初始位置z轴
    private float targetCameraDistance;//目标摄像机距离

    //拖拽参数
    float delta_x, delta_y;
    Quaternion Drag_rotation;

    //重置参数
    private Vector3 cam_pos;
    private Vector3 camParent_pos;
    private Quaternion camParent_rot;

    public float zoom_Min = 5;
    public float zoom_Max = 30;
    void Start()
    {
       // camPrent_tranasform = transform.GetChild(0).transform;
       // cam_transform = transform.GetComponentInChildren<Camera>().gameObject.transform;

        cameraDistance = cam_transform.localPosition.z;
        targetCameraDistance = cameraDistance;

        rotation_Parameter = new Camera_Rotation_Parameter(true, 0f, 80f, false, 80f, -80f, 5f);
        zoom_parameter = new Camera_Zoom_Parameter(5, 30, 1, 1);
        drag_parameter = new Camera_Drag_Parameter(true, 0.5f);

        zoom_parameter.minDistance = zoom_Min;
        zoom_parameter.maxDistance = zoom_Max;

        cam_pos = cam_transform.position;
        camParent_pos = camPrent_tranasform.localPosition;
        camParent_rot = camPrent_tranasform.localRotation;
    }

    void Update()
    {
        if (EventSystem.current == null)
        {
            Debug.LogError("缺少EventSystem");
            return;
        }
        if (!EventSystem.current.IsPointerOverGameObject() || isUI)
        {
            Oribit();
            Zoom();
            Drag();
        }
    }
    /// <summary>
    /// 拖动
    /// </summary>
    private void Drag()
    {
        if (Input.GetMouseButton(0) && drag_parameter.isDrag)//&& !EventSystem.current.IsPointerOverGameObject())
        {
            delta_x = Input.GetAxis("Mouse X") * drag_parameter.DragSpeed;
            delta_y = Input.GetAxis("Mouse Y") * drag_parameter.DragSpeed;
            Drag_rotation = Quaternion.Euler(0, transform.rotation.eulerAngles.y, 0);
            transform.position = Drag_rotation * new Vector3(-delta_x, -delta_y, 0) + transform.position;
        }
    }
    /// <summary>
    /// 旋转
    /// </summary>
    private void Oribit()
    {
        if (Input.GetMouseButton(1))
        {
            var mouse_x = Input.GetAxis("Mouse X");//获取鼠标X轴移动
            var mouse_y = -Input.GetAxis("Mouse Y");//获取鼠标Y轴移动
            //上下旋转限制
            rotatedAngleX = transform.eulerAngles.x + mouse_y * rotation_Parameter.mouseMoveRatio;
            if (rotatedAngleX > rotation_Parameter.minXAngle && rotatedAngleX < rotation_Parameter.maxXAngle || !rotation_Parameter.limitXAngle)
            {
                transform.RotateAround(camPrent_tranasform.position, transform.right, mouse_y * rotation_Parameter.mouseMoveRatio);
            }
            else
            {
                transform.RotateAround(camPrent_tranasform.position, transform.right, 0);
            }

            //左右旋转限制
            rotatedAngleY = transform.eulerAngles.y + mouse_x * rotation_Parameter.mouseMoveRatio;
            if (rotatedAngleY > rotation_Parameter.minYAngle && rotatedAngleY < rotation_Parameter.maxYAngle || !rotation_Parameter.limitYAngle)
            {
                transform.RotateAround(camPrent_tranasform.position, Vector3.up, mouse_x * rotation_Parameter.mouseMoveRatio);
            }
            else
            {
                transform.RotateAround(camPrent_tranasform.position, Vector3.up, 0);
            }
        }
    }
    /// <summary>
    /// 镜头拉远或缩进
    /// </summary>
    private void Zoom()
    {
        if (Input.GetAxis("Mouse ScrollWheel") != 0)
        {
            cameraDistance = -cam_transform.localPosition.z;
            targetCameraDistance = cameraDistance - Input.GetAxis("Mouse ScrollWheel") * cameraDistance * zoom_parameter.mouseScroollRatio;
            targetCameraDistance = Mathf.Clamp(targetCameraDistance, zoom_parameter.minDistance, zoom_parameter.maxDistance);
        }
        if (Mathf.Abs(targetCameraDistance - cameraDistance) > 0.1f)
        {
            cameraDistance = Mathf.Lerp(cameraDistance, targetCameraDistance, Time.fixedDeltaTime * zoom_parameter.zoomSensitive);
            cam_transform.localPosition = new Vector3(0f, 0f, -cameraDistance);
        }
    }
    /// <summary>
    /// 重置位置
    /// </summary>
    public void Reset_Transform()
    {
        camPrent_tranasform.position = camParent_pos;
        camPrent_tranasform.rotation = camParent_rot;
        cam_transform.position = cam_pos;

        cameraDistance = cam_pos.z;
        targetCameraDistance = cameraDistance;

        //拖动
        delta_x = 0; delta_y = 0;
        Drag_rotation = new Quaternion(0, 0, 0, 0);

        rotatedAngleX = 0; rotatedAngleY = 0;
    }
}
#region 结构体
/// <summary>
/// 摄像机旋转参数
/// </summary>
[Serializable]
public struct Camera_Rotation_Parameter
{
    [Header("旋转速度")]
    public float mouseMoveRatio;
    [Header("是否限制X轴旋转角度")]
    public bool limitXAngle;
    [Header("X轴旋转角度最小值")]
    public float minXAngle;
    [Header("X轴旋转角度最大值")]
    public float maxXAngle;
    [Header("是否限制Y轴旋转角度")]
    public bool limitYAngle;
    [Header("Y轴旋转角度最小值")]
    public float minYAngle;
    [Header("Y轴旋转角度最大值")]
    public float maxYAngle;

    public Camera_Rotation_Parameter(
                bool limitXAngle = true
               , float minXAngle = 0f
               , float maxXAngle = 60f
               , bool limitYAngle = false
               , float minYAngle = 0f
               , float maxYAngle = 0f
               , float mouseMoveRatio = 5f)
    {
        this.limitXAngle = limitXAngle;
        this.minXAngle = minXAngle;
        this.maxXAngle = maxXAngle;
        this.limitYAngle = limitYAngle;
        this.minYAngle = minYAngle;
        this.maxYAngle = maxYAngle;
        this.mouseMoveRatio = mouseMoveRatio;
    }
}
/// <summary>
/// 摄像机视角缩放参数
/// </summary>
[Serializable]
public struct Camera_Zoom_Parameter
{
    [Header("缩放最小值")]
    public float minDistance;//5
    [Header("缩放最大值")]
    public float maxDistance;//30
    [Header("缩放幅度")]
    public float mouseScroollRatio;//1
    [Header("缩放平滑度")]
    public float zoomSensitive;//1

    public Camera_Zoom_Parameter(float minDistance, float maxDistance, float mouseScroollRatio, float zoomSensitive)
    {
        this.minDistance = minDistance;
        this.maxDistance = maxDistance;
        this.mouseScroollRatio = mouseScroollRatio;
        this.zoomSensitive = zoomSensitive;
    }
}
/// <summary>
/// 摄像机视角拖拽参数
/// </summary>
[Serializable]
public struct Camera_Drag_Parameter
{
    [Header("是否允许拖拽")]
    public bool isDrag;
    [Header("拖拽移动速度")]
    public float DragSpeed;
    public Camera_Drag_Parameter(bool isDrag, float DragSpeed)
    {
        this.isDrag = isDrag;
        this.DragSpeed = DragSpeed;
    }
}
#endregion

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/634909.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据技术原理(二):搭建hadoop伪分布式集群这一篇就够了

&#xff08;实验一 搭建hadoop伪分布式&#xff09; -------------------------------------------------------------------------------------------------------------------------------- 一、实验目的 1.理解Hadoop伪分布式的安装过程 实验内容涉及Hadoop平台的搭建和…

“现代汽车中国前瞻软件赛杯” 牛客周赛 Round 43

A. 小红平分糖果&#xff08;签到&#xff09; // Problem: 小红平分糖果 // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/82394/A // Memory Limit: 524288 MB // Time Limit: 2000 ms // // Powered by CP Editor (https://cpeditor.org)#include<b…

【软件工程】【23.10】p2

关键字&#xff1a; 软件复用技术、过程途径、特定需求是文档核心、数据字典条目、高内聚低耦合独立性、数据流图映射模块结构图、UML依赖、用例图关系、RUB迭代、程序规格说明等价类划分、有效性测试的目标、喷泉模型面向对象、软件验证过程、CMMI

Windows安装php_ssh2扩展

一、读取PHP信息 先用phpinfo读取使用的php的版本信息 二、下载ssh2扩展 链接&#xff1a;https://windows.php.net/downloads/pecl/snaps/ssh2/1.2-dev/ 点击链接下载对应链接 三、开启扩展 下载好压缩包后&#xff0c;解压缩得到php_ssh2.dll、php_ssh2.pdb文件&#xff…

AWS容器之Amazon ECS

Amazon Elastic Container Service&#xff08;Amazon ECS&#xff09;是亚马逊提供的一种完全托管的容器编排服务&#xff0c;用于在云中运行、扩展和管理Docker容器化的应用程序。可以理解为Docker在云中对应的服务就是ECS。

JavaSE:Clonable接口、浅拷贝与深拷贝

1、引言 我们在学习的数组时&#xff0c;就了解到了数组克隆方法&#xff0c;可以通过数组克隆方法来拷贝一个一模一样的数组&#xff1a; 那对于自定义类型中有没有克隆方法呢&#xff1f;答案是有的&#xff01; 就让这篇文章来帮助大家学习自定义类型的拷贝&#xff01; …

OpenHarmony开发之MQTT讲解

相信MQTT这个名称大家都不陌生&#xff0c;物联网的开发必然会遇到MQTT相关知识的应用。那么什么是MQTT&#xff1f;它有什么特点&#xff1f;它能解决什么问题&#xff1f;它是如何工作的&#xff1f;OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;的物…

10最佳iPhone数据恢复软件评论

您还在寻找最好的iPhone数据恢复软件吗&#xff1f; 似乎我们在iPhone上放置了越来越多与日常生活和工作有关的重要事情。照片可以保持珍贵的时刻&#xff0c;联系人可以保持联系&#xff0c;录音&#xff0c;备忘录和日历可以作为提醒&#xff0c;视频和歌曲可以娱乐&#xf…

基于Java的推箱子游戏设计与实现(论文 + 源码)

【免费】关于基于JAVA的推箱子游戏.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89325018 基于Java的推箱子游戏设计与实现 摘 要 社会在进步&#xff0c;人们生活质量也在日益提高。高强度的压力也接踵而来。社会中急需出现新的有效方式来缓解人们的压力。…

NDI入门教程二

一、移植到RK&#xff1a; 编译相关&#xff1a; ndi本身没有什么好移植编译的&#xff0c;本身提供的就是so库。但是ndi依赖其它第三方开源库&#xff1a; avahi; dbus; expat; libcap; libdameon。因为编译这些开源库的服务器也需要安装一些插件所以在自己虚拟机Ubuntu20.04…

notepad++ 批量转所有文件编码格式为UTF-8

1、安装notepad及PythonScript_3.0.18.0插件 建议两者都保持默认路径安装x64版本&#xff1a; 阿里云盘分享https://www.alipan.com/s/xVUDpY8v5QL安装好后如下图&#xff1a; 2、new Script&#xff0c;新建脚本&#xff0c;文件名为ConvertEncoding 3、自动打开脚本&#xff…

Jenkins 动态salve简单配置连接 EKS

安装Jenkins helm repo add jenkins https://charts.jenkins.io helm repo update # 当前版本 jenkins-5.1.18.tgz瘦身后的 values.yaml # grep -Ev ^\s*#|^$ values.yaml nameOverride: fullnameOverride: namespaceOverride: clusterZone: "cluster.local" kubern…

(Oracle)SQL优化基础(三):看懂执行计划顺序

往期内容&#xff1a; &#xff08;Oracle&#xff09;SQL优化基础&#xff08;一&#xff09;&#xff1a;获取执行计划 &#xff08;Oracle&#xff09;SQL优化基础&#xff08;二&#xff09;&#xff1a;统计信息 获取到执行计划后&#xff0c;对于新手朋友来讲可能不知道…

火箭升空AR虚拟三维仿真演示满足客户的多样化场景需求

在航空工业的协同研发领域&#xff0c;航空AR工业装配系统公司凭借前沿的AR增强现实技术&#xff0c;正引领一场革新。通过将虚拟信息无缝融入实际环境中&#xff0c;我们为工程师、设计师和技术专家提供了前所未有的共享和审查三维模型的能力&#xff0c;极大地提升了研发效率…

【华为】BFD与静态路由和RIP联用

【华为】BFD与静态路由和RIP联用 实验需求配置AR1AR2AR3AR4效果抓包查看 实验需求 如上图组网所示&#xff0c;在R1上配置到达R4的Loopback0。 4.4.4.4/32网段的浮动静态路由&#xff0c;正常情况下通过R3访问R4。 当R3故障时&#xff0c;自动选路通过R2访问R4的Loopback0;在R…

企业文件加密软件推荐:迅软DSE加密软件你用了吗?

一、挑选企业文件加密软件需考虑的因素&#xff1f; 1、安全性&#xff1a;软件应采用业界认可的强加密算法&#xff0c;以确保数据的安全性。 迅软特有的256位高强度加密算法&#xff0c;从根本上阻止一切破解的可能性。 2、易用性&#xff1a;软件应该易于部署和管理&…

如何停止 iPad 和 iPhone 之间共享短信,独立接收和发送消息

概括 在当今高度互联的数字世界中&#xff0c;Apple 设备之间的无缝连接性提供了极大的便利&#xff0c;尤其是在消息同步方面。iPhone 和 iPad 用户通常可以享受到设备间短信的自动同步功能&#xff0c;这意味着无论是在哪个设备上&#xff0c;用户都可以接收和回复消息。然而…

游戏联运的挑战与核心关键点

​游戏联运一个看似充满机遇与挑战的行业&#xff0c;吸引了很多创业者的加入。然而&#xff0c;真正踏入这个行业后&#xff0c;许多人会发现&#xff0c;手游代理并非想象中的那么简单。今天&#xff0c;溪谷软件就来和大家聊聊游戏联运是怎么做的&#xff0c;需要注意什么。…

react中的useEffect()的使用

useEffect()是react中的hook函数&#xff0c;作用是用于创建由渲染本身引起的操作&#xff0c;而不是事件的触发&#xff0c;比如Ajax请求&#xff0c;DOM的更改 首先useEffect()是个函数&#xff0c;接受两个参数&#xff0c;第一个参数是一个方法&#xff0c;第二个参数是数…

《计算机体系结构》期末考试复习笔记(一)试卷手写笔记(超重点)

一、MIPS 执行速率执行时间有效CPI【第1题】 二、Amdahl定律 - 性能加速比SP【第2题&#xff0c;第3题&#xff0c;第4题】 (百分比f 倍数r &#xff09; 三、哈夫曼编码 2-4扩展码【第5题】 四、互连函数【第9题】 就是每生成一个根节点&#xff0c; 就从小到大重新排…