fingerGestures包结构

路径。相对Assets/Plugin/…

描写叙述

FingerGestures/

插件的根文件夹

FingerGestures/Prefabs

能够直接拖放到场景中的预设资源(prefabs)

FingerGestures/Scripts

核心脚本和组件

FingerGestures/Scripts/Gesture Recognizers

每一个手势识别 的脚本

FingerGestures/Scripts/Finger Event Detectors

每一个触摸事件检測器的脚本

FingerGestures/Scripts/Components

手势识别和触摸事件所须要加入的额外组件

FingerGestures/Toolbox

FingerGestures 自带的工具箱脚本

FingerGestures/Samples.unitypackage

全部样例的子包

FingerGestures/PlayMaker Actions.unitypackage

FingerGestures对PlayMaker扩展的插件

Editor/FingerGestures

FingerGestures对编辑器的扩展

FingerGestures样例列表

Finger Event(鼠标或手指事件)

FingerEventsPart1: 展示怎样通过不同的检測器( FingerEventDetectors )去检測鼠标或者手指的上(down)、下(up),按下不移动(stationary。悬停(hover) 事件。

FingerEventsPart2: 展示怎样识别不同鼠标或者手指动作(FingerMotionDetector)。

Gestures(手势)

BasicGestures: 识别单击(react to tap),双击(double tap),拖动(drag)。长按(long——press),滑动(swipe)等基础手势。

PinchAndTwist: 两个或多个手指同一时候在触摸屏上挤压(pinch)或扭转(twist)时,触发手势的事件。

(PS:通常都是用来缩放或旋转)

PointCloudGestures: 示范怎样识别一个点云(point cloud)手势。(PS:一般是指用用户画的图案作为识别)

Toolbox(工具箱)

Camera(放入摄像机的脚本):

Toolbox-DragView: 展示使用TBDragView脚本,实现拖动视角。

Toolbox-Orbit: 展示使用TBOrbit脚本,实现环绕目标旋转视角。

Toolbox-Pan: 展示使用TBPan脚本,实现以自身为轴旋转视角。

Toolbox-PinchZoom: 展示使用TBPinchZoom脚本。实现变焦。

Object-Based(放入普通场景对象的脚本):

Toolbox-Drag: 展示使用TBDrag脚本,实现简单的物体拖动

Toolbox-Hover: 展示使用TBHoverChangeMaterial 和 TBHoverChangeScale脚本,实现当鼠标或者手指悬停在物体上时候的响应。(PS:类似鼠标放到图标上,图标发亮的效果)

Toolbox-PinchToScale 展示使用TBPinchToScale脚本。实现缩放物体

Toolbox-TwistToRotate: 展示使用TBTwistToRotate脚本,实现旋转物体

设置场景

须要在场景中实例化一个FingerGesture组件才可使用。 FingerGesture在项目中的作用是管理用户输入和识别手势和鼠标或手指事件。

有两种加入方式。一是直接把Plugins\FingerGestures\Prefabs下的FingerGestures prefab文件拖入场景中。二是能够创建一个空物件,然后把FingerGestures组件加入进去。

使用Make Persistent标志能够让使FingerGestures 单例在跨场景后一直有效,所以仅仅要保证它在第一个场景设置就足够。

教程:识别一个轻敲手势

该章节会学习到怎样识别一个简单的单击动作。然后到特殊物件的单击动作识别,最后到识别一个三个手指的双击动作。

初始化

第一步。如上章节设置;

第二步。创建一个GameObject 命名为Gestures ;

第三步,给Gestures加入一个TapRecognizer组件。并保持默认设置,你能够在项目面板搜索到它或者直接打开Component > FingerGestures > Gestures > Tap menu item。

TapRecognizer 是当中一种手势识别器。它用于监控用户输入并且当一个有效的单击动作被识别时候工作。

第四步,创建一个新的C# script 叫做 TapTutorial并加入到第二步创建的Gestures中。

轻敲屏幕

第一步。点击TapGestures组件上的Copy Event To Clipboardbutton,它会把TapGesture所须要的时间信号代码copy到黏贴板。

第二步,粘贴到TapTutorial脚本里,例如以下:

public class TapTutorial : MonoBehaviour

{

void OnTap( TapGesture gesture )

{

/* your code here */

}

}

OnTap函数匹配定义在TapRecognizer 组件内的信息名属性,当识别器要识别一个轻敲手势,它会使用unity3d的SendMessage API先向Gestures物件内全部的脚本广播OnTap信息,仅仅要TapTutorial绑定在该物件上,它的OnTap函数就会被调用到。

出于性能考虑,通常使用.net标准的事件模型取代unity3d的SendMessage API。

第三步,改动OnTop函数:

void OnTap( TapGesture gesture )

{

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

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

}

gesture參数包括着手势事件数据。在上面的代码,我们主要输出了位置和TapRecognizer内工作的事件。你还能够在gesture參数内获得很多其它属性,比如通过gesture.Fingers获得鼠标或手指相关的手势列表。还有能够通过gesture.Selection获得当前是哪个场景被轻敲 。

第四步。能够測试,通过敲不同位置。能够看到debug信息输出。

教程:手势识别器

在FingerGesture里,用户的手势都由GestureRecognizers组件来处理,它是顺序处理被识别匹配的用户动作的。

找到GestureRecognizers

每种手势都有自己的脚本,存放脚本的路径在Plugins\FingerGestures\Scripts\Gesture Recognizers 。

你也能够从 Component > FingerGestures > Gestures menu里面找到。

基本使用

要识别一个特殊手势。你须要:

1、加入相应的GestureRecognizer组件到场景中的目标物件。

2、配置它的属性。

3、监听它的手势事件和相应响应。

作为手势事件通知的一部分,GestureRecognizer传递一个包括相关信息(位置。手指触屏点列表。选择的场景物件,相关的GestureRecognizer等)的事件參数。

一个手势识别器有下面监听事件的方式:

1、使用标准的.net 托付事件模型,每个手势识别器都暴露一个.net事件接口。

2、使用unity的SendMessage()函数 :

手势事件将会被广播到游戏对象里全部的组件。

手势事件也能够指向当前相关的场景对象。这时候须要把手势识别器配置到 `Raycaster `组件中才干检測场景对象。

这取决于你的选择。.net的事件模型较为高效,unity的SendMessage()较为方便。

属性

由同一基类派生出来的各种手势识别器共用一个通用配置和一些函数。

比如,我们能够看到TapRecognizer和SwipeRecognizer组件的配置放置在同一个对象里。

设置:

你能够看到。两个组件共用了一部分配置:fingers setup,reset mode,event notification settings,references to additional components...

相同。每一个手势识别器都有自己独特的配置。比如滑动识别器要设置距离阀值、速度、和偏差。而多点触控能够设置最大持续时间等。

事件信息广播:

此处使用SendMessage()函数去通知其它系统。你能够使用Message Name属性去指定响应的函数名。

通常,Message Target会设置你增加的手势识别器组件。但你也能够设置别的对象。

组件:

你能够收到手动指定加入组件。比如:加入一个ScreenRaycaster组件让手势识别器获知场景内对象碰撞。

并把消息发送到对应的监听器。它同意识别器转发消息到正在有关联的场景对象。

教程:轻击手势识别器

属性

Required Taps :连续轻击的次数。

Max Delay Between Taps :两次轻击间最大的时间间隔。(秒)

Movement Tolerance:连续轻敲时候。和第一次轻击的位置相隔的偏差大小。

Max Duration:最大能够识别的手指数。

事件

void OnTap( TapGesture gesture )

{

// 轻击的数量

int taps = gesture.Taps;

}

教程:拖拽手势识别器

属性

Movement Tolerance:最小的拖动距离才触发识别器。

Apply Same Direction Constraint:仅仅能用于多点拖拽。打开后。假设全部点不是向同一个方向拖拽。识别器将不会识别。

事件

void OnDrag( DragGesture gesture )

{

// 当前识别器阶段 (Started/Updated/Ended)

ContinuousGesturePhase phase = gesture.Phase;

// 最后一帧的拖拽/移动数据

Vector2 deltaMove = gesture.DeltaMove;

//完整的拖拽数据

Vector2 totalMove = gesture.TotalMove;

}

教程:滑动手势识别器

属性

Min Distance: 必须滑动的最小距离。

Max Distance:同意滑动的最大距离。

Min Velocity:滑动时候最小速度。

Max Deviation:同意的最大角度偏差。(度)

事件

void OnSwipe( SwipeGesture gesture )

{

// 完整的滑动数据

Vector2 move = gesture.Move;

// 滑动的速度

float velocity = gesture.Velocity;

// 大概的滑动方向

FingerGestures.SwipeDirection direction = gesture.Direction;

}

教程:长按手势识别器

属性

Press Duration:最少长按时间。

Move Tolerance:长按过程中同意的最大移动偏差。

事件

void OnLongPress( LongPressGesture gesture )

{

// 长按持续时间

float elapsed = gesture.ElapsedTime;

}

教程:缩放手势识别器

属性

Minimum DOT :同意的小向量点积。

Minimum Distance:两个手指第一次触屏时候同意的最短路径。

事件

void OnPinch( PinchGesture gesture )

{

// 识别器当前状态(Started/Updated/Ended)

ContinuousGesturePhase phase = gesture.Phase;

// 当前两个手指的距离

float gap = gesture.Gap;

// 当前与上一帧的变动值

float delta = gesture.Delta;

}

教程:旋转手势识别器

属性

Minimum DOT :同意的小向量点积。

Minimum Rotation:必须的最小自旋角度。

事件

void OnTwist( TwistGesture gesture )

{

// 识别器当前状态 (Started/Updated/Ended)

ContinuousGesturePhase phase = gesture.Phase;

// 近期一次角度变化(度)

float delta = gesture.DeltaRotation;

// 总的角度变化(度)

float total = gesture.TotalRotation;

}

桌面仿真

在桌面环境。你能够通过left-CTRL键加上鼠标转轮去调节角度。也能够在Mouse Input Provider配置别的按键。

教程:自己定义手势识别器

自从FingerGestures 3.0之后。能够通过PointCloudRecognizer识别自己定义手势。利用基于$P recognizer 是手势匹配算法实现。

如今仅仅支持单手指操作的识别。将来会支持多点自己定义手势。

点云识别器会对照用户输入和已经设置好的手势模板。然后会返回近期接近的匹配结果,会返回匹配得分和差距值。

点云识别器是规模和方向固定不变的,这就意味着它能够识别画得比較大或者小的,也或者是反方向的(李若:从左到右变成从右到左)。

点云识别器模板

一个模板包含要识别的手势的数据。是通过一个编辑器编辑的。

创建一个模板须要下面步骤:

1:在你的项目编码,右击-> create ->PonitCloud Gesture Template

一个新的模板就好加入到项目里面。能够自己重命名。

2:选择模板然后在 Inspecrot 面板内点击 Edit。

3:然后開始绘图案。

使用点云识别器

第一步:

1:保证场景对象已经设置好了finger gesture的属性。

2:创建一个新的Gestures对象。

3:加入一个PointCloudRecognizer组件。

下面属性须要特别注意。

Max Match Distance:控制识别的精确的程度。

数值越低,越精确。

Sampling Distance: 连贯动作取样时候,两点间隔的最小距离。越小越精确,可是取样会很多其它。

Gesture Templates List:我们指定的模板列表。

第二步:

加入刚刚创建的模板拖放到手势模板列表中。

第三步:

1、创建一个c#文件,此处命名为PointCloudTutorial.cs。

2、在PointCloudRecognizer 以下创建一个手势对象。

3、编辑c#文件:

public class PointCloudTutorial : MonoBehaviour

{

void OnCustomGesture( PointCloudGesture gesture )

{

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

", match score: " + gesture.MatchScore +

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

}

}

手势事件保护以下几个重要属性:

gesture.RecognizedTemplate: 被觉得是最佳匹配的手势模板。

gesture.MatchScore:一个百分比的值,表示匹配的程度。

gesture.MatchDistance:一个測量绝对值,表示匹配程度。

你还能够使用其它手势的属性。

比如位置和选择对象等属性。

用代码创建模板

你能够使用api字自己的编辑器扩展中在执行时候创建手势模板。

void Awake()

{

PointCloudGestureTemplate triangle = ScriptableObject.CreateInstance();

triangle.name = "Triangle Gesture Template";

triangle.BeginPoints();

triangle.AddPoint( 0, 1, 1 );

triangle.AddPoint( 0, 2, 2 );

triangle.AddPoint( 0, 3, 1 );

triangle.AddPoint( 0, 1, 1 );

triangle.EndPoints();

PointCloudGestureTemplate square = ScriptableObject.CreateInstance();

square.name = "Square Gesture Template";

square.BeginPoints();

square.AddPoint( 0, 2, 1 );

square.AddPoint( 0, 2, 3 );

square.AddPoint( 0, 4, 3 );

square.AddPoint( 0, 4, 1 );

square.AddPoint( 0, 2, 1 );

square.EndPoints();

PointCloudRegognizer recognizer = gameObject.AddComponent();

recognizer.AddTemplate( triangle );

recognizer.AddTemplate( square );

}

第一个參数AddPoint是一个笔画的顺序。该api临时仅仅支持单线笔画的手势。

当EndPoints()调用时候。手势模板会被格式化,全部的点都会又一次绘制成0到1范围的数。

教程:识别手指事件

FingerGestures 能够识别向上,向下,悬停,移动,长按等单点输入手势。各种FingerEventDetector组件用于识别相应的手指事件,与 GestureRecognizers类似,都是通过广播信息去触发。

FingerEventDetector

全部的手指事件识别器都派生与一个基础抽象类。通常。每一个FingerEventDetector实例监控着全部手指事件信号。

也能够配置Finger Index Filter属性。让其仅仅跟踪特定的手指事件。

和手势识别器一样。手指事件识别器传递一个事件数据对象,改该对象派生于FingerEvent类。包括下面属性:

属性

类型

描写叙述

Name

string

消息的名字

Detector

FingerEventDetector

该次事件中的手指事件识别器

Finger

FingerGestures.Finger

该次事件中的手指类

Position

Vector2

事件所发生的位置

Selection

GameObject

被选中游戏对象 (依赖`ScreenRaycaster `组件)

Hit/td>

RaycastHit

光线投射碰撞,由`ScreenRaycaster`提供,在正常显示上很实用

FingerUpDetector

void OnFingerUp( FingerUpEvent e )

{

//手指已经持续的时间

float elapsedTime = e.TimeHeldDown;

}

FingerHoverDetector

void OnFingerHover( FingerHoverEvent e )

{

// 检查状态,是进入还是离开.

if( e.Phase == FingerHoverPhase.Enter )

{

Debug.Log( e.Finger + " entered object: " + e.Selection );

}

else if( e.Phase == FingerHoverPhase.Exit )

{

Debug.Log( e.Finger + " exited object: " + e.Selection );

}

}

FingerMotionDetector

该识别器可以识别两种事件。

1、OnFingerMove :当手指位置距离上一帧位置有发生变化。

2、OnFingerStationary :当手指与上一帧位置一样。

void OnFingerMove( FingerMotionEvent e )

{

float elapsed = e.ElapsedTime;

if( e.Phase == FingerMotionPhase.Started )

Debug.Log( e.Finger + " started moving at " + e.Position);

else if( e.Phase == FingerMotionPhase.Updated )

Debug.Log( e.Finger + " moving at " + e.Position );

else if( e.Phase == FingerMotionPhase.Ended )

Debug.Log( e.Finger + " stopped moving at " + e.Position );

}

void OnFingerStationary( FingerMotionEvent e )

{

float elapsed = e.ElapsedTime;

if( e.Phase == FingerMotionPhase.Started )

Debug.Log( e.Finger + " started stationary state at " + e.Position );

else if( e.Phase == FingerMotionPhase.Updated )

Debug.Log( e.Finger + " is still stationary at " + e.Position );

else if( e.Phase == FingerMotionPhase.Ended )

Debug.Log( e.Finger + " stopped being stationary at " + e.Position );

}

建议:使用.net代理事件

当使用unity的SendMessage()函数广播事件消息很方便。可是效率低并且不够.NET代理事件灵活。

* Gesture Events

每一个手势识别器都暴露一个公共的OnGesture.NET事件,能够匹配手势事件和手指事件。使用方法跟用SendMessage()一样。

[RequireComponent( typeof( TapGesture ) )]

public class TapTutorial : MonoBehaviour

{

void Start()

{

// 在对象里面寻找轻击事件识别器

TapRecognizer tap = GetComponent();

// 订阅它的.NET事件

tap.OnGesture += MyTapEventHandler;

}

void MyTapEventHandler( TapGesture gesture )

{

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

}

}

有时候你须要停止监听事件。你能够用下面办法:

tap.OnGesture -= MyTapEventHandler;

注意停止监听事件时候相关对象的生命周期,有可能会导致内存泄露,这是.NET代理事件的陷阱。

第二种方法是,FingerGestures单例暴露一个全局的OnGestureEvent钩子。能够监听到不论什么手势事件。

void Start()

{

FingerGestures.OnGestureEvent += FingerGestures_OnGestureEvent;

}

void FingerGestures_OnGestureEvent( Gesture gesture )

{

Debug.Log( gesture.Recognizer.name + " fired its gesture event" );

if( gesture is TapGesture )

Debug.Log( "Tapped: " + ((TapGesture)gesture).Taps );

}

Finger Event

跟上面类似使用方法。

FingerUpDetector.OnFingerUp( FingerUpEvent e )

FingerDownDetector.OnFingerDown( FingerDownEvent e )

FingerHoverDetector.OnFingerHover( FingerHoverEvent e )

FingerMotionDetector.OnFingerMove( FingerMotionEvent e )

FingerMotionDetector.OnFingerStationary( FingerMotionEvent e )

FingerGestures.OnFingerEvent( FingerEvent e )

--EOF

文件夹

fingerGestures包结构

路径,相对Assets/Plugin/…

描写叙述

FingerGestures/

插件的根文件夹

FingerGestures/Prefabs

能够直接拖放到场景中的预设资源(prefabs)

FingerGestures/Scripts

核心脚本和组件

FingerGestures/Scripts/Gesture Recognizers

每一个手势识别 的脚本

FingerGestures/Scripts/Finger Event Detectors

每一个触摸事件检測器的脚本

FingerGestures/Scripts/Components

手势识别和触摸事件所须要加入的额外组件

FingerGestures/Toolbox

FingerGestures 自带的工具箱脚本

FingerGestures/Samples.unitypackage

全部样例的子包

FingerGestures/PlayMaker Actions.unitypackage

FingerGestures对PlayMaker扩展的插件

Editor/FingerGestures

FingerGestures对编辑器的扩展

FingerGestures样例列表

Finger Event(鼠标或手指事件)

FingerEventsPart1: 展示怎样通过不同的检測器( FingerEventDetectors )去检測鼠标或者手指的上(down)、下(up),按下不移动(stationary。悬停(hover) 事件。

FingerEventsPart2: 展示怎样识别不同鼠标或者手指动作(FingerMotionDetector)。

Gestures(手势)

BasicGestures: 识别单击(react to tap)。双击(double tap),拖动(drag)。长按(long——press),滑动(swipe)等基础手势。

PinchAndTwist: 两个或多个手指同一时候在触摸屏上挤压(pinch)或扭转(twist)时,触发手势的事件。(PS:通常都是用来缩放或旋转)

PointCloudGestures: 示范怎样识别一个点云(point cloud)手势。(PS:一般是指用用户画的图案作为识别)

Toolbox(工具箱)

Camera(放入摄像机的脚本):

Toolbox-DragView: 展示使用TBDragView脚本,实现拖动视角。

Toolbox-Orbit: 展示使用TBOrbit脚本。实现环绕目标旋转视角。

Toolbox-Pan: 展示使用TBPan脚本。实现以自身为轴旋转视角。

Toolbox-PinchZoom: 展示使用TBPinchZoom脚本,实现变焦。

Object-Based(放入普通场景对象的脚本):

Toolbox-Drag: 展示使用TBDrag脚本,实现简单的物体拖动

Toolbox-Hover: 展示使用TBHoverChangeMaterial 和 TBHoverChangeScale脚本,实现当鼠标或者手指悬停在物体上时候的响应。(PS:类似鼠标放到图标上,图标发亮的效果)

Toolbox-PinchToScale 展示使用TBPinchToScale脚本,实现缩放物体

Toolbox-TwistToRotate: 展示使用TBTwistToRotate脚本。实现旋转物体

设置场景

须要在场景中实例化一个FingerGesture组件才可使用。 FingerGesture在项目中的作用是管理用户输入和识别手势和鼠标或手指事件。

有两种加入方式,一是直接把Plugins\FingerGestures\Prefabs下的FingerGestures prefab文件拖入场景中。二是能够创建一个空物件,然后把FingerGestures组件加入进去。

使用Make Persistent标志能够让使FingerGestures 单例在跨场景后一直有效,所以仅仅要保证它在第一个场景设置就足够。

教程:识别一个轻敲手势

该章节会学习到怎样识别一个简单的单击动作,然后到特殊物件的单击动作识别,最后到识别一个三个手指的双击动作。

初始化

第一步,如上章节设置;

第二步。创建一个GameObject 命名为Gestures ;

第三步,给Gestures加入一个TapRecognizer组件,并保持默认设置。你能够在项目面板搜索到它或者直接打开Component > FingerGestures > Gestures > Tap menu item。

TapRecognizer 是当中一种手势识别器,它用于监控用户输入并且当一个有效的单击动作被识别时候工作。

第四步。创建一个新的C# script 叫做 TapTutorial并加入到第二步创建的Gestures中。

轻敲屏幕

第一步,点击TapGestures组件上的Copy Event To Clipboardbutton,它会把TapGesture所须要的时间信号代码copy到黏贴板。

第二步。粘贴到TapTutorial脚本里,例如以下:

public class TapTutorial : MonoBehaviour

{

void OnTap( TapGesture gesture )

{

/* your code here */

}

}

OnTap函数匹配定义在TapRecognizer 组件内的信息名属性,当识别器要识别一个轻敲手势。它会使用unity3d的SendMessage API先向Gestures物件内全部的脚本广播OnTap信息。仅仅要TapTutorial绑定在该物件上,它的OnTap函数就会被调用到。

出于性能考虑。通常使用.net标准的事件模型取代unity3d的SendMessage API。

第三步。改动OnTop函数:

void OnTap( TapGesture gesture )

{

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

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

}

gesture參数包括着手势事件数据,在上面的代码。我们主要输出了位置和TapRecognizer内工作的事件。

你还能够在gesture參数内获得很多其它属性,比如通过gesture.Fingers获得鼠标或手指相关的手势列表,还有能够通过gesture.Selection获得当前是哪个场景被轻敲 。

第四步。能够測试。通过敲不同位置。能够看到debug信息输出。

教程:手势识别器

在FingerGesture里,用户的手势都由GestureRecognizers组件来处理。它是顺序处理被识别匹配的用户动作的。

找到GestureRecognizers

每种手势都有自己的脚本,存放脚本的路径在Plugins\FingerGestures\Scripts\Gesture Recognizers 。

你也能够从 Component > FingerGestures > Gestures menu里面找到。

基本使用

要识别一个特殊手势,你须要:

1、加入相应的GestureRecognizer组件到场景中的目标物件。

2、配置它的属性。

3、监听它的手势事件和相应响应。

作为手势事件通知的一部分。GestureRecognizer传递一个包括相关信息(位置。手指触屏点列表,选择的场景物件。相关的GestureRecognizer等)的事件參数。

一个手势识别器有下面监听事件的方式:

1、使用标准的.net 托付事件模型。每个手势识别器都暴露一个.net事件接口。

2、使用unity的SendMessage()函数 :

手势事件将会被广播到游戏对象里全部的组件。

手势事件也能够指向当前相关的场景对象。这时候须要把手势识别器配置到 `Raycaster `组件中才干检測场景对象。

这取决于你的选择。.net的事件模型较为高效,unity的SendMessage()较为方便。

属性

由同一基类派生出来的各种手势识别器共用一个通用配置和一些函数。

比如,我们能够看到TapRecognizer和SwipeRecognizer组件的配置放置在同一个对象里。

设置:

你能够看到,两个组件共用了一部分配置:fingers setup,reset mode,event notification settings,references to additional components...

相同,每一个手势识别器都有自己独特的配置。比如滑动识别器要设置距离阀值、速度、和偏差。而多点触控能够设置最大持续时间等。

事件信息广播:

此处使用SendMessage()函数去通知其它系统。

你能够使用Message Name属性去指定响应的函数名。

通常,Message Target会设置你增加的手势识别器组件。但你也能够设置别的对象。

组件:

你能够收到手动指定加入组件。比如:加入一个ScreenRaycaster组件让手势识别器获知场景内对象碰撞。并把消息发送到对应的监听器。它同意识别器转发消息到正在有关联的场景对象。

教程:轻击手势识别器

属性

Required Taps :连续轻击的次数。

Max Delay Between Taps :两次轻击间最大的时间间隔。

(秒)

Movement Tolerance:连续轻敲时候,和第一次轻击的位置相隔的偏差大小。

Max Duration:最大能够识别的手指数。

事件

void OnTap( TapGesture gesture )

{

// 轻击的数量

int taps = gesture.Taps;

}

教程:拖拽手势识别器

属性

Movement Tolerance:最小的拖动距离才触发识别器。

Apply Same Direction Constraint:仅仅能用于多点拖拽,打开后。假设全部点不是向同一个方向拖拽,识别器将不会识别。

事件

void OnDrag( DragGesture gesture )

{

// 当前识别器阶段 (Started/Updated/Ended)

ContinuousGesturePhase phase = gesture.Phase;

// 最后一帧的拖拽/移动数据

Vector2 deltaMove = gesture.DeltaMove;

//完整的拖拽数据

Vector2 totalMove = gesture.TotalMove;

}

教程:滑动手势识别器

属性

Min Distance: 必须滑动的最小距离。

Max Distance:同意滑动的最大距离。

Min Velocity:滑动时候最小速度。

Max Deviation:同意的最大角度偏差。(度)

事件

void OnSwipe( SwipeGesture gesture )

{

// 完整的滑动数据

Vector2 move = gesture.Move;

// 滑动的速度

float velocity = gesture.Velocity;

// 大概的滑动方向

FingerGestures.SwipeDirection direction = gesture.Direction;

}

教程:长按手势识别器

属性

Press Duration:最少长按时间。

Move Tolerance:长按过程中同意的最大移动偏差。

事件

void OnLongPress( LongPressGesture gesture )

{

// 长按持续时间

float elapsed = gesture.ElapsedTime;

}

教程:缩放手势识别器

属性

Minimum DOT :同意的小向量点积。

Minimum Distance:两个手指第一次触屏时候同意的最短路径。

事件

void OnPinch( PinchGesture gesture )

{

// 识别器当前状态(Started/Updated/Ended)

ContinuousGesturePhase phase = gesture.Phase;

// 当前两个手指的距离

float gap = gesture.Gap;

// 当前与上一帧的变动值

float delta = gesture.Delta;

}

教程:旋转手势识别器

属性

Minimum DOT :同意的小向量点积。

Minimum Rotation:必须的最小自旋角度。

事件

void OnTwist( TwistGesture gesture )

{

// 识别器当前状态 (Started/Updated/Ended)

ContinuousGesturePhase phase = gesture.Phase;

// 近期一次角度变化(度)

float delta = gesture.DeltaRotation;

// 总的角度变化(度)

float total = gesture.TotalRotation;

}

桌面仿真

在桌面环境。你能够通过left-CTRL键加上鼠标转轮去调节角度。也能够在Mouse Input Provider配置别的按键。

教程:自己定义手势识别器

自从FingerGestures 3.0之后,能够通过PointCloudRecognizer识别自己定义手势。利用基于$P recognizer 是手势匹配算法实现。

如今仅仅支持单手指操作的识别,将来会支持多点自己定义手势。

点云识别器会对照用户输入和已经设置好的手势模板,然后会返回近期接近的匹配结果,会返回匹配得分和差距值。

点云识别器是规模和方向固定不变的,这就意味着它能够识别画得比較大或者小的,也或者是反方向的(李若:从左到右变成从右到左)。

点云识别器模板

一个模板包含要识别的手势的数据。是通过一个编辑器编辑的。

创建一个模板须要下面步骤:

1:在你的项目编码。右击-> create ->PonitCloud Gesture Template

一个新的模板就好加入到项目里面,能够自己重命名。

2:选择模板然后在 Inspecrot 面板内点击 Edit。

3:然后開始绘图案。

使用点云识别器

第一步:

1:保证场景对象已经设置好了finger gesture的属性。

2:创建一个新的Gestures对象。

3:加入一个PointCloudRecognizer组件。

下面属性须要特别注意。

Max Match Distance:控制识别的精确的程度。数值越低。越精确。

Sampling Distance: 连贯动作取样时候,两点间隔的最小距离。

越小越精确,可是取样会很多其它。

Gesture Templates List:我们指定的模板列表。

第二步:

加入刚刚创建的模板拖放到手势模板列表中。

第三步:

1、创建一个c#文件。此处命名为PointCloudTutorial.cs。

2、在PointCloudRecognizer 以下创建一个手势对象。

3、编辑c#文件:

public class PointCloudTutorial : MonoBehaviour

{

void OnCustomGesture( PointCloudGesture gesture )

{

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

", match score: " + gesture.MatchScore +

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

}

}

手势事件保护以下几个重要属性:

gesture.RecognizedTemplate: 被觉得是最佳匹配的手势模板。

gesture.MatchScore:一个百分比的值,表示匹配的程度。

gesture.MatchDistance:一个測量绝对值,表示匹配程度。

你还能够使用其它手势的属性。 比如位置和选择对象等属性。

用代码创建模板

你能够使用api字自己的编辑器扩展中在执行时候创建手势模板。

void Awake()

{

PointCloudGestureTemplate triangle = ScriptableObject.CreateInstance();

triangle.name = "Triangle Gesture Template";

triangle.BeginPoints();

triangle.AddPoint( 0, 1, 1 );

triangle.AddPoint( 0, 2, 2 );

triangle.AddPoint( 0, 3, 1 );

triangle.AddPoint( 0, 1, 1 );

triangle.EndPoints();

PointCloudGestureTemplate square = ScriptableObject.CreateInstance();

square.name = "Square Gesture Template";

square.BeginPoints();

square.AddPoint( 0, 2, 1 );

square.AddPoint( 0, 2, 3 );

square.AddPoint( 0, 4, 3 );

square.AddPoint( 0, 4, 1 );

square.AddPoint( 0, 2, 1 );

square.EndPoints();

PointCloudRegognizer recognizer = gameObject.AddComponent();

recognizer.AddTemplate( triangle );

recognizer.AddTemplate( square );

}

第一个參数AddPoint是一个笔画的顺序,该api临时仅仅支持单线笔画的手势。

当EndPoints()调用时候,手势模板会被格式化,全部的点都会又一次绘制成0到1范围的数。

教程:识别手指事件

FingerGestures 能够识别向上,向下,悬停。移动,长按等单点输入手势。各种FingerEventDetector组件用于识别相应的手指事件。与 GestureRecognizers类似,都是通过广播信息去触发。

FingerEventDetector

全部的手指事件识别器都派生与一个基础抽象类。

通常。每一个FingerEventDetector实例监控着全部手指事件信号。

也能够配置Finger Index Filter属性,让其仅仅跟踪特定的手指事件。

和手势识别器一样,手指事件识别器传递一个事件数据对象,改该对象派生于FingerEvent类,包括下面属性:

属性

类型

描写叙述

Name

string

消息的名字

Detector

FingerEventDetector

该次事件中的手指事件识别器

Finger

FingerGestures.Finger

该次事件中的手指类

Position

Vector2

事件所发生的位置

Selection

GameObject

被选中游戏对象 (依赖`ScreenRaycaster `组件)

Hit/td>

RaycastHit

光线投射碰撞。由`ScreenRaycaster`提供,在正常显示上很实用

FingerUpDetector

void OnFingerUp( FingerUpEvent e )

{

//手指已经持续的时间

float elapsedTime = e.TimeHeldDown;

}

FingerHoverDetector

void OnFingerHover( FingerHoverEvent e )

{

// 检查状态,是进入还是离开.

if( e.Phase == FingerHoverPhase.Enter )

{

Debug.Log( e.Finger + " entered object: " + e.Selection );

}

else if( e.Phase == FingerHoverPhase.Exit )

{

Debug.Log( e.Finger + " exited object: " + e.Selection );

}

}

FingerMotionDetector

该识别器可以识别两种事件。

1、OnFingerMove :当手指位置距离上一帧位置有发生变化。

2、OnFingerStationary :当手指与上一帧位置一样。

void OnFingerMove( FingerMotionEvent e )

{

float elapsed = e.ElapsedTime;

if( e.Phase == FingerMotionPhase.Started )

Debug.Log( e.Finger + " started moving at " + e.Position);

else if( e.Phase == FingerMotionPhase.Updated )

Debug.Log( e.Finger + " moving at " + e.Position );

else if( e.Phase == FingerMotionPhase.Ended )

Debug.Log( e.Finger + " stopped moving at " + e.Position );

}

void OnFingerStationary( FingerMotionEvent e )

{

float elapsed = e.ElapsedTime;

if( e.Phase == FingerMotionPhase.Started )

Debug.Log( e.Finger + " started stationary state at " + e.Position );

else if( e.Phase == FingerMotionPhase.Updated )

Debug.Log( e.Finger + " is still stationary at " + e.Position );

else if( e.Phase == FingerMotionPhase.Ended )

Debug.Log( e.Finger + " stopped being stationary at " + e.Position );

}

建议:使用.net代理事件

当使用unity的SendMessage()函数广播事件消息很方便,可是效率低并且不够.NET代理事件灵活。

* Gesture Events

每一个手势识别器都暴露一个公共的OnGesture.NET事件,能够匹配手势事件和手指事件。

使用方法跟用SendMessage()一样。

[RequireComponent( typeof( TapGesture ) )]

public class TapTutorial : MonoBehaviour

{

void Start()

{

// 在对象里面寻找轻击事件识别器

TapRecognizer tap = GetComponent();

// 订阅它的.NET事件

tap.OnGesture += MyTapEventHandler;

}

void MyTapEventHandler( TapGesture gesture )

{

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

}

}

有时候你须要停止监听事件。你能够用下面办法:

tap.OnGesture -= MyTapEventHandler;

注意停止监听事件时候相关对象的生命周期,有可能会导致内存泄露。这是.NET代理事件的陷阱。

第二种方法是。FingerGestures单例暴露一个全局的OnGestureEvent钩子,能够监听到不论什么手势事件。

void Start()

{

FingerGestures.OnGestureEvent += FingerGestures_OnGestureEvent;

}

void FingerGestures_OnGestureEvent( Gesture gesture )

{

Debug.Log( gesture.Recognizer.name + " fired its gesture event" );

if( gesture is TapGesture )

Debug.Log( "Tapped: " + ((TapGesture)gesture).Taps );

}

Finger Event

跟上面类似使用方法。

FingerUpDetector.OnFingerUp( FingerUpEvent e )

FingerDownDetector.OnFingerDown( FingerDownEvent e )

FingerHoverDetector.OnFingerHover( FingerHoverEvent e )

FingerMotionDetector.OnFingerMove( FingerMotionEvent e )

FingerMotionDetector.OnFingerStationary( FingerMotionEvent e )

FingerGestures.OnFingerEvent( FingerEvent e )

--EOF

ugui 转轮_unity3D的FingerGestures小工具相关推荐

  1. ugui 转轮_Unity3D研究院之Android NDK编译C/C++结合Unity实现本地数据共享(二十八)...

    开始本篇文章之前我先为大家简单的介绍一下Android NDK编程的原理, 我们知道Android开发使用JAVA语言来编程它的运行效率要比C/C++低很多,为了让JAVA语言可以调用 C/C++ 这 ...

  2. 【Unity3D小工具】Unity3D中实现仿真时钟、表盘、仿原神时钟

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦. 一.前言 ...

  3. 分享一个小工具:Excel表高速转换成JSON字符串

    在游戏项目中一般都须要由策划制作大量的游戏内容,当中非常大一部分是使用Excel表来制作的.于是程序就须要把Excel文件转换成程序方便读取的格式. 之前项目使用的Excel表导入工具都是通过Offi ...

  4. 代码整理工具_程序员软件:程序员有哪些常用又好用的编码小工具?

    最近,有很多朋友让我帮忙整理一下程序员有哪些常用又好用的编码小工具.今天,小编就整理一下哦,希望大家一起学习,一起进步! 1. Notepad++ Notepad++中文版是一款非常有特色的编辑器,是 ...

  5. python自动翻译小工具_Python实现翻译小工具

    一.背景 利用Requests模块获取有道词典web页面的post信息,BeautifulSoup来获取需要的内容,通过tkinter模块生成gui界面. 二.代码 git源码地址 Python实现翻 ...

  6. 实用c语言函数源码,C语言编写简单朗读小工具(有源码)

    原标题:C语言编写简单朗读小工具(有源码) 最近不少人在后台留言说学C都是面对枯燥的控制台程序,能不能体现一下C语言的实际用途,今天我们就理论结合实践一把:C语言结合VBS脚本编写一个简单的朗读小工具 ...

  7. 【青少年编程】黄羽恒:翻译小工具 -- 利用百度翻译

    「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复[Scratch]或[Python],即可进入.如果加入了之前的社群不需要重复加入. 微信后台回复"资料下载&quo ...

  8. 【青少年编程】黄羽恒:翻译小工具 -- 利用有道翻译

    「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复[Scratch]或[Python],即可进入.如果加入了之前的社群不需要重复加入. 微信后台回复"资料下载&quo ...

  9. 太强了,Python 开发桌面小工具,让代码替我们干重复的工作~

    作者 | Cherish 来源 | 杰哥的IT之旅 决定写这篇文章的初衷是来源于一位小伙伴的问题,关于"如何根据数据源用 Python 自动生成透视表",这个问题背后有个非常好的解 ...

  10. 把python语言翻译出来_Python语言实现翻译小工具(Python打包成exe文件)

    本文主要向大家介绍了Python语言实现翻译小工具(Python打包成exe文件),通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 1.环境 windows10 python3.5 ...

最新文章

  1. 【NCEPU】凌亮:Linux实践
  2. c 语言set用法,使用
  3. python常见错误集合
  4. 基于Nginx实现10万+并发,你应该做的Linux内核优化
  5. python处理流程-Python异常处理大全(二)
  6. 算术运算导致溢出_CPU的控制器与运算器
  7. CCF 2018-3-1跳一跳
  8. 天才少年创世纪:从创建应用程序,到被哈佛录取、登上头条
  9. 问题六:C++中是干嘛用的(引用类型)
  10. cad查看_微信接收图纸dwg怎么打开?如何手机查看CAD图纸,三步免费教你
  11. java网店系统 开源_网店系统javashop发布其开源框架,遵循GPL协议
  12. 类似这种问题解决方法 version `CXXABI_1.3.8' not found (required by ragel)'
  13. 网易编程题之地牢逃脱
  14. 【百度春招】 买帽子
  15. python自学行吗知乎_怎么自学python,大概要多久?
  16. JTAG、JLink、ULINK、ST-LINK仿真器区别
  17. 图文档管理系统-让企业图文档管理“井井有条”
  18. 漫步凸分析十一——分离定理
  19. Django中间件介绍和使用
  20. Moom Mac版使用教程:如何通过键盘触发基于鼠标的调整大小网格?

热门文章

  1. CADD课程学习(13)-- 研究蛋白小分子动态相互作用-II(水中的溶菌酶 GROMACS)
  2. html简单图片轮播的实现
  3. keepalived+nginx,haproxy
  4. GUI学习笔记——04更改背景板颜色,鼠标进入事件
  5. Color---颜色对照表
  6. 三国时代微博(佩服博主琢磨先生太有才了!)
  7. UVA - 1589 Xiangqi
  8. OpenCore 黑苹果安装教程
  9. xp系统不能搭建信息服务器地址,XP系统出现“automation 服务器不能创建对象”提示怎么办...
  10. ASP,PHP,ASPX生成静态页大全