FingerGestures研究院之初探Unity手势操作

最近研究了一下Unity中的一个手势操作的插件FingerGestures。它能很方便监听到Unity中的各种手势事件:上下左右四方向的滑动事件、按下事件、抬起事件、移动事件、连击事件、长按事件等等。它同时支持触摸屏操作与鼠标操作,总起来说使用起来还是比较方便的,今天写下教程记录这个插件的详细使用步骤。首先下载这个插件,大家可以在圣典上找这个插件的下载地址,当然也可以在本文最后下载该插件。

 我看了一下这个插件底层的实现步骤,他是通过C#代理的形式来实现手势操作的。如下图红圈内所示,这五个重要的预设用来监听触摸与鼠标的手势事件。包括:单手触摸事件、双手触摸事件、鼠标事件、触摸事件。这里我们使用一个单手的事件,如图中所示将Finger Gertures Initializer拖拽入左侧层次视图中。

OK,上面我们说了该插件是通过C#代理形式来接收事件消息的,所以我们需要用脚本来注册这些事件从而开始接收消息。接着创建一个立方体对象用以处理手势操作,当然你也可以处理游戏中的任何对象。编写脚本FingerEvent.cs ,把这个脚本挂在这个立方体对象之上。

FingerEvent.cs脚本 

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

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

using UnityEngine;

using System.Collections;

public class FingerEvent :  MonoBehaviour {

void OnEnable()

{

//启动时调用,这里开始注册手势操作的事件。

//按下事件: OnFingerDown就是按下事件监听的方法,这个名子可以由你来自定义。方法只能在本类中监听。下面所有的事件都一样!!!

FingerGestures.OnFingerDown += OnFingerDown;

//抬起事件

FingerGestures.OnFingerUp += OnFingerUp;

//开始拖动事件

FingerGestures.OnFingerDragBegin += OnFingerDragBegin;

//拖动中事件...

FingerGestures.OnFingerDragMove += OnFingerDragMove;

//拖动结束事件

FingerGestures.OnFingerDragEnd += OnFingerDragEnd;

//上、下、左、右、四个方向的手势滑动

FingerGestures.OnFingerSwipe += OnFingerSwipe;

//连击事件 连续点击事件

FingerGestures.OnFingerTap += OnFingerTap;

//手指触摸屏幕中事件调用一下三个方法

FingerGestures.OnFingerStationaryBegin += OnFingerStationaryBegin;

FingerGestures.OnFingerStationary += OnFingerStationary;

FingerGestures.OnFingerStationaryEnd += OnFingerStationaryEnd;

//长按事件

FingerGestures.OnFingerLongPress += OnFingerLongPress;

}

void OnDisable()

{

//关闭时调用,这里销毁手势操作的事件

//和上面一样

FingerGestures.OnFingerDown -= OnFingerDown;

FingerGestures.OnFingerUp -= OnFingerUp;

FingerGestures.OnFingerDragBegin -= OnFingerDragBegin;

FingerGestures.OnFingerDragMove -= OnFingerDragMove;

FingerGestures.OnFingerDragEnd -= OnFingerDragEnd;

FingerGestures.OnFingerSwipe -= OnFingerSwipe;

FingerGestures.OnFingerTap -= OnFingerTap;

FingerGestures.OnFingerStationaryBegin -= OnFingerStationaryBegin;

FingerGestures.OnFingerStationary -= OnFingerStationary;

FingerGestures.OnFingerStationaryEnd -= OnFingerStationaryEnd;

FingerGestures.OnFingerLongPress -= OnFingerLongPress;

}

//按下时调用

void OnFingerDown( int fingerIndex, Vector2 fingerPos )

{

//int fingerIndex 是手指的ID 第一按下的手指就是 0 第二个按下的手指就是1。。。一次类推。

//Vector2 fingerPos 手指按下屏幕中的2D坐标

//将2D坐标转换成3D坐标

transform.position = GetWorldPos( fingerPos );

Debug.Log(" OnFingerDown ="  +fingerPos);

}

//抬起时调用

void OnFingerUp( int fingerIndex, Vector2 fingerPos, float timeHeldDown )

{

Debug.Log(" OnFingerUp ="  +fingerPos);

}

//开始滑动

void OnFingerDragBegin( int fingerIndex, Vector2 fingerPos, Vector2 startPos )

{

Debug.Log("OnFingerDragBegin fingerIndex =" + fingerIndex  + " fingerPos ="+fingerPos +"startPos =" +startPos);

}

//滑动结束

void OnFingerDragEnd( int fingerIndex, Vector2 fingerPos )

{

Debug.Log("OnFingerDragEnd fingerIndex =" + fingerIndex  + " fingerPos ="+fingerPos);

}

//滑动中

void OnFingerDragMove( int fingerIndex, Vector2 fingerPos, Vector2 delta )

{

transform.position = GetWorldPos( fingerPos );

Debug.Log(" OnFingerDragMove ="  +fingerPos);

}

//上下左右四方方向滑动手势操作

void OnFingerSwipe( int fingerIndex, Vector2 startPos, FingerGestures.SwipeDirection direction, float velocity )

{

//结果是 Up Down Left Right 四个方向

Debug.Log("OnFingerSwipe " + direction + " with finger " + fingerIndex);

}

//连续按下事件, tapCount就是当前连续按下几次

void OnFingerTap( int fingerIndex, Vector2 fingerPos, int tapCount )

{

Debug.Log("OnFingerTap " + tapCount + " times with finger " + fingerIndex);

}

//按下事件开始后调用,包括 开始 结束 持续中状态只到下次事件开始!

//OnFingerStationary 事件和  OnFingerDragMove 有一个区别。

//OnFingerStationary 是手指触摸在屏幕中的事件,而OnFingerDragMove是先触摸一下然后滑动的事件。

//如果你需要时时捕获手指触摸屏幕中的事件时 用OnFingerStationary 即可

void OnFingerStationaryBegin( int fingerIndex, Vector2 fingerPos )

{

Debug.Log("OnFingerStationaryBegin " + fingerPos + " times with finger " + fingerIndex);

}

void OnFingerStationary( int fingerIndex, Vector2 fingerPos, float elapsedTime )

{

Debug.Log("OnFingerStationary " + fingerPos + " times with finger " + fingerIndex);

}

void OnFingerStationaryEnd( int fingerIndex, Vector2 fingerPos, float elapsedTime )

{

Debug.Log("OnFingerStationaryEnd " + fingerPos + " times with finger " + fingerIndex);

}

//长按事件

void OnFingerLongPress( int fingerIndex, Vector2 fingerPos )

{

Debug.Log("OnFingerLongPress " + fingerPos );

}

//把Unity屏幕坐标换算成3D坐标

Vector3 GetWorldPos( Vector2 screenPos )

{

Camera mainCamera = Camera.main;

return mainCamera.ScreenToWorldPoint( new Vector3( screenPos.x, screenPos.y, Mathf.Abs( transform.position.z - mainCamera.transform.position.z ) ) );

}

}

如下图所示,用鼠标还是IOS Android触摸事件都能很好的在这个Cube上响应,大家把我的代码手动的打一遍就什么都明白了。

        上面的脚本,我们是直接绑定在立方体对象上来监听它,如果你想在别的脚本监听这个立方体对象的手势操作。只需调用如下方法即可。这个方法官方封装在了SampleBase中。因为官方的例子程序脚本是继承它的,所以子类就可以直接使用父类的方法。可是SampleBase会自动初始化一个SampleUI的脚本,不想初始化这个脚本的话直接用下面方法就行,原理就是通过射线我就不过多的解释了。传递鼠标或触摸的2D坐标即可得到触摸的3D模型对象。

1

2

3

4

5

6

7

8

9

10

11

// Return the GameObject at the given screen position, or null if no valid object was found

public static GameObject PickObject( Vector2 screenPos )

{

Ray ray = Camera.main.ScreenPointToRay( screenPos );

RaycastHit hit;

if( Physics.Raycast( ray, out hit ) )

return hit.collider.gameObject;

return null;

}

最后大家仔细看一下官方的FingerGestures.cs脚本,所有的手势操作的事件都在这里,包括单手操作事件、双手操作事件、鼠标操作事件。

插件以及源码下载地址:http://vdisk.weibo.com/s/ifRgG

雨松MOMO祝大家学习愉快,啦啦啦。

时间: 2024-12-27 21:37:51

FingerGestures研究院之初探Unity手势操作的相关文章

iOS开发——仿Clear纯手势操作的UITableView

前言 在Clear应用中,用户无需任何按钮,纯靠不同的手势就可以完成对ToDoItem的删除.完成.添加.移动.具体来说,功能上有左划删除,右划完成,点击编辑,下拉添加.捏合添加.长按移动.这里将这些功能实现并记录. 左划删除与右划完成 所谓的左右滑动,就是自定义一个cell然后在上面添加滑动手势.在处理方法中计算偏移量,如果滑动距离超过cell宽度一半,就删除它,或者是为文本添加删除线等来完成它:如果没有超过一半,那么就用动画把cell归位. 效果图如下: 关键代码如下: - (void)ha

手势操作

1.创建手势识别的实例 2.设置手势识别器的属性 3.将手势识别添加附加到指定的视图上 4.编写监听的方法 手势的状态: recognizer.state { // 常用的四个: UIGestureRecognizerStateBegan  // 开始 UIGestureRecognizerStateChanged// 改变 UIGestureRecognizerStateEnded // 结束 UIGestureRecognizerStateCancelled// 取消 } 获取这个状态时坐标

手势操作(单击手势,长按手势,策划手势)

1.策划手势操作 // // ViewController.m // 1-28策划手势 // // Created by ma c on 16/1/28. // Copyright © 2016年 bjsxt. All rights reserved. // #import "ViewController.h" @interface ViewController () @property (strong, nonatomic) UISwipeGestureRecognizer *rec

iOS手势操作,拖动,轻击,捏合,旋转,长按,自定义(http://www.cnblogs.com/huangjianwu/p/4675648.html)

1.UIGestureRecognizer 介绍 手势识别在 iOS 中非常重要,他极大地提高了移动设备的使用便捷性. iOS 系统在 3.2 以后,他提供了一些常用的手势(UIGestureRecognizer 的子类),开发者可以直接使用他们进行手势操作. UIPanGestureRecognizer(拖动) UIPinchGestureRecognizer(捏合) UIRotationGestureRecognizer(旋转) UITapGestureRecognizer(点按) UILo

Android学习指南之三十八:Android手势操作编程[转]

手势操作在我们使用智能设备的过程中奉献了不一样的体验.Android开发中必然会进行手势操作方面的编程.那么它的原理是怎样的呢?我们如何进行手势操作编程呢? 手势操作原理 首先,在Android系统中,每一次手势交互都会依照以下顺序执行. 1. 接触接触屏一刹那,触发一个MotionEvent事件. 2. 该事件被OnTouchListener监听,在其onTouch()方法里获得该MotionEvent对象. 3. 通过GestureDetector(手势识别器)转发次MotionEvent对

iOS-画板程序(手势操作无)

// // HMPaintView.h // 画板 // // Created by YaguangZhu on 15/9/10. // Copyright (c) 2015年 YaguangZhu. All rights reserved. // #import <UIKit/UIKit.h> @interface HMPaintView : UIView @property(nonatomic,assign)CGFloat width; @property(nonatomic,strong

自定义Imageview控件实现多种手势操作 (拖动、水平缩放、竖直缩放、等比例缩放、双击、长按)

项目中需要使用自定义控件的多种手势操作,之前在网上查阅资料的时候发现能找到的一般是只实现了其中的几种,这次就把我做的控件分享一下,人人为我,我为人人嘛,哈哈! 这个自定义控件实现的主要功能是控件的拖动和缩放(注意:不是对控件中的图片进行操作,话说很多帖子都把这两个混了),其中缩放可以按照三个方向进行,就是水平.竖直和等比例.双击操作只做了一个提示,长按加上了一个简单的弹出菜单. 抱歉的是没有足够的时间写详细注释了,如果跟你需要的功能相同就请直接调用,要是需要改代码就费点神自己读懂代码吧,看不懂的

Android的手势操作识别

摘要 首先,在Android系统中,每一次手势交互都会依照以下顺序执行. 1. 接触接触屏一刹那,触发一个MotionEvent事件. 2. 该事件被OnTouchListener监听,在其onTouch()方法里获得该MotionEvent对象. 3. 通过GestureDetector(手势识别器)转发次MotionEvent对象 首先,在Android系统中,每一次手势交互都会依照以下顺序执行. 1. 接触接触屏一刹那,触发一个MotionEvent事件. 2. 该事件被OnTouchLi

NoSql数据库初探-mongoDB读操作

MongoDB以文档的形式来存储数据,此结果类似于JSON键值对.文档类似于编程语言中将键和值关联起来的结构(比如:字典.Map.哈希表.关联数组).MongoDB文档是以BOSN文档的形式存在的.BSON是JSON附加了类型信息的一种二进制的表现形式. 文档中的字段可以是任何BSON类型,比如(文档类型.数组.文档数组) MongoDB将所有文档存储在collection中,collection是一组相关的文档集合,这一组文档集合拥有共同的索引,collection类似于关系型数据库中的表.