Unity笔记-06
Input(仅键盘和鼠标的输入部分)
鼠标输入
代码:Input.GetMouseButton(0)
鼠标左键按下时,返回true
,参数为0
则是鼠标左键,参数为1
则是鼠标右键,参数为2
则是鼠标中键,后续不再赘述
代码:Input.GetMouseButtonDown(0)
鼠标左键按下时的第一帧,返回true
只有一瞬间
上述两种方法的区别在于:
第一种鼠标一直按着,那么就一直返回true
,只有鼠标松开才会返回false
;但是第二种鼠标一直按着,却只在第一帧的时候返回true
也就是按下的一瞬间返回true
就马上变成false
了,即使一直按着也只有一开始返回true
之后就全是false
代码:Input.GetMouseButtonUp(0)
鼠标左键释放时的第一帧,返回true
只有鼠标松开的一瞬间。
键盘输入
代码:Input.GetKey(KeyCode.A)
指定键盘被按住时,返回true
,这里以A
为例,后续不再赘述
代码:Input.GetKeyDown(KeyCode.A)
指定键盘被按下的那一帧,返回true
代码:Input.GetKeyUp(KeyCode.A)
指定键盘被松开的那一帧,返回true
应用场景练习:狙击镜开镜
需求
倍率层级可以设定
第一次点击鼠标右键,达到第一倍率层级
再次点按鼠标右键,达到第二倍率层级
最后点按鼠标右键,回到第零倍率层级
且放大过程应当平滑过渡,而非瞬间放大
第一版代码
private void Update()
{
if (Input.GetMouseButtonDown(1))
{
isFar = !isFar;
if (isFar)
camera.fieldOfView = 60;
else
camera.fieldOfView = 20;
}
}
第一版代码:只是实现了鼠标点按:镜头瞬间放大和瞬间复位,且只有一级倍率层级,并且层级被写死。
第二版代码
private void Update()
{
if (Input.GetMouseButtonDown(1))
{
isFar = !isFar;
}
if (isFar)
{
if (camera.fieldOfView < 60)
camera.fieldOfView += 2;
}
else
{
if (camera.fieldOfView > 20)
camera.fieldOfView -= 2;
}
}
第二版代码:实现了镜头的过渡变化,但是很明显,不够平滑,不够自然。
第三版代码
private void Update()
{
if (Input.GetMouseButtonDown(1))
{
isFar = !isFar;
}
if (isFar)
{
camera.fieldOfView = Mathf.Lerp(camera.fieldOfView, 60, 0.1f);
if (Mathf.Abs(camera.fieldOfView - 60) < 0.1f)
camera.fieldOfView = 60;
}
else
{
camera.fieldOfView = Mathf.Lerp(camera.fieldOfView, 20, 0.1f);
if (Mathf.Abs(camera.fieldOfView - 20) < 0.1f)
camera.fieldOfView = 20;
}
}
第三版代码:引入Mathf.Lerp
方法
Mathf.Lerp(起点,终点,比例)
每次返回值计算公式:起点+终点减去起点的差乘以比例,也就说它是以一种递减的方式不断拉近或拉远距离,最终会不断逼近临界值,但不会等于临界值,这样便是的开镜和关镜的过渡变得更加顺滑和自然
因此加入最后的极限判断语句,当值和临界值极其接近的时候,直接将临界值赋值给镜头的FieldOfView
属性
但仍然没有实现多倍率层级
第四版代码(最终版)
private Camera camera;
/// <summary>
/// 狙击镜倍率数组,方便复用和日后更改
/// </summary>
public float[] zoomLevel;
/// <summary>
/// 数组索引
/// </summary>
private int index=0;
private void Start()
{
camera = this.GetComponent<Camera>();
}
private void Update()
{
if (Input.GetMouseButtonDown(1))
{
//三元表达式
index = index < zoomlevel.Length - 1 ? index+1 : 0;
//index=(index+1)%zoomlevel.Length;
}
camera.fieldOfView = Mathf.Lerp(camera.fieldOfView, zoomlevel[index], 0.1f);
if (Mathf.Abs(camera.fieldOfView - zoomlevel[index]) < 0.1f) camera.fieldOfView = zoomlevel[index];
}
第四版代码:增加倍率数组zoomLevel
与倍率数组索引index
通过每次点击鼠标右键增加索引值,达到上限则返回初值,每次调用对应的层级倍率即可