返回首页DA系统C#IDE文件同步服务屏保 今天是: 2026-05-05    "立夏"  夏季的第一个节气,表示盛夏时节的正式开始

搜索
热搜: linux 技术
Hi~登录注册
查看: 3073|回复: 0

[原创] 【原创】Input类及模拟鼠标右键瞄准镜效果练习

[复制链接]
发表于 2021-5-31 15:09:44 | 显示全部楼层 |阅读模式

少侠不来段修仙之旅吗~

您需要 登录 才可以下载或查看,没有帐号?注册成为修仙之旅的少年~

x
本帖最后由 da11 于 2021-5-31 15:17 编辑

    Input类讲解:
    · 什么是Input类:
    包装了输入功能的类,可以读取输入管理器中设置的按键,
    以及访问移动设备的多点触控或加速感应数据。
    · 建议在Updata中监测用户的输入。

    获取鼠标输入
    · 当指定的鼠标按钮被按下时返回true:(一直按着为true)
      bool judge = Input.GetMouseButton(0); 按钮值设定:0 对应左键,1 对应右键,2 对应中键。

    · 在用户按下指定鼠标按键的第一帧返回true:(按下一次为true)
      bool judge = Input.GetMouseButtonDown(0); 按钮值设定:0 对应左键,1 对应右键,2 对应中键。

    · 在用户释放指定鼠标按键的第一帧返回true:(释放一次为true)
      bool judge = Input.GetMouseButtonUp(0); 按钮值设定:0 对应左键,1 对应右键,2 对应中键。

    获取键盘输入
    · 当通过名称指定的按键被用户按住时返回true:(一直按着为true)
      bool judge = Input.GetKey(KeyCode.A);
    · 当用户按下指定名称按键时的那一帧返回true:(按下一次为true)
      bool judge = Input.GetKeyDown(KeyCode.A);
    · 在用户释放给定名称按键的那一帧返回true:(释放一次为true)
      bool judge = Input.GetKeyUp(KeyCode.A);

--重点数学函数
//Mathf.Lerp  static float Lerp(float from, float to, float t);
//基于两点之间的百分比比例值(float t),返回a点(float from)到b点(float to)之间的插值,百分比比例值(float t)限制在0~1之间。
//当t的值 = 0 返回a点(float from),当t的值 = 1 返回b点(float to)。当t = 0.5 返回from和to的平均值。
//现象就是相机的缩放倍率由快到慢的无限接近目标倍率。(不可能等于目标倍率,只能接近)

//Mathf.Abs 绝对值  static float Abs(float f);
//返回(float f)的绝对值。



 楼主| 发表于 2021-5-31 15:13:12 | 显示全部楼层
//InputScript.cs
//挂在相机物体中

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InputScript : MonoBehaviour
{
    public bool judgeMouse;

    public bool judgeKey;

    public bool judgeKeyTest;

    private Camera CarmeraTransform;

    private bool JudgeMouseRight;

    //public int JudgeDownCheck;   //案例2使用

    public bool JudgeDownCheck=true;    //案例3使用

    private int JudgeDownCheck2;

    public float[] RatioLevel;

    private int RatioLevelNum;


    //练习:模拟鼠标右键瞄准镜效果
    //按住鼠标右键,镜头缩放,释放时回复

    private void Start()
    {
        CarmeraTransform = this.GetComponent<Camera>();
    }

    private void Update()
    {
        //鼠标左键一直按着为true
        judgeMouse = Input.GetMouseButton(0);

        //键盘左Ctrl键一直按着为true
        judgeKey = Input.GetKey(KeyCode.LeftControl);

        //先按W键,在按D键,为true(Input.GetKeyDown只在按下执行一次)
        judgeKeyTest = Input.GetKey(KeyCode.W) && Input.GetKeyDown(KeyCode.D);

        //持续按下拉近镜头--案例1,瞬移倍率
        /*
        JudgeMouseRight = Input.GetMouseButton(1);

        if (JudgeMouseRight == true)
            CarmeraTransform.fieldOfView = 25;
        else
            CarmeraTransform.fieldOfView = 60;

        */

        //按下一次既持续拉近中等远镜头,再次按下拉近远镜头,第三次按下返回--案例2--持续缓慢移动倍率
        /*
        //检测鼠标右键是否按下
        JudgeMouseRight = Input.GetMouseButtonDown(1);

        //如鼠标按键只按一次需达到持续状态效果,需要新增一个状态变量,++计算按键次数,后使用余数判断
        if (JudgeMouseRight==true)
        {
            JudgeDownCheck ++;
        }
        //使用余数判断,对应调用缩放方法
        if (JudgeDownCheck % 3 == 1)
        {            
            CameraMinCentre(35);
        }
        else if (JudgeDownCheck % 3 == 2)
        {
            CameraMinCentre(20);
        }
        else
        {
            CameraMaxCentre(60);
        }

        */

        //案例3--不确定缩放等级
        //检测鼠标右键是否按下
        JudgeMouseRight = Input.GetMouseButtonDown(1);

        //如鼠标按键只按一次需达到持续状态效果,需要新增一个状态变量,++计算按键次数
        if (JudgeMouseRight == true)
        {
            JudgeDownCheck2++;
            //JudgeDownCheck2 = (JudgeDownCheck2 + 1) % RatioLevel.Length;  高级数学公式用法
        }

        //判断数组是否为空,不为空才往下执行
        if (RatioLevel != null)
        {
            //判定JudgeDownCheck2按键次数是否小于数组最大值减一,并且不等于0才执行缩放
            if (JudgeDownCheck2 <= RatioLevel.Length-1 && JudgeDownCheck2 != 0)
            {
                CameraMinCentre(RatioLevel[JudgeDownCheck2]);
                //print(JudgeDownCheck2);
            }
            //超过数组最大值,JudgeDownCheck2回零,倍率归位
            else
            {
                JudgeDownCheck2 = 0;
                CameraMaxCentre(RatioLevel[JudgeDownCheck2]);
            }
        }
    }

    /// <summary>
    /// 缩放相机方法
    /// </summary>
    /// <param name="ratio">缩放倍率</param>
    private void CameraMinCentre(float ratio)
    {
        //判定相机的缩放倍率是否大于等于原缩放倍率,为true就缓慢减小缩放倍率(用于缩小缩放倍率)
        if (CarmeraTransform.fieldOfView >=ratio)
        {
            //CarmeraTransform.fieldOfView = CarmeraTransform.fieldOfView - 2; (旧版缓慢减小缩放倍率)

            //Mathf.Lerp  static float Lerp(float from, float to, float t); --重点数学函数
            //基于两点之间的百分比比例值(float t),返回a点(float from)到b点(float to)之间的插值,百分比比例值(float t)限制在0~1之间。
            //当t的值 = 0 返回a点(float from),当t的值 = 1 返回b点(float to)。当t = 0.5 返回from和to的平均值。
            //现象就是相机的缩放倍率由快到慢的无限接近目标倍率。(不可能等于目标倍率,只能接近)
            CarmeraTransform.fieldOfView = Mathf.Lerp(CarmeraTransform.fieldOfView, ratio, 0.1f);

            //Mathf.Abs 绝对值  static float Abs(float f);
            //返回(float f)的绝对值。
            //以下为:返回原相机的倍率和插值倍率相减的绝对值(为了预防有负数,一般不确定都需要使用绝对值来做换算判断),小于0.1就判定为达到目标倍率,将目标倍率赋值给原相机倍率。
            if (Mathf.Abs(CarmeraTransform.fieldOfView - Mathf.Lerp(CarmeraTransform.fieldOfView, ratio, 0.1f)) < 0.1f)
            {
                CarmeraTransform.fieldOfView = ratio;
            }



        }

    }

    /// <summary>
    /// 放大相机方法
    /// </summary>
    /// <param name="ratio">缩放倍率</param>
    private void CameraMaxCentre(float ratio)
    {
        //判定相机的缩放倍率是否小于等于原缩放倍率,为true就缓慢增加缩放倍率(用于恢复原缩放倍率)
        if (CarmeraTransform.fieldOfView <= ratio)
        {
            //CarmeraTransform.fieldOfView = CarmeraTransform.fieldOfView + 2;(旧版缓慢增加缩放倍率)

            CarmeraTransform.fieldOfView = Mathf.Lerp(CarmeraTransform.fieldOfView, ratio, 0.1f);

            if (Mathf.Abs(CarmeraTransform.fieldOfView - Mathf.Lerp(CarmeraTransform.fieldOfView, ratio, 0.1f)) < 0.1f)
            {
                CarmeraTransform.fieldOfView = ratio;
            }
        }

    }
}

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-31 15:15:26 | 显示全部楼层
案例演示动图:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册成为修仙之旅的少年~

x
回复 支持 反对

使用道具 举报

游客
回复
*滑块验证:

DA论坛飞机票来了~
快速回复 返回顶部 返回列表