[Unity3D插件]FingerGesture的简单实用

当时的手机霸主诺基亚也曾辉煌过,但现在已经逐渐退出了人们的视线,因为它没有跟上潮流,IT世界发展瞬息万变,正因为它没有迎合时代发展,所以就逐渐被淘汰。在诺基亚时代,手机都是按键式的,但自从出现了Android系统,各种智能机都如雨后春笋般涌出,往大屏幕,无按键的趋势发展,所以各种手机应用只能用虚拟的,比如虚拟按钮,虚拟键盘,虚拟摇杆等等。继续之前做的小龙游戏的设计,然后就想到点击屏幕执行小龙飞跃的操作,然后就想到unity中FingerGesture插件。然后去搜索这个插件的使用,自然而言就搜到了Momo的博客,原来他老早就研究过了这个插件,我也就顺便学习一下,写一写学习心得!

关于Fingergesture的使用Momo的创建步骤和代码已经写得很详细了,关于插件的下载,他博客也写得很清楚,我这儿就谢谢我的个人理解和学习的一个过程!

接下来先看效果图,不要看就一个鼠标按下的操作,可以分解成很多过程,鼠标按下->鼠标按住->鼠标弹起,这很有当年开发单片机的感觉,有相似过程,单片机上的按钮会出发0-1高低电频,比如没按住是高电平,按下是低电平,一直按住就一直处于低电平的状态,然后LED灯管就能一直亮,然后再松开又回到高电平,LED灯灭,这电频变化的一瞬间有一个触发方式,边沿触发,呵呵,似乎是扯远了,但其实原理有类似的地方!

效果图

单击屏幕

提醒一下,我点击的左下角,看到屏幕的坐标原点其实是以左下角为原点的,这就是OpenGL坐标的原点规定!

双击屏幕

滑动手势

滑动的分解过程:按下->按下事件开始->按下中->滑动开始->滑动中->滑动结束->判断滑动方向

长按手势

代码(挂在Cube上,前提场景里要拖放FingerGesturesInitializer预设)

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(" 按下 = 坐标:"  +fingerPos);
    }

	//抬起时调用
	void OnFingerUp( int fingerIndex, Vector2 fingerPos, float timeHeldDown )
	{

		Debug.Log(" 抬起 = 坐标:"  +fingerPos  +"时间:"+timeHeldDown);
	}

	//开始滑动
	void OnFingerDragBegin( int fingerIndex, Vector2 fingerPos, Vector2 startPos )
    {
   	 	 Debug.Log("滑动开始 fingerIndex =" + fingerIndex  + " fingerPos ="+fingerPos +"startPos =" +startPos);
    }
	//滑动结束
	void OnFingerDragEnd( int fingerIndex, Vector2 fingerPos )
	{

	 	Debug.Log("滑动结束 fingerIndex =" + fingerIndex  + " fingerPos ="+fingerPos);
	}
	//滑动中
    void OnFingerDragMove( int fingerIndex, Vector2 fingerPos, Vector2 delta )
    {
           transform.position = GetWorldPos( fingerPos );
			Debug.Log(" 滑动中 ="  +fingerPos); 

    }
	//上下左右四方方向滑动手势操作
	void OnFingerSwipe( int fingerIndex, Vector2 startPos, FingerGestures.SwipeDirection direction, float velocity )
    {
		//结果是 Up Down Left Right 四个方向
		Debug.Log("滑动方向(Up/Down/Left/Right) :" + direction + " with finger " + fingerIndex);

    }

	//连续按下事件, tapCount就是当前连续按下几次
	void OnFingerTap( int fingerIndex, Vector2 fingerPos, int tapCount )
    {

        Debug.Log("连续按下次数: " + tapCount + " ,fingerindex: " + fingerIndex);

    }

	//按下事件开始后调用,包括 开始 结束 持续中状态只到下次事件开始!
	void OnFingerStationaryBegin( int fingerIndex, Vector2 fingerPos )
	{

		 Debug.Log("按下事件开始: " + fingerPos + " times with finger " + fingerIndex);
	}

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

		 Debug.Log("按下中: " + fingerPos + " times with finger " + fingerIndex);

	}

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

		 Debug.Log("按下结束:" + fingerPos + " times with finger " + fingerIndex);
	}

	//长按事件
	void OnFingerLongPress( int fingerIndex, Vector2 fingerPos )
	{

		Debug.Log("长按事件,位置: " + fingerPos + ",fingerIndex:"+fingerIndex );
	}

	//把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 ) ) );
    }
}

提示:OnEnable()和OnDisable()中注册和移除事件的方法,这里用到是C#语法委托和事件这两种语法,不明白的可以学习一下我之前写的关于这语法的文章,委托和事件(点击打开),委托(delegate)是一种类型,而事件(Event)是一种实例(委托中的一种),了解过C语言中函数指针的就应该明白这种用法的原理!

我们就通过F12来查看FingerGestures插件方法实现的原理,就拿FingerGestures.OnFingerDown+= OnFingerDown;这行代码来举例子:

首先FingerGestures是一个类,作者自定义的一个手势插件的类,真佩服能写插件的人,这才是真大牛!还是先看一下几个脚本的含义

嵌套定义得不可谓不复杂,呵呵!

FingerGestures.OnFingerDown,F12查看一下这个OnFingerDown是一个啥东东,会发现

    /// <summary>
    /// Event fired when a finger's OnDown event fires
    /// <seealso cref="Finger.OnDown"/>
    /// </summary>
    public static event FingerDownEventHandler OnFingerDown;

这其实就是一个事件的申明,看英文注释就知道是个Event,其实也看不出什么,重点是在这个FingerDownEventHandler,继续F12

    /// <summary>
    /// Delegate for the OnFingerDown event
    /// </summary>
    /// <param name="fingerIndex">0-based index uniquely indentifying a specific finger</param>
    /// <param name="fingerPos">Current position of the finger on the screen</param>
    public delegate void FingerDownEventHandler( int fingerIndex, Vector2 fingerPos );

这是一个委托类型的声明,两个参数什么意思写的很明显,不解释!

然后来看一下OnFingerDown这个我们自己自定义的方法,这用+=连接起来,其实就是多播委托的一种语法模式,一个委托能够执行多个方法,就像小明妈妈委托小明先去买菜,这是一个方法吧,然后买完菜去洗菜,然后做菜等等就是这种+=的形象解释。
当然结束的时候要将方法给-=掉,不然小明会生气了,心中不满,妈妈你总是老叫我做个不停呀,哈哈!这就是OnDisable()中为什么要-=的一个解释!

事件指向自己自定义的方法,但前提是参数必须要一样,就是你所委托的这个人要能完成你的事情,打个形象的比喻,你不能叫一个刚出生的小孩去打酱油吧,呵呵,就是这个道理!这下你感觉对委托和事件是一个什么关系应该更加深刻了吧!

参考资料:Momo研究院手势应用

==================== 迂者 丁小未 CSDN博客专栏=================

MyBlog:http://blog.csdn.net/dingxiaowei2013             MyQQ:1213250243

Unity QQ群:375151422,858550,63438968 
     cocos2dx QQ群:280818155

====================== 相互学习,共同进步 ===================

时间: 2024-09-13 07:01:04

[Unity3D插件]FingerGesture的简单实用的相关文章

jQuery EasyTabs.js简单实用Tabs插件

今天分享一个jQuery 简单实用Tabs插件-EasyTabs.js. 官方地址: http://os.alfajango.com/easytabs/#tabs1-html EasyTabs.js 是一个轻松实现 Tabs 组件的 jQuery 插件,支持多种不同外观. 可以采用自带的样式也可以自定义样式. jQuery 1.4.3+ 支持一下浏览器: Internet Explorer 7+ Firefox 4+ Chrome Safari Opera 11   示例代码:  代码如下 复制

教你一款极为简单实用的图表插件

这里介绍一款简单实用的图表插件,该图表插件是基于jquery和jquery的插件 gchart很容易实现的,而gchart插件是封装了google的图表api . 一  柱状图  (1) 竖状单行条形直方图效果图:   以上数据取自某个网站六个月份的用户注册量 .从以上数据可以看出,一二月份注册用户数为0,图表能够清晰对比每个月份用户注册量的变化. //月度报表        function MonthReport() {            $.ajax({                

简单实用的网页表单设计:设计用户喜欢的网页表单

文章描述:漫谈表单设计. 跟你所知的相反,布满漂亮的按钮.颜色和字体,再加上一大把jQuery插件的表单并不一定好用.真的,这么做只能(零散地)体现表单可用性的1/3. In this article, we'll provide practical guidelines that you can easily follow. These guidelines have been crafted from usability testing, field testing, website tra

Unity3D插件大全

[转]http://www.cnblogs.com/dingxiaowei/articles/3113974.html 200个插件免费分享约5G. [清单如下] 2D_Toolkit_1.51动画开发插件包 FingerGestures触摸插件 ORK_Okashi_RPG_Kit Unity3D的角色扮演游戏开发工具包 uScript视觉脚本工具UnityEasyMotion2D脚本插件 Playmaker_1.21可视化编程插件 RageSpline EZ GUI 2 GlyphDesig

ThinkPHP设置禁止百度等搜索引擎转码(简单实用)_php实例

网站在移动端的阅读不可避免的会遇到转码问题,作为国内搜索引擎老大百度,自然要做技术的领头人了,做了百度转码,有些网站经过转码之后达到了想要的结果,但是有些网站经过百度加工后就是不忍直视,很多内容出现了错乱,Joe的网站也出现了一些错位,于是Joe用了Wordpress插件MobilePress,经过一些汉化修改,感觉比百度的转码更适合自己. 方法1.HTTP Response中显式声明,Cache-control:no-transform. 在config.php 文件中加入 'HTTP_CAC

商城常用滚动的焦点图效果代码简单实用_jquery

这种商城的效果网上很多,但大多是插件,要么JS写的太过于复杂,对于学习的童鞋来说看起来比较费劲,这个看起来比较简单,也比较容易理解,各位童鞋需要的请围观,也欢迎各位评价,贴代码(为方便使用,代码复制即可用,无需另外添加东西): 复制代码 代码如下: <!doctype html> <html lang="en"> <head> <title>商城常用滚动的效果,简单实用</title> <script type=&quo

jquery实现简单实用的弹出层效果代码_jquery

本文实例讲述了jquery实现简单实用的弹出层效果.分享给大家供大家参考.具体如下: 目前来说,我还是喜欢这个自己改造的弹出层,在项目中用的也是这个.引入了新版的jquery插件,方框及文字都可以自己定义,非常方便,希望大家也喜欢这款弹出层,JavaScript在本例中也充分发挥了作用,对学习JS也是不错的参考. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-simple-alert-style-demo/ 具体代码如下: <!D

简单实用的Code Review工具

简单实用的Code Review工具 2009年8月4日  陈皓  17,947 人阅读     Code Review中文应该译作"代码审查"或是"代码评审",这是一个流程,当开发人员写好代码后,需要让别人来review一下他的代码,这是一种有效发现BUG的方法.由此,我们可以审查代码的风格.逻辑.思路--,找出问题,以及改进代码.因为这是代码刚刚出炉的时候,所以,这也是代码重构,代码调整,代码修改的最佳时候.所以,Code Review是编码实现中最最重要的一个

自己动手写的jquery分页控件(非常简单实用)_jquery

最近接了一个项目,其中有需求要用到jquery分页控件,上网也找到了需要分页控件,各种写法各种用法,都是很复杂,最终决定自己动手写一个jquery分页控件,全当是练练手了.写的不好,还请见谅,本分页控件在chrome测试过,其他的兼容性不知道怎么没时间测试呢.欢迎有同样需求的小伙伴采用,在使用过程发现有问题欢迎提出批评建议.   css: @charset "utf-"; * { margin:px; padding:px; font-family:"微软雅黑";