求Unity相机FOV在最值间循环缩放的实现代码
实现相机视场角(FOV)循环拉近拉远效果
用Unity的协程可以完美实现你要的循环流程,结合你已经验证过的Mathf.MoveTowards函数,代码示例如下:
using UnityEngine; using System.Collections; public class CameraFOVControl : MonoBehaviour { // 视场角的最小/最大值,可在Inspector面板调整 [SerializeField] private float minFOV = 50f; [SerializeField] private float maxFOV = 70f; // 镜头缩放的速度 [SerializeField] private float zoomSpeed = 10f; private Camera mainCamera; private void Start() { mainCamera = GetComponent<Camera>(); // 启动循环协程 StartCoroutine(FOVLoopCoroutine()); } private IEnumerator FOVLoopCoroutine() { while (true) // 无限循环直到游戏结束 { // 1. 随机等待2-5秒 yield return new WaitForSeconds(Random.Range(2f, 5f)); // 2. 拉近镜头:将FOV减小到最小值 while (!Mathf.Approximately(mainCamera.fieldOfView, minFOV)) { mainCamera.fieldOfView = Mathf.MoveTowards(mainCamera.fieldOfView, minFOV, zoomSpeed * Time.deltaTime); yield return null; } // 3. 随机等待1-3秒 yield return new WaitForSeconds(Random.Range(1f, 3f)); // 4. 拉远镜头:将FOV增大到最大值 while (!Mathf.Approximately(mainCamera.fieldOfView, maxFOV)) { mainCamera.fieldOfView = Mathf.MoveTowards(mainCamera.fieldOfView, maxFOV, zoomSpeed * Time.deltaTime); yield return null; } } } }
关键说明:
- 用
Mathf.Approximately判断FOV是否到达目标值,避免浮点数精度问题导致循环无法结束 - 协程里的
yield return null会让代码每帧执行一次,保证缩放过程平滑 - 所有参数都用
[SerializeField]标记,方便在Unity编辑器里直接调整数值,不用改代码 - 无限循环
while(true)会一直重复流程,直到游戏停止或脚本被销毁
内容的提问来源于stack exchange,提问作者Amin Zekri
相关产品推荐
相关产品推荐

