[Unity插件] FingerGestures

FingerGestures是一款强大的手势识别插件,支持鼠标和触控。跨平台,最新的3.0版本支持自定义手势识别。 

其中CustomGestures的识别还是挺准的。测试画个一笔五角星,能被容易的识别。

直接解压包,里面还有samples和对playerMaker拓展 2个子包。

二.导入Sample包

在搜索栏里输入 t:scene,  然后全选场景并拖入Build Setting里的Scenes in Build

把'Sample Browser'场景调整到第一个场景

也可在player setting里把屏幕设置为600x400


三.基本识别  GestureRecognizers(检测用户输入并发送事件)

场景里必须只有一个FingerGestures组件示例。它相当于Manager。

(1)直接新建GameObject起名Manager,并加FingerGestures脚本

(2)直接新建GameObject起名Gestures,并加TapRecognizer脚本

直接新建TapTutorial.cs 并放到Gestures上

Gestures里TapRecognizer面板下,点"Copy Event To Clipboard" 把对应代码拷贝到粘贴板上,并在TapTutorial脚本里粘贴代码。

当recognizer检测对应输入到后, 会在obj上发对应的SendMessage消息。但是SendMessage开销大,可以自己实现开销更小的delegate-based events.


(5)打输出debug信息的代码

using UnityEngine;

using System.Collections;

publicclass TapTutorial : MonoBehaviour

 OnTap(TapGesture gesture)

  Debug.Log( "Tap gesture detected at " + gesture.Position + 

            ". It was sent by " + gesture.Recognizer.name );

识别单击物体

(1)创建球,确保有collider或者trigger,位置(0,1,0),缩放(4,4,4)

(2)Gesture物体上加 ScreenRaycaster

当Ray Thickness为0时  可以是collider或者trigger,

当Ray Thickness不为0时  必须是collider, 可以模拟厚手指的操作。


(2)  脚本变为

using UnityEngine;

using System.Collections;

public class TapTutorial : MonoBehaviour

OnTap( TapGesture gesture ) 

    ( gesture.Selection )

        Debug.Log( "Tapped object: " + gesture.Selection.name );

        Debug.Log( "No object was tapped at " + gesture.Position );

之后就能检测到点击物体了,并且被点击的圆球同样的收到同名事件

识别2手指Tap3下

设置 Required Finger Count为2

设置 Required Taps为3

如果是电脑运行,用鼠标左右键同时按模拟

四.FingerEventDetector

检测单手指的按下 松开 经过 移动 静止,与GesturesRecognizers类似,发消息,用ScreenRaycaster与物体互动。

FingerEventDetector是抽象类,各种finger event detectors继承自它。

也可以提供finger index跟踪某指定手指。

(1)新场景,加FingerGestures管理

(2)新物体起名FingerEvent,并加FingerDownDetector

(3)新建脚本FingerEventTutor.cs, 并从FingerDownDetector拷贝粘贴脚本

using UnityEngine;

using System.Collections;

public class FingerEventTutor : MonoBehaviour

OnFingerDown(FingerDownEvent e) 

Debug.Log( e.Finger + " Down at " + e.Position + " on object:" + e.Selection );

点击运行,即可检测任何手指按下的事件。

每个手指事件都要添加对应的detector


using UnityEngine;

using System.Collections;

public class FingerEventTutor : MonoBehaviour

OnFingerDown(FingerDownEvent e) 

Debug.Log( e.Finger + " Down at " + e.Position + " on object:" + e.Selection );

OnFingerUp( FingerUpEvent e ) 

// time the finger has been held down before being released

    float elapsedTime = e.TimeHeldDown;

Debug.Log( e.Finger + " Up at " + e.Position + " on object:" + e.Selection );

五.自定义手势识别

3.0后可以用PointCloudRecognizer来识别自定义手势。算法使用的是$P recognizer. 现在只支持single-stroke(单手指单次画),将会支持multi-strokes. 

PointCloudRecognizer将会对比一些gesture模板并返回最接近的 匹配图形,并返回分数和距离值。

PointCloud gestures手势,和缩放以及画的方向无关。但是图形的旋转必须是固定的,例如一个正着摆放的三角形你必须画正的,你画一个倒着摆放的三角形它是不能被识别的。

绘制PointCloud

(1)在Assets栏下,创建 PointCloud Gesture Template,起名MyPCGesture

(2)点击Edit,绘制图形,然后Apply

使用PointCloud

(1)新场景,加FingerGestures管理

(2)创建新的物体起名Gestures

Gestures加 PointCloudRecognizer 组件。

Max Match Distance 用户画的图形distance必须在该值之下, 设定得越小,画得就必须越精确。

Sampling Distance  两个连续手指位置的最小间距。越小表示越精确,但更多的采样

Gesture Template List  要去匹配的图形库

MyPCGesture加至 Gesture Template List

(5) 创建PointCloudTutorial.cs脚本并添加至Gestures物体下

using UnityEngine;

using System.Collections;

public class PointCloudTutorial : MonoBehaviour

     OnCustomGesture( PointCloudGesture gesture ) 

        Debug.Log( "Recognized custom gesture: " + gesture.RecognizedTemplate.name + 

            ", match score: " + gesture.MatchScore + 

            ", match distance: " + gesture.MatchDistance );

PointCloudGesture. RecognizedTemplate 对应画出的图形模板

PointCloudGesture. MatchScore 匹配百分比,1代表完美匹配

PointCloudGesture. MatchDistance 与图形有多接近

当然也可以从代码绘制PointCloudGestureTemplate 

Awake()

    PointCloudGestureTemplate triangle = ScriptableObject.CreateInstance<PointCloudGestureTemplate>();

    triangle.name = "Triangle Gesture Template"

    triangle.BeginPoints();

    triangle.AddPoint( , , );

    triangle.AddPoint( , , );

    triangle.AddPoint( , , );

    triangle.AddPoint( , , );

    triangle.EndPoints();

    PointCloudGestureTemplate square = ScriptableObject.CreateInstance<PointCloudGestureTemplate>();

    square.name = "Square Gesture Template"

    square.BeginPoints();

    square.AddPoint( , , );

    square.AddPoint( , , );

    square.AddPoint( , , );

    square.AddPoint( , , );

    square.AddPoint( , , );

    square.EndPoints();

    PointCloudRegognizer recognizer = gameObject.AddComponent<PointCloudRegognizer>();

    recognizer.AddTemplate( triangle );

    recognizer.AddTemplate( square );

AddPoint的第一个参数代表第几画,但是现在只支持一笔画出来的图形,所以该值只填0。当EndPoints()被调用的时候,所有点都会被单位化至(0,1)的范围。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容