控制一个游戏对象的旋转和相机的缩放

介绍

这段代码是一个Unity游戏开发脚本,它用于控制一个游戏对象的旋转和相机的缩放。以下是代码的主要功能:

  1. 控制游戏对象的旋转:

    • 通过按下Q键和W键,用户可以选择以逆时针或顺时针方向绕游戏对象的Y轴进行旋转。
    • 旋转角度和速度可以通过公共变量进行调整,可以控制每次旋转的角度和旋转的速度。
    • 旋转是平滑的,使用Slerp插值方法,确保旋转过程是平滑的。
  2. 控制相机的缩放:

    • 通过鼠标滚轮的输入,用户可以缩放场景中的主摄像机。
    • 可以通过设置最小和最大视野(FOV)值来限制缩放范围。

总之,这个脚本允许用户通过按键控制游戏对象的旋转,同时还可以通过滚轮控制主摄像机的缩放。这对于游戏中的交互和用户体验可以是有趣的元素。


方法

using UnityEngine;public class RotateObject : MonoBehaviour
{public float rotationAngle = 60f; // 旋转角度,指定每次旋转的角度public float rotationSpeed = 5.0f; // 旋转速度,控制旋转的速度public float zoomSpeed = 5.0f; // 缩放速度,控制相机缩放的速度public float minFOV = 10.0f; // 最小视野,指定相机最小的视野值public float maxFOV = 60.0f; // 最大视野,指定相机最大的视野值private bool isRotating = false; // 标记是否正在进行旋转private Quaternion targetRotation; // 目标旋转,用于存储目标旋转的四元数private Camera mainCamera; // 主摄像机void Start(){mainCamera = Camera.main; // 获取场景中的主摄像机}void Update(){if (Input.GetKeyDown(KeyCode.Q) && !isRotating){// 开始逆时针绕自身Y轴旋转StartRotation(false); // 调用StartRotation函数开始逆时针旋转}else if (Input.GetKeyDown(KeyCode.W) && !isRotating){// 开始顺时针绕自身Y轴旋转StartRotation(true); // 调用StartRotation函数开始顺时针旋转}if (isRotating){// 在每帧使用 Slerp 进行旋转float t = Time.deltaTime * rotationSpeed; // 根据旋转速度计算插值的参数transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, t); // 使用Slerp函数实现平滑旋转// 判断是否接近目标旋转if (Quaternion.Angle(transform.rotation, targetRotation) < 1.0f){isRotating = false; // 标记旋转结束}}// 处理相机缩放float scrollWheel = Input.GetAxis("Mouse ScrollWheel"); // 获取鼠标滚轮滚动的输入值if (scrollWheel != 0){float newFOV = mainCamera.fieldOfView - scrollWheel * zoomSpeed; // 根据输入值计算新的视野值newFOV = Mathf.Clamp(newFOV, minFOV, maxFOV); // 使用Mathf.Clamp函数确保视野值在指定范围内mainCamera.fieldOfView = newFOV; // 更新相机的视野值}}void StartRotation(bool clockwise){isRotating = true; // 标记正在进行旋转// 计算目标旋转float angle = clockwise ? rotationAngle : -rotationAngle; // 根据顺时针或逆时针选择旋转角度targetRotation = Quaternion.Euler(0, angle, 0) * transform.rotation; // 计算目标旋转的四元数}
}

举例子

当然,以下是代码中每个主要部分的作用的分条分点说明:

  1. using UnityEngine;: 引入Unity的命名空间,使得可以使用Unity的类和功能。

  2. public class RotateObject : MonoBehaviour: 定义了一个名为RotateObject的公共类,该类继承自Unity的MonoBehaviour类,这是Unity中所有脚本的基类。

  3. public float rotationAngle = 60f;: 定义了一个公共浮点型变量rotationAngle,用于指定每次旋转的角度,默认值为60度。

  4. public float rotationSpeed = 5.0f;: 定义了一个公共浮点型变量rotationSpeed,用于控制旋转的速度,默认值为5.0。

  5. public float zoomSpeed = 5.0f;: 定义了一个公共浮点型变量zoomSpeed,用于控制相机缩放的速度,默认值为5.0。

  6. public float minFOV = 10.0f;: 定义了一个公共浮点型变量minFOV,用于指定相机的最小视野值,默认值为10.0。

  7. public float maxFOV = 60.0f;: 定义了一个公共浮点型变量maxFOV,用于指定相机的最大视野值,默认值为60.0。

  8. private bool isRotating = false;: 定义了一个私有布尔型变量isRotating,用于标记是否正在进行旋转,默认为假(false)。

  9. private Quaternion targetRotation;: 定义了一个私有四元数变量targetRotation,用于存储目标旋转的信息。

  10. private Camera mainCamera;: 定义了一个私有相机对象mainCamera,用于引用场景中的主摄像机。

  11. void Start(): 这是一个生命周期方法,当脚本被加载时调用。在此方法中,脚本获取场景中的主摄像机的引用。

  12. void Update(): 这是一个生命周期方法,每一帧都会被调用。在此方法中,脚本处理输入和控制对象的旋转以及相机的缩放。

  13. 输入检测部分:

  • 通过Input.GetKeyDown(KeyCode.Q)Input.GetKeyDown(KeyCode.W)检测用户按下了Q键或W键,并且isRotating为假时,触发旋转操作。
  1. 旋转操作部分:
  • isRotating为真时,使用Slerp插值实现平滑旋转,以使对象以指定的速度旋转到目标旋转。
  • 通过比较当前旋转状态与目标旋转状态的夹角来判断旋转是否接近目标,当夹角小于1.0度时,标记旋转结束。
  1. 相机缩放操作部分:
  • 检测鼠标滚轮输入并获取滚轮的值。
  • 根据输入值调整相机的视野值,并使用Mathf.Clamp函数确保视野值在指定的最小和最大范围内。
  1. void StartRotation(bool clockwise): 自定义方法,用于开始旋转操作。
  • 通过clockwise参数决定顺时针还是逆时针旋转。
  • 计算目标旋转角度并将其存储在targetRotation中,以备用于平滑旋转操作。

这些分条分点说明了代码中各个部分的作用和功能。


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js中nan有什么用,如何判断

在JavaScript中&#xff0c;NaN表示“不是一个数字”&#xff0c;当一个数值无法被解析为数字时会返回NaN。NaN通常表示一个错误的或非法的数值操作结果。例如&#xff0c;当尝试将非数字字符串解析为数字时&#xff0c;将返回NaN。 NaN具有以下特点&#xff1a; NaN不等于任何…

shell命令以及运行原理

Linux严格意义上说的是一个操作系统&#xff0c;我们称之为“核心&#xff08;kernel&#xff09;“ &#xff0c;但我们一般用户&#xff0c;不能直接使用kernel。 而是通过kernel的“外壳”程序&#xff0c;也就是所谓的shell&#xff0c;来与kernel沟通。如何理解&a…

Ubuntu 20.04装机

安装搜狗输入法&#xff1a; Ubuntu 20.04安装sogou输入法_ubuntu20.04 搜狗输入法-CSDN博客a 安装chrome浏览器&#xff1a; ubuntu20.04安装Chrome浏览器-CSDN博客 安装nvidia驱动 ubuntu20安装nvidia驱动-CSDN博客 安装cudnn ubuntu 20 安装 CUDA-CSDN博客

【LeetCode】22. 括号生成

1 问题 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”] 示例 2&#xff1a; 输…

rabbitMQ的知识点

RabbitMQ是一种消息队列软件&#xff0c;它实现了高度可靠的消息传递机制。RabbitMQ支持多种消息协议&#xff0c;包括AMQP、STOMP、MQTT等&#xff0c;比较灵活。以下是一些rabbitmq的知识点&#xff1a; 1. 消息队列&#xff1a;消息队列是一种分布式系统中广泛使用的通信模…

ESP32-IPS彩屏ST7789-Arduino-简单驱动

目的&#xff1a; 使ESP32能够驱动点亮ST7789显示屏 前提条件&#xff1a; ESP32 ST7789 &#xff08;240 x240&#xff0c;IPS&#xff09; 杜邦线 Arduino 过程&#xff1a; 0x00--接线 0x01--驱动&#xff1a; 彩屏驱动库 针对不同的彩屏驱动芯片&#xff0c;常用的 Arduino…

Go实现CORS(跨域)

引言 很多时候&#xff0c;需要允许Web应用程序在不同域之间&#xff08;跨域&#xff09;实现共享资源。本文将简介跨域、CORS的概念&#xff0c;以及如何在Golang中如何实现CORS。 什么是跨域 如果两个 URL 的协议、端口&#xff08;如果有指定的话&#xff09;和主机都相…

Linux性能优化--实用工具:性能工具助手

8.0 概述 本章介绍一些在Linux系统上可用的实用程序&#xff0c;它们能够加强性能工具的有效性和可用性。实用工具本身不是性能工具&#xff0c;但是当它们与性能工具一起使用时&#xff0c;它们可以帮助完成如下功能&#xff1a;自动执行繁琐的任务、分析性能统计数据&#x…

资源受限MCU Flash空间占用优化

资源受限MCU Flash空间占用优化步骤&#xff1a; 避免重复功能&#xff0c;排查软件工程中&#xff0c;重复功能的代码片段&#xff0c;抽象出来&#xff0c;重新进行封装&#xff1b;减少内联函数inline&#xff0c;内联函数过大且过多的调用无疑会增加代码量&#xff0c;占用…

二叉树的三种遍历方式的本质

二叉树的定义就不在这里多说了&#xff0c;下面这个图就是一个简单的二叉树&#xff1a; 二叉树的三种遍历方式&#xff1a; 前序遍历&#xff1a;头左右&#xff0c;也就是先头后左再右&#xff1a;1245367 public static void prePrint(BinaryTreeNode root) {if (root ! n…

BIM轻量化引擎的国内外发展现状

随着BIM技术的不断发展&#xff0c;对BIM技术应用要求已不局限于模型及基于模型的应用&#xff0c;其在经历了方案展示、BIM建模及应用两个阶段后&#xff0c;逐步向基于BIM平台的信息化管理模式升级&#xff0c;“模型是基础&#xff0c;管理是核心”的理念成为BIM应用的主流方…

一些FreeRTOS系统的usb命令使用方法

在全志R128开发过程中总结一些RTOS系统的usb命令使用方法&#xff0c;以下命令在所有RTOS平台&#xff08;MELIS/FREERTOS&#xff09;都可以使用 通过menuconfig打开usb模块功能 RTOS通过usb命令集成了测试用例。通过如下命令即可显示支持的功能&#xff1a; //输入如下命令…

rsyslog实现将日志存储到mysql中

​ 前提&#xff1a;准备好msql server或mariadb server&#xff1b; ​ 1、安装rsyslog连接至mysql server的驱动模块&#xff1b; [13:24 rootcentos6.8~]# yum install -y rsyslog-mysql [13:24 rootcentos6.8~]# rpm -ql rsyslog-mysql /lib64/rsyslog/ommysql.so /usr/…

6.strchr函数和strrchr函数

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h>/*char *strchr(char const *str, int ch);strchr在字符串中str中查找字符ch第1次出现的位置&#xff0c;找到后函数返回一个指向该位置的指针&#xff1b;如果该字符并不存在于字符串中&a…

EFLK与logstash过滤

目录 一、Filebeat工作原理&#xff1a; 二、为什么要使用Filebeat&#xff1a; 三、Filebeat和Logstash的区别&#xff1a; 四、logstash 的过滤插件&#xff1a; 五、FilebeatELK 部署&#xff1a; 1. 安装filebeat&#xff1a; 2. 设置 filebeat 的主配置文件&#xff1…

RIAC-V架构开发——ecall函数调用分析

1、sbi_ecall函数功能 &#xff08;1&#xff09;sbi_ecall函数是内核调用SBI的接口&#xff0c;在RISC-V架构中定义了SBI规范&#xff0c;内核通过ecall指令来调用SBI接口进而操作硬件&#xff1b; &#xff08;2&#xff09;SBI规范参考官网文档《riscv-sbi.pdf》&#xff1b…

qt_vs_tools 设置

1. 设置qt->general->最后面的QT/MSBUILD 该路径在QT/MSBUILD的本机路径 &#xff08;%LOCALAPPDATA%\QtMsBuild&#xff09; C:\Users\pc\AppData\Local\QtMsBuild 设置后需重启vs才能生效 2. 环境变量设置 path中需添加qt安装路径 E:\ProgramFiles\Qt\6.5.1\msvc201…

Spring Boot Bean 注入的常用方式教程

Spring Boot Bean 注入是一种将依赖对象引入到应用程序组件中的机制&#xff0c;它有助于实现松耦合和可测试的代码。这种注入方式允许我们将依赖关系委托给 Spring 容器来管理&#xff0c;从而提高了代码的可维护性和可读性。Spring Boot 提供了多种 Bean 注入方式&#xff0c…

GPT实战系列-ChatGLM2部署Ubuntu+Cuda11+显存24G实战方案

GPT实战系列-ChatGLM2部署UbuntuCuda11显存24G实战方案 自从chatGPT掀起的AI大模型热潮以来&#xff0c;国内大模型研究和开源活动&#xff0c;进展也如火如荼。模型越来越大&#xff0c;如何在小显存部署和使用大模型&#xff1f; 本实战专栏将评估一系列的开源模型&#xf…

CICD:Circle CI 实现CICD

持续集成解决什么问题 提高软件质量效率迭代便捷部署快速交付、便于管理 持续集成&#xff08;CI&#xff09; 集成&#xff0c;就是一些孤立的事物或元素通过某种方式集中在一起&#xff0c;产生联系&#xff0c;从而构建一个有机整体的过程。 持续&#xff0c;就是指长期…