//InputScript.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InputScript : MonoBehaviour
{
/*
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);
*/
public bool judgeMouse;
public bool judgeKey;
public bool judgeKeyTest;
private Camera CarmeraTransform;
private bool JudgeMouseRight;
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;
}
}
}
}
|