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

介绍

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

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

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

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

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


方法

dart 复制代码
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中,以备用于平滑旋转操作。

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


相关推荐
不穿格子的程序员4 小时前
从零开始刷算法——贪心篇1:跳跃游戏1 + 跳跃游戏2
算法·游戏·贪心
微祎_5 小时前
Flutter for OpenHarmony:构建一个 Flutter 镜像绘图游戏,对称性认知、空间推理与生成式交互设计
flutter·游戏·交互
前端不太难6 小时前
HarmonyOS 游戏项目,从 Demo 到可上线要跨过哪些坑
游戏·状态模式·harmonyos
子春一6 小时前
Flutter for OpenHarmony:色彩捕手:基于 CIELAB 色差模型与人眼感知的高保真色彩匹配游戏架构解析
flutter·游戏·架构
前端不太难10 小时前
在 HarmonyOS 上,游戏状态该怎么“死而复生”
游戏·状态模式·harmonyos
ujainu19 小时前
Flutter + OpenHarmony 游戏开发进阶:用户输入响应——GestureDetector 实现点击发射
flutter·游戏·openharmony
ujainu19 小时前
Flutter + OpenHarmony 实现无限跑酷游戏开发实战—— 对象池化、性能优化与流畅控制
flutter·游戏·性能优化·openharmony·endless runner
呆呆敲代码的小Y21 小时前
【Unity工具篇】| 超实用工具LuBan,快速上手使用
游戏·unity·游戏引擎·unity插件·luban·免费游戏·游戏配置表
我的offer在哪里21 小时前
用 Unity 从 0 做一个「可以玩的」游戏,需要哪些步骤和流程
游戏·unity·游戏引擎
串流游戏联盟1 天前
启程!手机也能邂逅暖暖万相奇观
游戏·远程工作