Unity笔记-06

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通过每次点击鼠标右键增加索引值,达到上限则返回初值,每次调用对应的层级倍率即可

上一篇:Qt开发经验小技巧176-180


下一篇:Android 前置摄像头强制关闭镜像预览