You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:39:54