美文网首页
六、输入控制:Input类

六、输入控制:Input类

作者: GameObjectLgy | 来源:发表于2020-11-19 10:37 被阅读0次

一个应用要和用户进行交互,用户的输入方式也是很丰富的。比如有键盘按键,鼠标,虚拟摇杆,手柄,触摸屏等。Unity为了将这些输入统一方便管理,于是有了Input类。这个类中有一些重要的常用API。

1、获取虚拟轴操作信息,Horizontal和Vertical。

所谓虚拟轴,就是将鼠标或者键盘的操作,应为Horizontal或Vertical,或者其他,这样子就可以有一对多的映射关系。比如Fire1这个虚拟按键名字,那么具体可以映射为空格键和鼠标左键点击。在edit-->Project Setting--> Input 下有非常多的输入设置里进行编辑。
两个常用的虚拟轴API:

  • Input.GetAxisRaw
    通过坐标轴名称返回一个不使用平滑滤波器的虚拟坐标值。
    当在游戏运行的时候,按下你设置好的键盘就会返回 1和-1这两个值。
function Update () {
    var speed : float = Input.GetAxisRaw("Horizontal") * Time.deltaTime;
    transform.Rotate (0, speed, 0);
}
  • Input.GetAxis
    当按下你设置的键则会返回一个类似加速度的值 0.1-->0.3 -->0.1然后将会依次减少..类似刹车和开车.
using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
    public float speed = 10.0F;
    public float rotationSpeed = 100.0F;
    void Update() {
        float translation = Input.GetAxis("Vertical") * speed;
        float rotation = Input.GetAxis("Horizontal") * rotationSpeed;
        translation *= Time.deltaTime;
        rotation *= Time.deltaTime;
        transform.Translate(0, 0, translation);
        transform.Rotate(0, rotation, 0);
    }
}
2、获得键盘

Input.GetKey(KeyCode.A)
Input.GetKeyDown(KeyCode.A)
Input.GetKeyUp(KeyCode.A)

3、获取鼠标

Input.mousePosition // 鼠标位置
Input.GetMouseButton 获取按钮

4、获取某个映射后的虚拟按键

Input.GetButton("Fire1")

5、获取触摸信息
  • API:GetTouch(int index)
  • 属性:touchCount
  • 属性:Touch[] touches
(1)Input.touches结构
1647226719.png

利用这几个结构体信息,可以判断出在触摸上的操作。
通常的操作有:点击、单指滑动、长按时间判断,双指放大缩小等。
a、判断长按短按,使用示例:

//当一根手指触摸,则进入if分支
                if (Input.touchCount == 1)
                {
                    //记录触摸
                    Touch touch = Input.GetTouch(0);
                    //如果触摸刚开始,则进入if分支
                    if (touch.phase == TouchPhase.Began)
                    {
                        //设置bool触摸为真,且记录时间
                        newTouch = true;
                        touchTime = Time.time;
                        
                    }
                    else if (touch.phase == TouchPhase.Stationary)//如果触摸静止,则进入该分支
                    {
                        //当bool触摸为真,且触摸时间大于等于2秒
                        if (newTouch == true && (Time.time - touchTime) >= 2.0f)
                        {
                            //手指静止长按大于2秒时的操作处理
                        }
                        
                    }
                    else if (touch.phase == TouchPhase.Moved)
                    {
                        if (newTouch == true && (Time.time - touchTime) >= 2.0f)
                        {
                                                     //长按大于2秒并有滑动时的操作处理
                        }

                        //水平上下旋转
                        Vector2 deltaPos = touch.deltaPosition;
                        TargetTrans.Rotate(Vector3.down * deltaPos.x, Space.World);
                        TargetTrans.Rotate(Vector3.right * deltaPos.y, Space.World);
                    }
                    else
                    {
                        //设置bool触摸为假
                        newTouch = false;
                    }
                }

b、结合上虚拟轴的使用,可以更方便地判断当前是左滑动屏幕还是右滑动屏幕

//单点触摸 判断手指滑动 同时排除按住屏幕的情况
        if (1 == Input.touchCount && Input.GetMouseButton(0) == false)
        {
            Touch touch = Input.GetTouch(0);
            Vector2 deltaPos = touch.deltaPosition;
            float XX = Input.GetAxis("Mouse X");
            float YY = Input.GetAxis("Mouse Y");
            //判断左右滑动的距离与上下滑动距离大小
            if (Mathf.Abs(XX) >= Mathf.Abs(YY))
            {
                //单指向左滑动情况
                if (XX < 0)
                {
                    //TargetTrans.Rotate(Vector3.up, 45 * Time.deltaTime, Space.World);
                    TipText.text = "单指向左滑动";
                }
                //单指向右滑动情况
                if (XX > 0)
                {
                    //TargetTrans.Rotate(-Vector3.up, 45 * Time.deltaTime, Space.World);
                    TipText.text = "单指向右滑动";
                }
            }
        }

        Touch newTouch1 = Input.GetTouch(0);
        if (newTouch1.phase == TouchPhase.Ended)
        {
            //触摸结束
        }

c、判断双指缩放示例

        Touch newTouch1 = Input.GetTouch(0);
        Touch newTouch2 = Input.GetTouch(1);

        //第2点刚开始接触屏幕, 只记录,不做处理
        if (newTouch2.phase == TouchPhase.Began)
        {
            oldTouch2 = newTouch2;
            oldTouch1 = newTouch1;
            return;
        }

        //计算老的两点距离和新的两点间距离,变大要放大模型,变小要缩放模型
        float oldDistance = Vector2.Distance(oldTouch1.position, oldTouch2.position);
        float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);

        //两个距离之差,为正表示放大手势, 为负表示缩小手势
        float offset = newDistance - oldDistance;

        //放大因子, 一个像素按 0.01倍来算(100可调整)
        float scaleFactor = offset / 100f;
        Vector3 localScale = transform.localScale;
        Vector3 scale = new Vector3(localScale.x + scaleFactor,
                                    localScale.y + scaleFactor,
                                    localScale.z + scaleFactor);

        //最小缩放到 0.3 倍
        if (scale.x > 0.3f && scale.y > 0.3f && scale.z > 0.3f)
        {
            transform.localScale = scale;
        }

        //记住最新的触摸点,下次使用
        oldTouch1 = newTouch1;
        oldTouch2 = newTouch2;

其他参考:
https://blog.csdn.net/weixin_38745092/article/details/80320972
http://t.zoukankan.com/QG-whz-p-4399405.html
https://blog.csdn.net/aiyan1111111/article/details/52816133?_t_t_t=0.6321927157416025

相关文章

网友评论

      本文标题:六、输入控制:Input类

      本文链接:https://www.haomeiwen.com/subject/sqvtjktx.html