Unity通过点击鼠标“开镜”效果(内含数值缓慢变化方法)

 通过点击鼠标左键达到“开镜”效果,代码如下:

using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AdjustFOV : MonoBehaviour
{
    //相机视野缩减等级
    private enum GandeFOV
    {
        one,two,three,four,Null
    }

    private Camera m_camera;
    private float initfov;
    private GandeFOV gf=GandeFOV .Null;
    private bool useFour ;
    void Start()
    {
        m_camera = GetComponent<Camera>();
        initfov = m_camera.fieldOfView;//记录相机初始视野值
    }
 
    void Update()
    {
        if (Input.GetKeyDown (KeyCode.Alpha1))
        {
            gf = GandeFOV.one;
        }
        if (Input.GetKeyDown (KeyCode.Alpha2 ))
        {
            gf = GandeFOV.two;
        }
        if (Input.GetKeyDown (KeyCode.Alpha3 ))
        {
            gf = GandeFOV.three;
        }
        if (Input.GetKeyDown (KeyCode.Alpha4 ))
        {
            gf = GandeFOV.four;
        }
        //按下鼠标左键缩减相机视野
        if (Input .GetMouseButtonDown(0))
        {
            switch (gf)
            {
                //直接变
                case GandeFOV.one:
                    m_camera.fieldOfView = 40;
                    break;
                //缓慢变
                case GandeFOV.two:
                    StartCoroutine("ChangeFOV");
                    break;
                //平滑缓慢变
                case GandeFOV.three:
                    //方法原理:在某段时间(1s)内,局部变量(currentfov)持续向目标结果(40)变化,
                    //目标变量(m_camera.fieldOfView)持续接收局部变量的值
                    float currentfov = m_camera.fieldOfView;
                    DOTween.To(() => currentfov, x => currentfov = x, 40, 1)
                   .OnUpdate(() => m_camera.fieldOfView = currentfov);
                    break;
                //平滑缓慢变
                case GandeFOV.four:
                    useFour = true;
                    break;
                default:
                    break;
            }
        }
        //抬起鼠标左键恢复相机视野
        if (Input.GetMouseButtonUp(0))
        {
            if (gf==GandeFOV.one)
            {
                m_camera.fieldOfView = initfov;
            }
            if (gf==GandeFOV .two)
            {
                StopCoroutine("ChangeFOV");
                m_camera.fieldOfView = initfov;
            }
            if (gf==GandeFOV.three )
            {
                float currentfov = m_camera.fieldOfView;
                DOTween.To(() => currentfov, x => currentfov = x, initfov, 1)
               .OnUpdate(() => m_camera.fieldOfView = currentfov);
            }
            if (gf==GandeFOV.four)
            {
                useFour = false;
            }

        }
        if (gf == GandeFOV.four)
        {
            if (useFour)
            {
                //Mathf.Lera(起点值,终点值,比例)
                m_camera.fieldOfView = Mathf.Lerp(m_camera.fieldOfView, 40, 0.1f);
                if (Mathf.Abs(m_camera.fieldOfView - 40) < 0.1f)
                    m_camera.fieldOfView = 40;
            }
            else
            {
                m_camera.fieldOfView = Mathf.Lerp(m_camera.fieldOfView, initfov, 0.1f);
                if (Mathf.Abs(m_camera.fieldOfView - initfov) < 0.1f)
                    m_camera.fieldOfView = initfov;
            }
        }

    }
    //每等0.2秒缩减5米的相机视野,效果不流畅
    private IEnumerator ChangeFOV()
    {
        while (m_camera .fieldOfView >40)
        {
            m_camera.fieldOfView -= 5;
            yield return new WaitForSeconds(0.2f);
        }
    }

}

数据缓慢变化的方法:

1、Mathf.Lera(起点值,终点值,比例)

2、 DOTween.To(() =>起点变量 , x => 起点变量 = x, 终点值, 1)
                   .OnUpdate(() => 需改变的变量 = 起点变量);

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值