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

介绍

这段代码是一个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中,以备用于平滑旋转操作。

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


猜你喜欢

转载自blog.csdn.net/qq_20179331/article/details/133843152