【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2172|回复: 0

[体感与外设] *转*FingerGesturesUnity手势操作

[复制链接]
发表于 2013-5-6 16:08:47 | 显示全部楼层 |阅读模式
本来还想自己写一个手势操作的教程,后来看了这个,觉得一切都可以省了:

昨天搬家,我被无情的从4楼请上了10楼。原因就是房东们为了争家产打官司,受伤的永远是我们这些打工的租房的码农,呵呵!结果就是我们两家做了一个调换把房子换了一下。东西太多了,真的好累啊,好累啊~~前几天有个朋友问我Unity手势操作,后来我还帮他做了一个例子。我觉得在Unity中用这个手势操作的插件会很方便。以前我只是知道FingerGestures,但是没有深入的用过,这两天学习了一下。真的很好用。

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

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


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

  1. using UnityEngine;
  2. using System.Collections;

  3. public class FingerEvent :  MonoBehaviour {

  4.     void OnEnable()
  5.     {
  6.             //启动时调用,这里开始注册手势操作的事件。

  7.             //按下事件: OnFingerDown就是按下事件监听的方法,这个名子可以由你来自定义。方法只能在本类中监听。下面所有的事件都一样!!!
  8.         FingerGestures.OnFingerDown += OnFingerDown;
  9.         //抬起事件
  10.                 FingerGestures.OnFingerUp += OnFingerUp;
  11.             //开始拖动事件
  12.             FingerGestures.OnFingerDragBegin += OnFingerDragBegin;
  13.         //拖动中事件...
  14.         FingerGestures.OnFingerDragMove += OnFingerDragMove;
  15.         //拖动结束事件
  16.         FingerGestures.OnFingerDragEnd += OnFingerDragEnd;
  17.                 //上、下、左、右、四个方向的手势滑动
  18.                 FingerGestures.OnFingerSwipe += OnFingerSwipe;
  19.                 //连击事件 连续点击事件
  20.                 FingerGestures.OnFingerTap += OnFingerTap;
  21.                 //手指触摸屏幕中事件调用一下三个方法
  22.                 FingerGestures.OnFingerStationaryBegin += OnFingerStationaryBegin;
  23.                 FingerGestures.OnFingerStationary += OnFingerStationary;
  24.                 FingerGestures.OnFingerStationaryEnd += OnFingerStationaryEnd;
  25.                 //长按事件
  26.                 FingerGestures.OnFingerLongPress += OnFingerLongPress;

  27.     }

  28.     void OnDisable()
  29.     {
  30.             //关闭时调用,这里销毁手势操作的事件
  31.             //和上面一样
  32.         FingerGestures.OnFingerDown -= OnFingerDown;
  33.                 FingerGestures.OnFingerUp -= OnFingerUp;
  34.                 FingerGestures.OnFingerDragBegin -= OnFingerDragBegin;
  35.         FingerGestures.OnFingerDragMove -= OnFingerDragMove;
  36.         FingerGestures.OnFingerDragEnd -= OnFingerDragEnd;
  37.                 FingerGestures.OnFingerSwipe -= OnFingerSwipe;
  38.                 FingerGestures.OnFingerTap -= OnFingerTap;
  39.                 FingerGestures.OnFingerStationaryBegin -= OnFingerStationaryBegin;
  40.                 FingerGestures.OnFingerStationary -= OnFingerStationary;
  41.                 FingerGestures.OnFingerStationaryEnd -= OnFingerStationaryEnd;
  42.                 FingerGestures.OnFingerLongPress -= OnFingerLongPress;
  43.     }

  44.     //按下时调用
  45.     void OnFingerDown( int fingerIndex, Vector2 fingerPos )
  46.     {
  47.                 //int fingerIndex 是手指的ID 第一按下的手指就是 0 第二个按下的手指就是1。。。一次类推。
  48.                 //Vector2 fingerPos 手指按下屏幕中的2D坐标

  49.                 //将2D坐标转换成3D坐标
  50.         transform.position = GetWorldPos( fingerPos );
  51.                 Debug.Log(" OnFingerDown ="  +fingerPos);
  52.     }

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

  56.                 Debug.Log(" OnFingerUp ="  +fingerPos);
  57.         }

  58.         //开始滑动
  59.         void OnFingerDragBegin( int fingerIndex, Vector2 fingerPos, Vector2 startPos )
  60.     {
  61.                      Debug.Log("OnFingerDragBegin fingerIndex =" + fingerIndex  + " fingerPos ="+fingerPos +"startPos =" +startPos);
  62.     }
  63.         //滑动结束
  64.         void OnFingerDragEnd( int fingerIndex, Vector2 fingerPos )
  65.         {

  66.                  Debug.Log("OnFingerDragEnd fingerIndex =" + fingerIndex  + " fingerPos ="+fingerPos);
  67.         }
  68.         //滑动中
  69.     void OnFingerDragMove( int fingerIndex, Vector2 fingerPos, Vector2 delta )
  70.     {
  71.            transform.position = GetWorldPos( fingerPos );
  72.                         Debug.Log(" OnFingerDragMove ="  +fingerPos);

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

  79.     }

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

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

  84.     }

  85.         //按下事件开始后调用,包括 开始 结束 持续中状态只到下次事件开始!
  86.          //OnFingerStationary 事件和  OnFingerDragMove 有一个区别。
  87.          //OnFingerStationary 是手指触摸在屏幕中的事件,而OnFingerDragMove是先触摸一下然后滑动的事件。
  88.          //如果你需要时时捕获手指触摸屏幕中的事件时 用OnFingerStationary 即可
  89.         void OnFingerStationaryBegin( int fingerIndex, Vector2 fingerPos )
  90.         {

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

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

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

  96.         }

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

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

  101.         //长按事件
  102.         void OnFingerLongPress( int fingerIndex, Vector2 fingerPos )
  103.         {

  104.                 Debug.Log("OnFingerLongPress " + fingerPos );
  105.         }

  106.         //把Unity屏幕坐标换算成3D坐标
  107.     Vector3 GetWorldPos( Vector2 screenPos )
  108.     {
  109.         Camera mainCamera = Camera.main;
  110.         return mainCamera.ScreenToWorldPoint( new Vector3( screenPos.x, screenPos.y, Mathf.Abs( transform.position.z - mainCamera.transform.position.z ) ) );
  111.     }
  112. }
复制代码

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



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

  1. // Return the GameObject at the given screen position, or null if no valid object was found
  2. public static GameObject PickObject( Vector2 screenPos )
  3. {
  4.     Ray ray = Camera.main.ScreenPointToRay( screenPos );
  5.     RaycastHit hit;

  6.     if( Physics.Raycast( ray, out hit ) )
  7.         return hit.collider.gameObject;

  8.     return null;
  9. }
复制代码
最后大家仔细看一下官方的FingerGestures.cs脚本,所有的手势操作的事件都在这里,包括单手操作事件、双手操作事件、鼠标操作事件。

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

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


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-6-17 02:03

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表