这段代码是一个Unity游戏开发脚本,它用于控制一个游戏对象的旋转和相机的缩放。以下是代码的主要功能:
控制游戏对象的旋转:
控制相机的缩放:
总之,这个脚本允许用户通过按键控制游戏对象的旋转,同时还可以通过滚轮控制主摄像机的缩放。这对于游戏中的交互和用户体验可以是有趣的元素。
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; // 计算目标旋转的四元数
}
}
当然,以下是代码中每个主要部分的作用的分条分点说明:
using UnityEngine;: 引入Unity的命名空间,使得可以使用Unity的类和功能。
public class RotateObject : MonoBehaviour: 定义了一个名为RotateObject的公共类,该类继承自Unity的MonoBehaviour类,这是Unity中所有脚本的基类。
public float rotationAngle = 60f;: 定义了一个公共浮点型变量rotationAngle,用于指定每次旋转的角度,默认值为60度。
public float rotationSpeed = 5.0f;: 定义了一个公共浮点型变量rotationSpeed,用于控制旋转的速度,默认值为5.0。
public float zoomSpeed = 5.0f;: 定义了一个公共浮点型变量zoomSpeed,用于控制相机缩放的速度,默认值为5.0。
public float minFOV = 10.0f;: 定义了一个公共浮点型变量minFOV,用于指定相机的最小视野值,默认值为10.0。
public float maxFOV = 60.0f;: 定义了一个公共浮点型变量maxFOV,用于指定相机的最大视野值,默认值为60.0。
private bool isRotating = false;: 定义了一个私有布尔型变量isRotating,用于标记是否正在进行旋转,默认为假(false)。
private Quaternion targetRotation;: 定义了一个私有四元数变量targetRotation,用于存储目标旋转的信息。
private Camera mainCamera;: 定义了一个私有相机对象mainCamera,用于引用场景中的主摄像机。
void Start(): 这是一个生命周期方法,当脚本被加载时调用。在此方法中,脚本获取场景中的主摄像机的引用。
void Update(): 这是一个生命周期方法,每一帧都会被调用。在此方法中,脚本处理输入和控制对象的旋转以及相机的缩放。
输入检测部分:
Input.GetKeyDown(KeyCode.Q)和Input.GetKeyDown(KeyCode.W)检测用户按下了Q键或W键,并且isRotating为假时,触发旋转操作。isRotating为真时,使用Slerp插值实现平滑旋转,以使对象以指定的速度旋转到目标旋转。Mathf.Clamp函数确保视野值在指定的最小和最大范围内。void StartRotation(bool clockwise): 自定义方法,用于开始旋转操作。clockwise参数决定顺时针还是逆时针旋转。targetRotation中,以备用于平滑旋转操作。这些分条分点说明了代码中各个部分的作用和功能。