UG4L13——输入处理

本章代码关键字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Stage.isTouchOnUI                    //判断是否点在了UI上
GRoot.inst.touchTarget //获取指向的UI对象
gObject.onTouchBegin.Add() //添加鼠标(左中右键)/手指按下的监听事件
eventContext.inputEvent.button //获取按下的是哪个键
gObject.onTouchMove.Add() //添加按下后移动的监听事件
eventContext.inputEvent.x //获取移动的坐标x轴,是物理屏幕坐标,如果想使用UI坐标需要使用GRoot.inst.GlobalToLocal()转换
eventContext.inputEvent.y //获取移动的坐标y轴,是物理屏幕坐标,如果想使用UI坐标需要使用GRoot.inst.GlobalToLocal()转换
gObject.onTouchEnd.Add() //添加按下后抬起的监听事件
eventContext.CaptureTouch() //按下后移动到对象外部抬起依然可以触发抬起
gObject.onClick.Add() //添加点击的监听事件
gObject.onRightClick.Add() //添加鼠标右键点击的监听事件
gObject.onRollOver.Add() //添加鼠标或手指进入元件的监听事件
gObject.onRollOut.Add() //添加鼠标或手指离开元件的监听事件
eventContext.sender //获取监听事件的触发者(元件)
Stage.inst.touchPosition //鼠标位置或者最后一个手指的位置
Stage.inst.GetTouchPosition() //获取指定手指位置,参数是手指ID,从0开始,按照按下去的顺序分配手指ID
Stage.inst.touchCount //当前按下手指数量
Stage.inst.GetAllTouch() //获得当前所有按下的手指id
LongPressGesture //长按手势类
longPressGesture.onAction.Add() //添加长按手势的监听事件
SwipeGesture //手指滑动手势类
PinchGesture //两指缩放手势类
RotationGesture //两指旋转手势类
Stage.inst.onKeyDown.Add() //添加的监听事件
eventContext.inputEvent.keyCode //获取键盘输入的是哪个键

判断是否点在了UI上

注意:全屏界面,没有设置穿透时,空白区域也是接受输入的,只要是ture​,那就一定是有UI遮挡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Start()
{
//显示面板的方法
UIManager.Instance.ShowPanel<TeachPanel>("teach");
}

void Update()
{

if (Stage.isTouchOnUI)
{
print("鼠标或者手指在UI上");
}
else
{
print("鼠标或者手指不在UI上");
}
}

输出:image

获取指向的UI对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Start()
{
//显示面板的方法
UIManager.Instance.ShowPanel<TeachPanel>("teach");
}

void Update()
{

if (Stage.isTouchOnUI)
{
//可以通过这种方式,得到鼠标或者手指指向的UI对象
print(GRoot.inst.touchTarget.name);
}
}

输出:image

鼠标/触摸相关事件

  1. 鼠标(左中右键)/手指 按下

    如果想要获取是哪个键按下了,需要使用有参方法作为委托,通过传入的EventContext​参数使用inputEvent.button​获取按下的哪个键

    1
    2
    3
    4
    5
    6
    7
    TeachPanel panel = UIManager.Instance.ShowPanel<TeachPanel>("teach");
    panel.m_btnTest.onTouchBegin.Add((data) =>
    {
    print("按下");
    //如果想要获取鼠标哪个键按下:0左键 1右键 2中键
    print(data.inputEvent.button);
    });

    按下按钮时(没有抬起时)就会输出:image

  2. 鼠标/手指 移动

    移动 一定是先按下过后 才会响应的,可用于制作拖曳的逻辑

    如果要得到鼠标移动的坐标,需要使用带EventContext​参数的委托,对传入的EventContext​参数通过inputEvent.x/y​得到移动位置
    注意!得到是物理屏幕坐标,如果想要使用UI坐标需要使用GRoot.inst.GlobalToLocal()​进行一次转换

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    TeachPanel panel = UIManager.Instance.ShowPanel<TeachPanel>("teach");
    panel.m_btnTest.onTouchBegin.Add((data) =>
    {
    print("按下");
    //如果想要获取鼠标哪个键按下:0左键 1右键 2中键
    print(data.inputEvent.button);
    });
    panel.m_btnTest.onTouchMove.Add((data) =>
    {
    print("移动");
    print(new Vector2(data.inputEvent.x, data.inputEvent.y));
    });

    在按下按钮时移动输出:image

  3. 鼠标/手指 抬起

    1
    2
    3
    4
    5
    TeachPanel panel = UIManager.Instance.ShowPanel<TeachPanel>("teach");
    panel.m_btnTest.onTouchEnd.Add((data) =>
    {
    print("抬起");
    });

    在按下按钮并抬起后输出:image

  4. 点击

    点击是按下并直接抬起后才算点击,如果按下后移动则即使抬起也不算点击

    关于按钮的点击的之前的描述可见:gButton.onClick.Add()​

    1
    2
    3
    4
    5
    TeachPanel panel = UIManager.Instance.ShowPanel<TeachPanel>("teach");
    panel.m_btnTest.onClick.Add(() =>
    {
    print("点击");
    });

    按下按钮并直接抬起(不能移动)后输出:image

  5. 鼠标右键点击

    FGUI提供了一个直接监听鼠标右键是否点击的方法,同样,如果按下后移动则即使抬起也不算点击

    1
    2
    3
    4
    5
    TeachPanel panel = UIManager.Instance.ShowPanel<TeachPanel>("teach");
    panel.m_btnTest.onRightClick.Add(() =>
    {
    print("右键点击");
    });

    对按钮右键点击后(不能移动)输出:image

  6. 鼠标或手指进入元件

    如果想要获取进入了哪个元件,需要使用带EventContext​参数的委托,
    通过sender​属性去获取发生事件的元件,再转为GObject​去获取名字

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Start()
    {
    TeachPanel panel = UIManager.Instance.ShowPanel<TeachPanel>(
    panel.m_btnTest.onRollOver.Add(InObject);
    }

    private void InObject(EventContext eventData)
    {
    print("进入了某个对象" + (eventData.sender as GObject).name);
    }

    鼠标进入元件后输出:image

  7. 鼠标或手指离开元件

    如果想要获取离开了哪个元件,需要使用带EventContext​参数的委托,
    通过sender​属性去获取发生事件的元件,再转为GObject​去获取名字

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void Start()
    {
    TeachPanel panel = UIManager.Instance.ShowPanel<TeachPanel>("teach");
    panel.m_btnTest.onRollOut.Add((eventData) =>
    {
    print("离开了某个对象" + (eventData.sender as GObject).name);
    });
    }

    private void InObject(EventContext eventData)
    {
    print("进入了某个对象" + (eventData.sender as GObject).name);
    }

    鼠标离开元件后输出:image

获取当前鼠标或者手指的位置

注意!得到的都是物理屏幕坐标,如果想要使用UI坐标需要使用GRoot.inst.GlobalToLocal()进行一次转换

  • Stage.inst.touchPosition​ 鼠标位置或者最后一个手指的位置

    返回FairyGUI坐标系的坐标,得到是物理屏幕坐标,如果想要使用UI坐标需要使用GRoot.inst.GlobalToLocal()​进行一次转换

    1
    2
    3
    4
    void Update()
    {
    print(Stage.inst.touchPosition);
    }

    输出:image

  • Stage.inst.GetTouchPosition()​ 获取指定手指位置,参数是手指ID,从0开始,按照按下去的顺序分配手指ID

    返回FairyGUI坐标系的坐标,得到是物理屏幕坐标,如果想要使用UI坐标需要使用GRoot.inst.GlobalToLocal()​进行一次转换

    1
    2
    3
    4
    void Update()
    {
    print(Stage.inst.GetTouchPosition(0));
    }

    输出:image

多点触摸

  • Stage.inst.touchCount​ 当前按下手指数量

    1
    int num = Stage.inst.touchCount;
  • Stage.inst.GetAllTouch(null)​ 获得当前所有按下的手指id

    1
    int[] touchIDs = Stage.inst.GetAllTouch(null);
  • ​Input.multiTouchEnabled​ 关闭多点触控

    1
    Input.multiTouchEnabled = false;

手势

  • 长按

    如果要对某个控件监听长按手势,实例化LongPressGesture​类然后对构造函数传入控件
    最后通过onAction.Add()​添加监听方法即可

    1
    2
    3
    4
    5
    6
    TeachPanel panel = UIManager.Instance.ShowPanel<TeachPanel>("teach");
    LongPressGesture gesture = new LongPressGesture(panel.m_btnTest);
    gesture.onAction.Add(() =>
    {
    print("长按");
    });

    当长按按钮时输出:image

  • 手指滑动

    如果要对某个控件监听手指滑动手势,实例化SwipeGesture​类然后对构造函数传入控件
    最后通过onAction.Add()​添加监听方法即可

    1
    2
    3
    4
    5
    SwipeGesture gesture1 = new SwipeGesture(panel.m_btnTest);
    gesture1.onAction.Add(() =>
    {
    print("手指滑动");
    });
  • 两指缩放

    如果要对某个控件监听两指缩放手势,实例化PinchGesture​类然后对构造函数传入控件
    最后通过onAction.Add()​添加监听方法即可

    1
    2
    3
    4
    5
    PinchGesture gesture2 = new PinchGesture(panel.m_btnTest);
    gesture2.onAction.Add(() =>
    {
    print("两指缩放");
    });
  • 两指旋转

    如果要对某个控件监听两指旋转手势,实例化RotationGesture​类然后对构造函数传入控件
    最后通过onAction.Add()​添加监听方法即可

    1
    2
    3
    4
    5
    RotationGesture gesture3 = new RotationGesture(panel.m_btnTest);
    gesture3.onAction.Add(() =>
    {
    print("两指旋转");
    });

键盘输入

该功能主要提供没有监听键盘输入的引擎使用的,在Unity中我们可以不用在意该方法

获取键盘输入的是哪个键,需要使用带EventContext​参数的方法,通过inputEvent.keyCode​来获取

1
2
3
4
Stage.inst.onKeyDown.Add((data) =>
{
print(data.inputEvent.keyCode);
});

按下按键时输出:image